为Opengl获取子弹物理变换矩阵

时间:2014-02-25 00:23:40

标签: opengl-3 glm-math bulletphysics

截至目前,我正在使用下面的代码从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);
}

2 个答案:

答案 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)