View more

View more

View more

Image of the Day Submit

IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

Can't get Quaternion Time Derivative to work?

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

4 replies to this topic

#1Super Llama  Members

Posted 23 February 2014 - 10:04 PM

Okay I'm sure this is a stupid question and I'm either completely misusing this formula or I'm missing something obvious, but I can't for the life of me figure out how I'm supposed to apply an angular velocity vector to an orientation quaternion, despite finding the Quaternion Time Derivative formula on multiple websites.

From what I've read, you can take an angular velocity vector like (0, 0, 3.14) for a 180 degree turn around the Z axis each second, then use these values in a non-normalized quaternion with zero w (0 0 3.14 0) -- I'm using xyzw representation for my quaternions -- and then you can multiply it by a delta time and an orientation quaternion and divide it by two, then add it to the orientation quaternion, and that should properly rotate the orientation quaternion according to the velocity. The formula looks like this: Q' = Q + 0.5t(W x Q).

Anyway, when I went to try it with a delta time of one second, it didn't seem to work. I take a unit quaternion with no rotation:

(0 0 0 1)

then multiply it by the angular velocity quaternion (with the original on the right, as per the formula)

(0 0 3.14 0) x (0 0 0 1) = (0 0 3.14 0)

then divide that by two

(0 0 1.57 0)

then add it to the original quaternion

(0 0 1.57 1)

but when I apply this rotation, it's 0, 0, -115 in euler angles, not 0, 0, 180.

So yeah... does anyone know what the problem is? I'd rather avoid having to build a quaternion from axis-angles each frame if I can, since that would require sin and cos which are more costly than just arithmetic, and everyone seems to say this formula works just as well, but I'm not seeing it.

It's a sofa! It's a camel! No! It's Super Llama!

#2Álvaro  Members

Posted 24 February 2014 - 03:02 AM

The derivative is a linear approximation, so a formula for the derivative of something only tells you how it changes in infinitesimally small periods of time. In your case, one second is too large of a step for the approximation to work.

Q' = (cos(t*|W|/2) + sin(t*|W|/2)*W/|W|) * Q

If you plug in Q=(0 0 0 1), W=(0 0 pi 0) and t=1, you get Q'=(0 0 1 0)

#3Super Llama  Members

Posted 24 February 2014 - 08:01 AM

OHH right, that makes perfect sense, thank you! I knew I was missing something obvious lol. I guess that means it technically works if you keep re-normalizing the quaternion and the game doesn't go longer than a few fractions of a second before updating the delta, but I guess using trig functions is inevitable if I want to do it right in all situations. I think I'll just construct a new unit quaternion from my angular velocity (since that only takes 5 math function calls) and multiply that onto it, unless there's a more efficient way I don't know about.

It's a sofa! It's a camel! No! It's Super Llama!

#4Álvaro  Members

Posted 24 February 2014 - 10:13 AM

Notice that my formula is exact only if the angular velocity is constant for the whole second. In your simulation that will probably not be true, and you'll have to split time into smaller steps. At that point the steps will probably be small enough that your original approximation is perfectly acceptable.

I should have mentioned in my previous post that if you make the approximations cos(epsilon) = 1 and sin(epsilon)=epsilon (which are good for small epsilon), my formula turns into the one you posted.

Edited by Álvaro, 24 February 2014 - 10:29 AM.

#5Super Llama  Members

Posted 24 February 2014 - 01:24 PM

Oh okay, I was wondering where that came from, that makes sense too. Thanks for the explanations, this is exactly what I needed to know.

It's a sofa! It's a camel! No! It's Super Llama!

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.