2014-02-25 40 views
2

截至目前,我正在使用下面的代码从子弹的刚体中获取转换矩阵并将其应用到我的实例。现在,它似乎不是更新我的渲染立方体的变换,我的第一个虽然是相信我创建glm mat4时丢失数据。所以我的问题是我正确地转换数据来转换我的矩阵?Opengl的子弹物理转换矩阵

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

超集也需要每个三角形:http://stackoverflow.com/questions/26948060/how-to-apply-bullet-physics-to-drawn-opengl-3d-shapes –

回答

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)); 

正如你只能创建的那一刻,你失去方向/旋转平移矩阵,并最终扩展。

另外请注意,从子弹返回的矩阵是在世界空间,所以如果你有一个场景层次/图表与矩阵存储为相对转换到节点的父节点,您可能还想要将矩阵转换为本地空间,如果需要的话。

0

要想从子弹物理模型矩阵OpenGL的,如果你使用的着色器和自行管理的矩阵,声明btScalar transform[16],然后查询的身体运动状态,并通过使用自定义的效用函数btScalar2glmMat4()格式化模型矩阵。

void Cube::update(glm::mat4 T) { 
    btScalar transform[16]; 

    if (m_motionState) 
     m_motionState->getModelMatrix(transform); 

     m_modelMatrix = btScalar2glmMat4(transform); 
     m_modelMatrix = T * m_modelMatrix; 

     // if (VERBOSE) printMat4(m_modelMatrix); 
} 

class MotionState : public btDefaultMotionState { 

    public: 
    MotionState(const btTransform &transform) : btDefaultMotionState(transform) {} 

    void getModelMatrix(btScalar* transform) { 
     btTransform modelMatrix; 

     getWorldTransform(modelMatrix); 
     modelMatrix.getOpenGLMatrix(transform); 
    } 
}; 

glm::mat4 btScalar2glmMat4(btScalar* matrix) { 
    return glm::mat4(
     matrix[0], matrix[1], matrix[2], matrix[3], 
     matrix[4], matrix[5], matrix[6], matrix[7], 
     matrix[8], matrix[9], matrix[10], matrix[11], 
     matrix[12], matrix[13], matrix[14], matrix[15]); 
} 
+0

虽然此代码段可解决问题,[包括解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高您的文章的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – Carpetsmoker

+0

@Carpetsmoker完成,感谢您的有用建议! – LastBlow