c++ - 转换引用对象的边界框?
问题描述
我正在尝试使用 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)。
我在数学计算或数据传输方面做错了吗?
解决方案
我仍然在寻找,但后来某个朋友让我转向另一个方向,所以我最终通过存储初始对象的 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
推荐阅读
- c# - 如何在程序启动时加载 NetCore 使用的所有 DLL
- c# - VSTO Outlook 加载项 - 检索发件人姓名以进行回复
- xml - 得到一个“AAPT:错误::字符串>。” 尝试运行我从 github 下载的项目时
- python - Amazon DeepAR 超参数调整错误
- sql - 为什么 current_date() 在 postgres sql 中产生错误
- python - 如何使用 Azure 计时器功能运行 python 脚本?
- autofilter - Toogle 按钮打开时过滤数据
- ruby-on-rails - Rails 6,我如何在 1 个项目中结合 devise、devise_ldap_authenticable 和 devise_jwt(包括 api 和 web)
- python - 使用“google_trans_new”Liberary 翻译 Python 中的数据框列
- vim - 与我的本地(ubuntu)PC 相比,Vi/Vim 在远程服务器上的行为完全不同