转换引用对象的边界框?
Posted
技术标签:
【中文标题】转换引用对象的边界框?【英文标题】:Transforming Bounding Boxes referenced to an object? 【发布时间】: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变换,但它的工作原理是一样的:((其实和本地的一样)
【参考方案1】:
我仍然在寻找它,但后来一些朋友让我转向另一个方向,所以我最终通过存储初始对象的 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
【讨论】:
以上是关于转换引用对象的边界框?的主要内容,如果未能解决你的问题,请参考以下文章