【发布时间】:2019-12-10 19:13:50
【问题描述】:
我正在尝试使用 MathGeoLib 实现 AABB/OOBB,因为使用 BB 易于操作(并且因为我想使用该库测试一些东西)。
问题在于引擎的对象转换是基于 glm 的,因为我们从 glm 开始(并且它们可以正常工作)但是当根据对象转换 OOBB 时,它不能很好地工作。
我基本上所做的是将游戏对象的平移、方向和比例传递给一个函数(我试图传递一个全局矩阵但它不起作用,它似乎是“添加”转换而不是设置它,并且我无法访问 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 矩阵(我已经看到这是他们“翻译”它们的方式),将其传递给 float*,然后用它构造 MathGeoLib 矩阵。我已经对其进行了调试,并且根据对象的值似乎是正确的,所以接下来我要做的实际上是转换 OOBB,然后将 AABB 包含在其中,如下所示:
m_OBB.Transform(mat);
m_AABB.SetNegativeInfinity(); //Sets AABB to "null"
m_AABB.Enclose(m_OBB);
最后的行为很奇怪,相信我,如果我说这是我最接近正确的,我已经测试了几天不同的东西,没有更好的方法(直接传递全局/本地矩阵,尝试不同的方式传递/构造转换数据,检查 glm-MathGLib 是否正确......)。它旋转但不绕自己的轴旋转,缩放让他发疯(尽管平移有效)。它的当前行为可以在这里看到:https://gfycat.com/quarrelsomefineduck(蓝色立方体是 AABB,绿色立方体是 OOBB)。
我在数学计算或数据传输方面做错了吗?
【问题讨论】:
-
您是否检查过矩阵是否以正确的顺序相乘?
-
我想是的...如果您参考我放在那里的代码,我正在这样做,因为我正在做有效的游戏对象转换(翻译旋转规模)
-
您的代码中的这些数字是什么(
passedPosition、passedRot、passedScale)?您计算位置的差异,但不计算其他值。您应该做的是获取对象变换并使用它来变换 AABB(在对象局部空间中)。看起来您多次(并且不一致)做同样的事情。 -
是游戏对象变换的变量,传递给要变换的OOBB。在位置上,我这样做是因为我已经看到它有效,但是通过计算旋转或缩放的差异是不够的,我已经尝试过了。实际上,我也是通过全局矩阵来设置OOBB变换,但它的工作原理是一样的:((其实和本地的一样)