PDA

View Full Version : Rotating 3D Vectors by Quaternions


Wahooney
04-11-2005, 08:11 AM
Hey guys,

Can anyone tell me exactly how you rotate a 3D vector by a quaternion?
I know it's something like:
v1 = qr * v * (inverse qr)
But how the hell do you multiply a 4D quaternion and a 3D vector?!?

Thanks in advance.

playmesumch00ns
04-11-2005, 09:39 AM
You don't. Quaternions are just a useful intermediary way of storing/updating the rotation. To actually perform that rotation on a 3-space you'll need to construct a transformation matrix from the quaternion, then apply that matrix to your vector.

This page (http://www.gamedev.net/reference/articles/article1095.asp) contains some good info on quaternions and their representation in 3D.

Wahooney
04-11-2005, 09:42 AM
But at the end of this (http://www.gamedev.net/reference/articles/article1691.asp) article (http://www.gamedev.net/reference/articles/article1691.asp) they say it is possible.

mbaas
04-11-2005, 11:34 AM
Before multiplying you have to "convert" the vector into a quaternion which is simply done by setting the imaginary part (x,y,z) to your vector and the real part w to 0.
See also http://mathworld.wolfram.com/Quaternion.html (equation 30).

- Matthias -

craigd
04-11-2005, 01:21 PM
You treat the vector you want to rotate as a quaternion with the scalar part 0.



#include <ImathVec.h>
#include <ImathQuat.h>

// rotate v by q
template <class T>
inline Imath::Vec3<T> rotate(const Imath::Vec3<T> &v, const Imath::Quat<T> &q) {
return (q*Imath::Quat<T>((T)0.0,v)*q.inverse()).v;
}

Wahooney
04-11-2005, 01:41 PM
Thanks craigd. :thumbsup:

CGTalk Moderation
04-11-2005, 01:41 PM
This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.