Permalänk
Medlem

3D-animering: interpolering

Hej!
Jag sitter här och försöker härma en OrientationInterpolator (i VRML, men så vitt jag har förstått så använder de flesta 3D-språk samma typ av interpolering vid rotationer?), men det vill sig inte riktigt.

Låt säga att jag har

key [ 0 1.0000]
keyValue [0 0 1 1.57, 1 0 0 1.57]

men vill lägga in ett extra stopp på vägen, mellan dessa, som inte förändrar rörelsen någonting. Vilka värden ska jag använda? Jag har försökt med kvaternioner, men det blir fortfarande ett litet hack när objektet rör sig till/från mellansteget. (Använder en slerp-funktion (http://www.mathworks.com/matlabcentral/files/11827/slerp.m) för att generera mellansteget.).

Någon som vet hur interpolatorn fungerar mer exakt, eller som har en idé om vad som kan vara fel?

(Jag ska skapa en tabell med alla koordinater för rörelsen istället för att använda interpolatorn, men jag har bara ursprungsrörelsen just som key och keyValues, så en omvandling krävs.)
---

Lösningen:
keyValues representerar en axel och vinkel, och för att hitta mellanliggande orienteringar användes kvaternioner.

1. Konvertera axis/angle till kvaternion:

q(1) = s(1) * sin(s(4)/2);
q(2) = s(2) * sin(s(4)/2);
q(3) = s(3) * sin(s(4)/2);
q(4) = cos(s(4)/2);

där q = [x y z w] är din kvaternion och s är axis/angle från keyValues-matrisen.

Konvertera två på varandra följande keyValues-rader. (s1->q1, s2->q2)

2. Använd slerp (t ex genom en redan befintlig funktion som finns på matlabs hemsida). Den beräknar en kvaternion q(t) som ligger mellan q1 och q2, med t = [0,1] och

q(t=0) = q1
q(t=1) = q2

Beroende på hur många stegs som behövs; räkna ut q för några olika t.

3. Konvertera tillbaka till axis/angle:

scale = sqrt(q(1)^2 + q(2)^2 + q(3)^2);
p(1) = q(1)/scale;
p(2) = q(2)/scale;
p(3) = q(3)/scale;
p(4) = 2 * acos(q(4));

p är nu nya axis/angle-representationer.

/josefin

Visa signatur

Jag vet inte riktigt vad ni försöker lära mig, men jag ska be att få vara av en fullständigt avvikande mening.