## Implementing a formula with quaternions

Moderator
Posts: 1,140
Joined: 2005.07
Post: #1
I haven't had any replies with my previous thread, so perhaps I will now that I can be more specific. I am trying to implement a formula with quaternions to find the acceleration to get to a certain place at a certain time, accelerating for a certain percentage of that time.

I have 2 times, t1 and t2, where t1 + t2 = t. (essentially, the time that it's accelerating and the time that it's "coasting" through with the current velocity) With the initial velocity, vi, and the final velocity, vf, and the distances d1 and d2 (which add up to the total d), I have the following relations:
vf = vi + a*t1
d1 = vi*t1 + 1/2*a*t1^2
d2 = vf*t2

After substituting, I derived the final formula for the acceleration:
a = (d - vi*t)/(t1*t - 1/2t1^2)

After testing the formula out in some simple situations, I'm pretty confident it's correct. The problem now, though, is getting it to work with quaternions. I resolve scalar multiplies by scaling the angle, and vector additions/subtractions with quaternion multiplications/conjugate multiplications. (I also try to make sure the ordering makes sense, but I can't be guaranteed with all of it) I already know my formulas for applying acceleration and velocity work. I also have a simple animation type that just uses a velocity without acceleration that works. However, something is wrong with the use of this formula.

To find d, I multiply target rotation by the conjugate of the current rotation. That part I know works, since it works with the simple velocity case. However, finding the acceleration has been problematic. I've tried everything I can think of: multiplying the conjugate of vi scaled by t and d, switching the 2, scaling each individually by the denominator and switching around the orders of the latter case. It works when vi is the identity quaternion, but doesn't otherwise. Can anybody shed some light on this situation? Perhaps there is a trick I'm missing, or something else I have to multiply with? (that doesn't affect vi when it's the identity)
Moderator
Posts: 1,140
Joined: 2005.07
Post: #2
I think I see my problem: this problem essentially consists of 2 parts: the part for d1, and the part for d2. In order to solve for a, I had to combine those parts and shuffle their constituents together, which is incompatible with the non-communitive aspects of quaternions. After fiddling around with the equations, I couldn't find any way to resolve it without preserving the absolute order. It looks like I'm going to have to try another set of equations to do the same thing. (unless, of course, any of you are able to find a solution, which I would be very happy to happen; I'm not holding my breath on the possibility, though. )
Moderator
Posts: 1,140
Joined: 2005.07
Post: #3
I tried to use Newton's Method with
vi*t1 + 1/2*a*t1^2 + vi*t2 + a*t1*t2 - d (aka: d1 + d2 - d) to solve for a, but with keeping the order the same. Unfortunately, I get the same result. Does anybody here know anything on this subject? Or will I need to continue monologging? The lack of information anywhere on this subject is really holding me back.
Sage
Posts: 1,403
Joined: 2005.07
Post: #4
There is a massive amount of information about quaternions, its just mostly pretty much useless..
All I can recommend is you read and understand this, http://www.geometrictools.com/Documentat...rnions.pdf

Sir, e^iÏ€ + 1 = 0, hence God exists; reply!
Moderator
Posts: 1,140
Joined: 2005.07
Post: #5
Thanks for the link. Looking at the derivative function, I think I'll try Newton's method again, but when taking the derivative I won't assume that it reaches 1 when it's just to the power of 1. Hopefully this will work, because I would hate to go through all this work and only have linear animations working.

Edit: why does every place use a different slash for that smilie?
Moderator
Posts: 522
Joined: 2002.04
Post: #6
Is the end goal just to interpolate between quaternions in different ways? Ease in, Ease out, Ease in and out..? That type of thing?

If you can linearly or spherically interpolate, you're 99.9% of the way there, then.

-Jon
Moderator
Posts: 1,140
Joined: 2005.07
Post: #7
It's more than just interpolating between quaternions smoothly. I want it so no matter the current velocity or position of the bone, it can smoothly go to the next one smoothly. That way, if it's currently moving and you suddenly put in another animation, it accelerates out of its current velocity instead of suddenly stopping in its current velocity, and interpolating to the direction. Also, it makes it a lot easier to implement things like ragdoll motion. (so, for example, I have a function to manually set the acceleration and velocity of certain bones) However, if there's a way to do this solely with interpolations, I'm all ears. (well, eyes )
Member
Posts: 446
Joined: 2002.09
Post: #8
>This article< describes "nlerp" rotations which are supposedly useful for IK. Tim Sweeny's got some code that might be helpful too.
Moderator
Posts: 1,140
Joined: 2005.07
Post: #9
Well, I think I'll give up on my original idea as impossible, at least with the amount of information I could find. Besides, I looked at the spline interpolations, and that's actually pretty much the kind of functionality I originally wanted. The only problem I can foresee is some potential jerkiness if I suddenly change what animation is next. Hopefully that will be doable by taking the last point in the last animation, the current point at the transition, and the next 2 points of the next animation.
Sage
Posts: 1,403
Joined: 2005.07
Post: #10
Its totally possible (now that I finally understand what you want to do), why not implement this kind of thing in 2D to get a hang of the maths? Then also get a firm grip on quaternion math by using them in some different test apps.

Sir, e^iÏ€ + 1 = 0, hence God exists; reply!
Moderator
Posts: 1,140
Joined: 2005.07
Post: #11
I could do it in 2D no problem, since there's only 1 angle that I need to worry about. However, with 3D angles (and 4D with quaternions), it gets much more complicated because rotations aren't commutative. (which is why it's pretty much a bad idea to add euler angles together; sometimes you get lucky, like I have when I added them before, but it's bitten me later when it didn't hold up) I have the formula that I need: d = vi*t1 + 1/2*a*t1^2 + vi*t2 + a*t1*t2, but the problem is I can't solve it for a without moving around the terms. If I move the terms around, I mess up the order of the rotations, which completely messes everything up. Now if you have a suggestion to solve this without re-ordering the terms, I'll certainly listen, but all my ideas haven't panned out.
Sage
Posts: 1,403
Joined: 2005.07
Post: #12
akb825 Wrote:d = vi*t1 + 1/2*a*t1^2 + vi*t2 + a*t1*t2

what are all the variables and in what form do you need the final equation?

Sir, e^iÏ€ + 1 = 0, hence God exists; reply!
Moderator
Posts: 1,140
Joined: 2005.07
Post: #13
d is the total rotation it will travel over the set time, vi is the initial angular velocity, a is the angular acceleration, and t1 and t2 are the time (t1 + t2 = total time). I know everything but a, which I'm solving for.

Edit: oh, and the equation that I said in my first post, a = (d - vi*t)/(t1*t - 1/2t1^2), is what I get if I do combine the terms. (the bottom can also be t1*t2 + 1/2*t1^2, due to the relation that t1 + t2 = t; I got the first equation by solving differently, but it gives the same answer)