变换包围对象的边界框?

问题描述 投票:0回答:1

由于易于使用BB进行操作(并且因为我想使用该库进行某些测试,所以我尝试使用MathGeoLib实现AABB / OOBB)。

问题是,因为我们从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)。

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

c++ opengl 3d glm-math
1个回答
0
投票

我仍然在寻找,但是后来有一个朋友让我转向另一个方向,所以我通过存储初始对象的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
© www.soinside.com 2019 - 2024. All rights reserved.