2014-02-25 7 views
2

현재 다음 코드를 사용하여 글 머리 기호로 된 강체에서 변환 행렬을 가져 와서 내 인스턴스에 적용합니다. 지금 당장은 렌더링 된 큐브의 변환을 업데이트하지 않는 것 같습니다.하지만 glm mat4를 만들 때 데이터가 손실된다고 생각하는 것입니다. 그래서 내 질문은 내가 매트릭스를 변환하는 데이터를 올바르게 변환 무엇입니까? 당신은 단지 순간, 당신 느슨한 취향/회전에서 변환 행렬을 만들 때Opengl 용 글 머리 물리학 변형 행렬 얻기

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

, 결국 확장 : 당신은 전체 변환하려면

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

, 당신은해야한다.

Bullet에서 반환 된 행렬은 월드 공간에 있습니다. 따라서 행렬이 노드의 부모 노드에 대한 상대 변환으로 저장된 장면 계층/그래프가있는 경우 행렬을 로컬로 변환해야 할 수도 있습니다 필요한 경우 공간.

0

셰이더를 사용하고 행렬을 직접 관리하는 경우 Bullet Physics에서 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