Alex Gardner
Alex Gardner

Reputation: 53

How to transform (translate, rotate, scale) object correctly using GLM or JOML matrices for modern OpenGL

I'm trying to implement transformation of object using matrices, but it works weird. Object center coordinates aren't (0,0,0). Translation and scaling looks good, but rotation is performed around (0,0,0) coordinate (not aroud center of object).

My Java code:

Matrix4f moveOriginMat = new Matrix4f();
Vector3d centroid = new Vector3f(pickedObject.getCentroid().getX() + translationMatrix.m30(), pickedObject.getCentroid().getY() + translationMatrix.m31(), pickedObject.getCentroid().getZ() + translationMatrix.m32());
moveOriginMat.translation(-(float)centroid.x * (scaleMat.m00() - 1), -(float)centroid.y * (scaleMat.m11() - 1), -(float)centroid.z * (scaleMat.m22() - 1));
modelMatrix.set(moveOriginMat);
modelMatrix.mul(scaleMat);
modelMatrix.mul(xRotationMatrix);
modelMatrix.mul(yRotationMatrix);
modelMatrix.mul(zRotationMatrix);
modelMatrix.mul(translationMatrix);

What am I doing wrong? I need to rotate an object around its own axes, not around the center of the world.

Upvotes: 1

Views: 1659

Answers (1)

Alex Gardner
Alex Gardner

Reputation: 53

Solution:

Matrix4f moveOriginMat = new Matrix4f();
Vector3d centroid = getPickedObjectLocalCentroid();
moveOriginMat.translation(-(float)centroid.x * (scaleMat.m00() - 1), -(float)centroid.y * (scaleMat.m11() - 1), -(float)centroid.z * (scaleMat.m22() - 1));
modelMatrix.set(moveOriginMat);
modelMatrix.mul(scaleMat);
modelMatrix.translate((float)centroid.x, (float)centroid.y, (float)centroid.z);
modelMatrix.mul(zRotationMatrix);
modelMatrix.mul(yRotationMatrix);
modelMatrix.mul(xRotationMatrix);
modelMatrix.translate(-(float)centroid.x, -(float)centroid.y, -(float)centroid.z);
modelMatrix.mul(translationMatrix);

I just needed to add translation to origin before rotation and translation back after this one. Also signes for translation made me confused.

Upvotes: 1

Related Questions