Rotation relative to mesh center?

Started by
4 comments, last by Husbj 10 years, 2 months ago

I just noticed an anomaly with rotation axii when rendering meshes. Or well, it probably isn't an anomaly but rather me making incorrect assumptions.

Anyway, I have been able to reproduce the issue with this simple transform matrix:


XMMATRIX matOverride = XMMatrixIdentity();
matOverride *= XMMatrixScaling(1.0f, 1.0f, 1.0f);
matOverride *= XMMatrixRotationRollPitchYaw(0.0f, (float)D3DXToRadian(testAngle), 0.0f);
matOverride *= XMMatrixTranslation(0.0f, 0.0f, 0.0f);

testAngle is a float that is set to the fmod of itself increased by 90 degrees each second and 360 (to keep it in valid degree range, because that's just simpler to read in numeric print-outs than radians).

The scaling and translation parts are set just to ensure those didn't cause the offset by the way.

A mesh rendered with the above as its world matrix will rotate around it's translation. It is hard to describe but the whole thing swirls around as if being attached to a pole by its side. The effect I expected to see is that it would rotate in-place without seemingly moving as it currently does.

So for the question, is it supposed to work like this so that I would have to first offset the mesh half its negative size before applying the rotation to get it to just rotate "in place"? Or am I missing something?

Edit: actually, offsetting doesn't seem to work either... odd.

Thanks in advance,

Husbjörn

Advertisement

To rotate around the center of a mesh, the rotation matrix must come *before* the translation matrix. You don't tell us where you multiply in the translation matrix, however, so I can't for sure say that's your problem).

I know that, the order is the one listed in the snippet above (scale -> rotation -> translation). As you can see the translation part is (0, 0, 0) so it should remain at the point of origin (it's just there to prove a point, I get the same result even if I omit the translation matrix alltogether).

Other than the matrix derived above I just multiply it with my view and projection matrices; these are created using XMMatrixLookAtLH and XMMatrixPerspectiveFovLH, and send it on to my shader.

It sounds like your mesh is not centered around the origin, but you're rotating around the origin.

If you are translating the model in that order, you need to consider that the model itself is offset from its own origin.

L. Spiro

I restore Nintendo 64 video-game OST’s into HD! https://www.youtube.com/channel/UCCtX_wedtZ5BoyQBXEhnVZw/playlists?view=1&sort=lad&flow=grid

Oh sh... hah, seems you're right about that. Didn't even think about that, thanks!

This topic is closed to new replies.

Advertisement