3D Rotation Matrix deforms over time in Processing/Java?

You never want to cumulatively transform matrices. This will introduce error into your matrices and cause problems such as scaling or skewing the orthographic components The correct method would be to keep track of the cumulative pitch, yaw, roll angles. Then reconstruct the transformation matrix from those angles every update.

You never want to cumulatively transform matrices. This will introduce error into your matrices and cause problems such as scaling or skewing the orthographic components. The correct method would be to keep track of the cumulative pitch, yaw, roll angles.

Then reconstruct the transformation matrix from those angles every update.

If there is any chance: avoid multiplying rotation matrices. Keep track of the cumulative rotation and compute a new rotation matrix at each step. If it is impossible to avoid multiplying the rotation matrices then renormalize them (page 16).

It works for me just fine for more than 10 thousand multiplications. However, I suspect that it will not help you, numerical errors usually requires more than 2 steps to manifest themselves. It seems to me the reason for your problem is somewhere else.

Yaw, pitch and roll are not good for arbitrary rotations. Euler angles suffer from singularities and instability. Look at 38:25 (presentation of David Sachs) youtube.com/watch?v=C7JQ7Rpwn2k Good luck!

Thanks for the references, normalizing is also an interesing aspect keeps the things straight. For now I use PMatrix3D but going to dive deeper into these arbitrary rotation methodes – Muhneer Apr 28 at 7:29 OK, good luck anyhow! – Ali Apr 28 at 10:12.

As @don mentions, try to avoid cumulative transformations, as you can run into all sort of problems. Rotating by one axis at a time might lead you to Gimbal Lock issues. Try to do all rotations in one go.

Also, bare in mind that Processing comes with it's own Matrix3D class called PMatrix3D which has a rotate() method which takes an angle(in radians) and x,y,z values for the rotation axis. Here is an example function that would rotate a bunch of PVectors: PVector rotateVerts(PVector verts,float angle,PVector axis){ int vl = verts. Length; PVector clone = new PVectorvl; for(int I = 0; iRotate(angle,axis.

X,axis. Y,axis. Z); PVector dst = new PVectorvl; for(int I = 0; i.

Ah thats extremely helpfull, for some reason i'v ignored that class but it fixxes most of my problems. Perfect! – Muhneer Apr 28 at 7:27.

A shot in the dark: I don't know the rules or the name of the programming language you are using, but this procedure looks suspicious: void setIdentity() { this. Matrix = identityMatrix; } Are you sure your are taking a copy of identityMatrix? If it is just a reference you are copying, then identityMatrix will be modified by later operations, and soon nothing makes sense.

If there is any chance: avoid multiplying rotation matrices. Keep track of the cumulative rotation and compute a new rotation matrix at each step. If it is impossible to avoid multiplying the rotation matrices then renormalize them (page 16).

It works for me just fine for more than 10 thousand multiplications. However, I suspect that it will not help you, numerical errors usually requires more than 2 steps to manifest themselves.

Related Questions