From 0e609cdac78fd04e0ad0054aee4d8c762c7423ca Mon Sep 17 00:00:00 2001 From: Anselme Date: Sat, 10 Dec 2016 16:02:17 +0100 Subject: [PATCH] fixed setting rigidbody's matrix with opengl matrix --- src/scene/meshnode.cpp | 20 +++++++++++++------- src/scene/meshnode.h | 7 +++++-- src/test/main.cpp | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/scene/meshnode.cpp b/src/scene/meshnode.cpp index 5109d83..2ed74e6 100644 --- a/src/scene/meshnode.cpp +++ b/src/scene/meshnode.cpp @@ -17,12 +17,21 @@ void MeshNode::update() m_geometry.modelMatrix = m_movement * m_geometry.modelMatrix; if(m_transformChanged) + { m_geometry.modelMatrix = m_parentTransform * m_transform; + if(m_rigidBody != nullptr) + { + btTransform transform; + transform.setFromOpenGLMatrix(glm::value_ptr(m_geometry.modelMatrix)); + m_rigidBody->setWorldTransform(transform); + m_rigidBody->setLinearVelocity(btVector3(0,0,0)); + } + } } btRigidBody* MeshNode::buildStaticCollider() { - bulletMesh = new btIndexedMesh(); + btIndexedMesh *bulletMesh = new btIndexedMesh(); Mesh *m = m_geometry.mesh; // vertices bulletMesh->m_numVertices = m->positions3D.size(); @@ -40,10 +49,7 @@ btRigidBody* MeshNode::buildStaticCollider() collisionShape->addIndexedMesh(*bulletMesh, PHY_INTEGER); btBvhTriangleMeshShape *shape = new btBvhTriangleMeshShape(collisionShape, false); - // positionning - btTransform transform; - transform.getOpenGLMatrix(glm::value_ptr(m_geometry.modelMatrix)); - btMotionState *motionState = new btDefaultMotionState(transform); - - return new btRigidBody(0, motionState, shape); + btMotionState *motionState = new btDefaultMotionState(); + m_rigidBody = new btRigidBody(0, motionState, shape); + return m_rigidBody; } diff --git a/src/scene/meshnode.h b/src/scene/meshnode.h index bb21532..413ef53 100644 --- a/src/scene/meshnode.h +++ b/src/scene/meshnode.h @@ -7,6 +7,7 @@ class btRigidBody; class btIndexedMesh; +class btRigidBody; /** * @brief The MeshNode class holds a mesh @@ -15,14 +16,16 @@ class btIndexedMesh; class MeshNode : public GraphicalNode { GeometryNode m_geometry; - btIndexedMesh *bulletMesh; + + // physics + btRigidBody *m_rigidBody; public: // temp glm::mat4 m_movement; glm::mat4 m_acceleration; - MeshNode(Mesh* mesh) : m_geometry(mesh, glm::mat4()), bulletMesh(nullptr) {} + MeshNode(Mesh* mesh) : m_geometry(mesh, glm::mat4()), m_rigidBody(nullptr) {} virtual void update(); diff --git a/src/test/main.cpp b/src/test/main.cpp index ebec44c..4c04a55 100644 --- a/src/test/main.cpp +++ b/src/test/main.cpp @@ -144,7 +144,7 @@ void generateTerrain(SceneTree *scene, btDiscreteDynamicsWorld *world) MeshNode *node = new MeshNode(chunk->mesh); node->setTransform(glm::translate(glm::scale(glm::mat4(), glm::vec3(2.f)), pos*8.f)); terrainContainer->addChild(node); - //world->addRigidBody(node->buildStaticCollider()); + world->addRigidBody(node->buildStaticCollider()); } } }