You wouldn't think this would be hard to find online, but go figure.

Thanks to Phaedrus for his explanations and...well, doing most of the work.

**Note: this matrix effectively yaws first, then pitches, then rolls. For the opposite order (and the one I ended up using), look below.**

[ | cos(pitch)*cos(yaw) | -sin(yaw)*cos(pitch) | sin(pitch) | ] |

cos(yaw)*sin(pitch)*sin(roll) + sin(yaw)*cos(roll) | -sin(yaw)*sin(pitch)*sin(roll) + cos(yaw)*cos(roll) | -cos(pitch)*sin(roll) | ||

-cos(yaw)*sin(pitch)*cos(roll) + sin(yaw)*sin(roll) | sin(yaw)*sin(pitch)*cos(roll) + cos(yaw)*sin(roll) | cos(pitch)*cos(roll) |

And to put it another way:

//Top row

rotation[0][0] = cos(pitch)*cos(yaw);

rotation[0][1] = -sin(yaw)*cos(pitch);

rotation[0][2] = sin(pitch);

//Middle row

rotation[1][0] = cos(yaw)*sin(pitch)*sin(roll) + sin(yaw)*cos(roll);

rotation[1][1] = -sin(yaw)*sin(pitch)*sin(roll) + cos(yaw)*cos(roll);

rotation[1][2] = -cos(pitch)*sin(roll);

//Bottom row

rotation[2][0] = -cos(yaw)*sin(pitch)*cos(roll) + sin(yaw)*sin(roll);

rotation[2][1] = sin(yaw)*sin(pitch)*cos(roll) + cos(yaw)*sin(roll);

rotation[2][2] = cos(pitch)*cos(roll);

**Note: this matrix effectively rolls first, then pitches, then yaws. This turned out to be the one I used for my system.**

[ | cos(pitch)*cos(yaw) | -sin(yaw)*cos(roll) + cos(yaw)*sin(pitch)*sin(roll) | sin(roll)*sin(yaw) + cos(yaw)*sin(pitch)*cos(roll) | ] |

cos(pitch)*sin(yaw) | cos(yaw)*cos(roll) + sin(pitch)*sin(yaw)*sin(roll) | -sin(roll)*cos(yaw) + sin(pitch)*sin(yaw)*cos(roll) | ||

-sin(pitch) | cos(pitch)*sin(roll) | cos(pitch)*cos(roll) |

//Top row

rotation[0][0] = cos(pitch)*cos(yaw);

rotation[0][1] = -sin(yaw)*cos(roll) + cos(yaw)*sin(pitch)*sin(roll);

rotation[0][2] = sin(roll)*sin(yaw) + cos(yaw)*sin(pitch)*cos(roll);

//Middle row

rotation[1][0] = cos(pitch)*sin(yaw);

rotation[1][1] = cos(yaw)*cos(roll) + sin(pitch)*sin(yaw)*sin(roll);

rotation[1][2] = -sin(roll)*cos(yaw) + sin(pitch)*sin(yaw)*cos(roll);

//Bottom row

rotation[2][0] = -sin(pitch);

rotation[2][1] = cos(pitch)*sin(roll);

rotation[2][2] = cos(pitch)*cos(roll);

## 3 comments:

OMG, thanks a lot... I've been searching this for a while... Also is great that you have in C syntax, thanks... and you're right, finding it online is quite hard

Is that with Z positive going up or down?

Z-positive going up.

Post a Comment