首页 > 解决方案 > 转换引用对象的边界框?

问题描述

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

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

我基本上做的是将游戏对象的平移、方向和比例传递给一个函数(我试图传递一个全局矩阵但它不起作用,它似乎是“添加”转换而不是设置它,我可以' t 访问 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(蓝色立方体是 AABBs,绿色立方体是 OOBBs)。

我在数学计算或数据传输方面做错了吗?

标签: c++opengl3dglm-math

解决方案


我仍然在寻找,但后来某个朋友让我转向另一个方向,所以我最终通过存储初始对象的 AABB 并将游戏对象的全局矩阵。然后,在函数内部,我使用了另一个 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

推荐阅读