转换引用对象的边界框?

Transforming Bounding Boxes referenced to an object?

我正在尝试使用 MathGeoLib 实现 AABBs/OOBBs,因为使用 BB 很容易操作(并且因为我想用该库测试一些东西)。

问题是引擎的对象转换是基于 glm 的,因为我们从 glm 开始(并且它们工作正常)但是当根据对象转换 OOBB 时,它工作得不是很好。

我基本上做的是将游戏对象的平移、方向和比例传递给一个函数(我试图传递一个全局矩阵但它不起作用,它似乎 'add' 转换而不是设置它,我无法访问 oobb 的矩阵)。该函数执行下一个:

glm::vec3 pos = passedPosition - OOBBPreviousPos;
glm::mat4 Transformation = glm::translate(glm::mat4(1.0f), pos) *
     glm::mat4_cast(passedRot) * glm::scale(glm::mat4(1.0f), passedScale);

glm::mat4 resMat = glm::transpose(Transformation);

math::float4x4 mat = math::float4x4::identity;
mat.Set(glm::value_ptr(resMat));

这基本上转置了 glm 矩阵(我已经看到它们是 'translating' 它们的方式),将其传递给 float*,然后用它构造 MathGeoLib 矩阵。我调试了它,根据对象,值似乎是正确的,所以我接下来要做的实际上是转换 OOBB,然后将 AABB 包围起来,将其放入内部,如下所示:

m_OBB.Transform(mat);
m_AABB.SetNegativeInfinity(); //Sets AABB to "null"
m_AABB.Enclose(m_OBB);

最后的行为很奇怪,相信我,如果我说那是我最接近正确的,我已经测试了几天不同的东西,但没有比这更好的了(通过 global/local 矩阵,尝试 passing/constructing 转换数据的不同方式,检查 glm-MathGLib 是否正确...)。它旋转但不绕着自己的轴旋转,缩放比例让他抓狂(尽管平移有效)。它的当前行为可以在这里看到:https://gfycat.com/quarrelsomefineduck(蓝色立方体是 AABB,绿色立方体是 OOBB)。

我是不是数学计算或数据传输有问题?

我一直在关注它,但后来一些朋友让我转向另一个方向,所以我最终通过存储初始对象的 AABB 并传递给提到的方法解决了它(或者更好地说:我 "worked-around it")函数游戏对象的全局矩阵。然后,在函数内部,我使用了另一个 MathGeoLib 函数来转换 OOBB。

该函数最终看起来像:

glm::mat4 resMat = glm::transpose(GlobalMatrixPassed);
math::float4x4 mat = math::float4x4::identity;
mat.Set(glm::value_ptr(resMat)); //"Translate" glm matrix passed into a MathGeoLib one

m_OOBB.SetFrom(m_InitialAABB);  //Set OOBB from the initial aabb
m_OOBB.Transform(mat); //Transform it
m_AABB.SetFrom(m_OOBB); //Set the AABB in function of the transformed OOBB