Update opengl scene using glm

Post Reply
paulgriffiths
Posts: 13
Joined: Sun Dec 25, 2016 11:31 am

Update opengl scene using glm

Post by paulgriffiths »

Hi I have a lot of rigidBodies and wish to update the opengl scene using glm.

how do I do this, I need to get at the rigidBodies's matrixes.

Code: Select all

glm::mat4 RotationMatrix = ?
glm::mat4 TranslationMatrix = ?
Thank you.
paulgriffiths
Posts: 13
Joined: Sun Dec 25, 2016 11:31 am

Re: Update opengl scene using glm

Post by paulgriffiths »

I'm currently using this code but the rotation is off.

Code: Select all

btTransform trans;
rigidbodie->getMotionState( )->getWorldTransform( trans );

glm::vec3 position(trans.getOrigin().getX(), trans.getOrigin().getY(), trans.getOrigin().getZ());
glm::mat4 TranslationMatrix = translate(mat4(), position);

glm::mat4 RotationMatrix = eulerAngleXYZ(trans.getRotation().getX(), trans.getRotation().getY(), trans.getRotation().getZ());
Please help.
paulgriffiths
Posts: 13
Joined: Sun Dec 25, 2016 11:31 am

Re: Update opengl scene using glm

Post by paulgriffiths »

Think this is correct but seems long winded.

Code: Select all

btTransform t;
rigidbodies[i]->getMotionState()->getWorldTransform(t); 

btQuaternion rotation = t.getRotation();
btVector3 transform = t.getOrigin();

glm::mat4 RotationMatrix = rotate(mat4(),rotation.getAngle(),vec3(rotation.getAxis().getX(), rotation.getAxis().getY(), rotation.getAxis().getZ()));
glm::mat4 TranslationMatrix = translate(mat4(), vec3(transform.getX(),transform.getY(),transform.getZ()));
User avatar
drleviathan
Posts: 849
Joined: Tue Sep 30, 2014 6:03 pm
Location: San Francisco

Re: Update opengl scene using glm

Post by drleviathan »

Here are some utils you're welcome to use for converting from Bullet to GLM and back again:

Code: Select all

glm::vec3 bulletToGlm(const btVector3& v) { return glm::vec3(v.getX(), v.getY(), v.getZ()); }

btVector3 glmToBullet(const glm::vec3& v) { return btVector3(v.x, v.y, v.z); }

glm::quat bulletToGlm(const btQuaternion& q) { return glm::quat(q.getW(), q.getX(), q.getY(), q.getZ()); }

btQuaternion glmToBullet(const glm::quat& q) { return btQuaternion(q.x, q.y, q.z, q.w); }

btMatrix3x3 glmToBullet(const glm::mat3& m) { return btMatrix3x3(m[0][0], m[1][0], m[2][0], m[0][1], m[1][1], m[2][1], m[0][2], m[1][2], m[2][2]); }

// btTransform does not contain a full 4x4 matrix, so this transform is lossy.
// Affine transformations are OK but perspective transformations are not.
btTransform glmToBullet(const glm::mat4& m)
{
    glm::mat3 m3(m);
    return btTransform(glmToBullet(m3), glmToBullet(glm::vec3(m[3][0], m[3][1], m[3][2])));
}

glm::mat4 bulletToGlm(const btTransform& t)
{
    glm::mat4 m(glm::mat4::_null);
    const btMatrix3x3& basis = t.getBasis();
    // rotation
    for (int r = 0; r < 3; r++)
    {
        for (int c = 0; c < 3; c++)
        {
            m[c][r] = basis[r][c];
        }
    }
    // traslation
    btVector3 origin = t.getOrigin();
    m[3][0] = origin.getX();
    m[3][1] = origin.getY();
    m[3][2] = origin.getZ();
    // unit scale
    m[0][3] = 0.0f;
    m[1][3] = 0.0f;
    m[2][3] = 0.0f;
    m[3][3] = 1.0f;
    return m;
}
Post Reply