截至目前,我正在使用下面的代码从bullet中的刚体获取变换矩阵并将其应用于我的实例。现在它似乎没有更新我渲染的立方体的变换,我的第一个虽然是相信我在创建glm mat4时会丢失数据。所以我的问题是我是否正确地转换数据以转换我的矩阵?
for (int i = 0; i < WoodenCrateInstances.size(); i++)
{
btTransform t;
WoodenCrateInstances.at(i).asset->body->getMotionState()->getWorldTransform(t);
float mat[16];
t.getOpenGLMatrix(mat);
glm::vec3 vec = glm::make_vec3(mat);
WoodenCrateInstances.at(i).transform = glm::translate(glm::mat4(), vec);
}
答案 0 :(得分:4)
如果你想要完整转换,你应该这样做:
btTransform t;
// Get the transform from Bullet and into 't'
WoodenCrateInstances.at(i).asset->body->getMotionState()->getWorldTransform(t);
// Convert the btTransform into the GLM matrix using 'glm::value_ptr'
t.getOpenGLMatrix(glm::value_ptr(WoodenCrateInstances.at(i).transform));
由于您此刻只创建了一个平移矩阵,您将失去方向/旋转,并最终进行缩放。
另请注意,从Bullet返回的矩阵位于世界空间中,因此如果您有一个场景层次/图形,矩阵存储为相对变换到节点的父节点,您可能还希望将矩阵转换为局部空间,如果需要的话。
答案 1 :(得分:1)
要从Bullet Physics获取模型矩阵到OpenGL,请声明btScalar transform[16]
,然后查询身体运动状态。对于静态对象,请改用m_rigidBody->getWorldTransform()
,因为静态对象的动态状态未更新(在GitHub上创建的错误报告)。
通过调用第一个实用工具方法btScalar2mat4()
重新格式化模型矩阵,或者调用Bullet Physics方法transform.getOpenGLMatrix(btScalar *array)
,返回指向16个元素行主数组的指针,以传递给第二个实用工具方法{{1} }。
glm::mat4 array2mat4(const float* array)