Page 1 of 1

Update opengl scene using glm

Posted: Sun Dec 25, 2016 11:38 am
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.

Re: Update opengl scene using glm

Posted: Sun Dec 25, 2016 7:46 pm
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.

Re: Update opengl scene using glm

Posted: Sun Dec 25, 2016 8:43 pm
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()));

Re: Update opengl scene using glm

Posted: Mon Dec 26, 2016 8:59 pm
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;
}