Quaternionen voor programmatie

Moderators: dirkwb, Xilvo

Reageer
Berichten: 88

Quaternionen voor programmatie

in de programmatiewereld kom je wel eens vaker voor wiskundige problemen te staan, zo moet je vaak uit bepaalde gegevens iets anders berekenen. ik heb nu het volgende voor en ik raak er niet wijs uit.

Gegeven:
  • Punt 1 (X,Y,Z)
  • Quaternion (A,B,C,D)
  • Afstand r
Wat ik moet bereiken is een punt 2 X,Y,Z dat vanuit het camera oogpunt op de bepaalde afstand van punt 1 ligt, op de vector die wordt uitgetekend door het Quaternion.

Ik weet ook dat een Quaternion in dit geval wat te veel informatie bevat, maar dit zijn nu de gegevens die ik heb en niets meer/anders.

Alvast bedankt
Handige websites



-Website 1

-Website2

Gebruikersavatar
Berichten: 2.609

Re: Quaternionen voor programmatie

Ik weet niet wat de 'vector uitgetekend door het Quaternion' is, maar stel dat je die kan vinden en dat is een vector rQ. Je van die vector een eenheidsvector maken door hem te delen door zijn norm: 1Q = rQ/||rQ||.

Punt 1 kan je schrijven als een vector r1.

Een punt op een afstand r, volgens de richting van rQ wordt dan gegeven door:

r1 + r.1Q

Ik weet ook niet precies wat je bedoelt met 'vanuit het camera oogpunt' aangezien er verder geen informatie over een camera is? Die afstand r die ik gebruik is dan gewoon in het gebruikte coördinatensysteem.

Berichten: 88

Re: Quaternionen voor programmatie

hopelijk maakt de figuur wat meer duidelijk...

de gegevens die ik binnenkrijg zijn de positie en orientatie van de rode bol, orientatie in vorm van quaternion, in een cartesish assenstelsel... hoe krijg ik dat 2de punt te pakken?
Bijlagen
move.png
move.png (4.05 KiB) 670 keer bekeken
Handige websites



-Website 1

-Website2

Gebruikersavatar
Berichten: 2.609

Re: Quaternionen voor programmatie

Als ik het goed begrijp is de situatie de volgende:

Het quaternion Q(w,a,b,c) bepaalt de orientatie van de bol als een rotatie van w rond de as (a,b,c).

Als je een assenstelsel in je bol plaatst dan kan je de eenheidsvectoren daarvan roteren volgens dat quaternion.

Stel dat voorkant van de bol volgens de x-richting ligt in dat coordinaten systeem. Dan kan je de transformatie van (1,0,0) gebruiken als de richtingsvector in mijn vorige post.

Die transformatie wordt blijkbaar gegeven door
\(\bar{v}^t = Q\bar{v}Q'\)
. Met Q' het conjugate van Q. (mintekens in de a,b,c componenten, de w component blijft dezelfde) (bron)

Berichten: 88

Re: Quaternionen voor programmatie

de xyz assen van de camera liggen als volgt: kijkend door de camera, X ligt naar links, y ligt naar boven, z ligt naar voor

wanneer de controller achter de bol verstopt zit, met de knoppen naar boven, is het quaternion wxyz (1,0,0,0)

dan is punt P1 (x1,y1,z1) en punt P2 (x1,y1,z1+r)

voor andere quaternionen gaat P2 iets zijn in de vorm van (x1+r*f(w,x,y,z), y1+r*g(w,x,y,z), z1+r*h(w,x,y,z))

nu is hetgeen ik nodig heb de functies f, g en h...

ik wou eerst proberen aan de hand van hints het zelf te vinden, maar blijkbaar lukt het me echt niet.

als je formules kan geven, graag ook de afleiding, zodat ik het misschien toch kan begrijpen...
Handige websites



-Website 1

-Website2

Gebruikersavatar
Berichten: 2.609

Re: Quaternionen voor programmatie

Ik heb hier zelf nooit mee gewerkt, de wiskunde erachter kan je onder andere hier terugvinden.

Ik vermoed dat je het volgende moet doen:

q is je quaternion. Je gebruikt de rotatie gegeven door het quaternion om de 1z vector te draaien. (0 rotatie komt in jouw uitleg overeen met de 1z richting)

Dat kan door die formule die ik in de vorige post gaf:
\(\vec{z}' = q \cdot (0,0,0,1) \cdot q^{-1}\)
.

(Zorg dat je die vermenigvuldiging en inversie juist implementeert.)

Gebruik die vector z' nu om P2 te vinden via:
\(\vec{P_2} = \vec{P_1} + r\cdot \vec{z}'\)
.

Doet dit wat je wil?

Berichten: 88

Re: Quaternionen voor programmatie

dit is ongeveer wat ik wilde bereiken... echter uit die vermenigvuldiging gaat een vector4 uit komen... en in de 2de formule heb je een vector3 nodig... welke onderdelen heb ik nodig en welk onderdeel kan ik laten vallen? of moet ik herrekenen?

ik ga er ook van uit dat q en q-1 vierkante matrices zijn volgens de vorm uit de figuur waardoor ik blijkbaar q*(0,0,1)*q-1moet doen...
Bijlagen
fc0105d480a903a798e28b4c99674a171.png
fc0105d480a903a798e28b4c99674a171.png (3.22 KiB) 668 keer bekeken
Handige websites



-Website 1

-Website2

Gebruikersavatar
Berichten: 2.609

Re: Quaternionen voor programmatie

stekkedecat schreef: ma 21 jan 2013, 11:06
dit is ongeveer wat ik wilde bereiken... echter uit die vermenigvuldiging gaat een vector4 uit komen...
Je moet inderdaad de vectoren ook in een quaternion stoppen om ermee te kunnen rekenen. Als je een vector (x,y,z) hebt, dan moet je die als (0,x,y,z) in de berekening stoppen.
stekkedecat schreef: ma 21 jan 2013, 11:06
ik ga er ook van uit dat q en q-1 vierkante matrices zijn volgens de vorm uit de figuur waardoor ik blijkbaar q*(0,0,1)*q-1moet doen...
Nee. Die q is het quaternion dat de rotatie bepaalt. Het hele idee is net dat je niet via de rotatiematrix gaat maar alles met quaternion vermenigvuldiging blijft doen.

Op de site die ik je eerder gaf staat volgende code:

Code: Selecteer alles


Code to transform a point:

double w; // real part of quaternion

double x; // imaginary i part of quaternion

double y; // imaginary j part of quaternion

double z; // imaginary k part of quaternion

sfvec3d transform(sfvec3d p1){

sfvec3d p2 = new sfvec3f();

p2.x = w*w*p1.x + 2*y*w*p1.z - 2*z*w*p1.y + x*x*p1.x + 2*y*x*p1.y + 2*z*x*p1.z - z*z*p1.x - y*y*p1.x;

p2.y = 2*x*y*p1.x + y*y*p1.y + 2*z*y*p1.z + 2*w*z*p1.x - z*z*p1.y + w*w*p1.y - 2*x*w*p1.z - x*x*p1.y;

p2.z = 2*x*z*p1.x + 2*y*z*p1.y + z*z*p1.z - 2*w*y*p1.x - y*y*p1.z + 2*w*x*p1.y - x*x*p1.z + w*w*p1.z;

return p2;

}

(bron) Zoek op deze site eens naar de tekst "As an example of using quaternions for 3D rotations, what is the quaternion to represent a 90 degree (PI/2 radian) rotation about the z axis:". In die gele kader tonen ze 3 manieren om de rotatie uit te voeren.

Berichten: 88

Re: Quaternionen voor programmatie

Na veel zwoegen om het te begrijpen heb ik de bovenstaande code genomen en daarin p1 vervangen door (0,0,1)

hieruit komt dan een vector die overeen komt met de vector tussen punt 1 en punt 2

deze vector heb ik dan vermenigvuldigd met S en opgeteld bij de balpositie, en daaruit kwam de positie van het eindpunt

na enkele tests bleek dit te zijn wat ik nodig had.

dan ben ik weer overgegaan op een poging om het te begrijpen en bovenstaande code lijkt me toch een matrixvermenigvuldiging te zijn van het punt P1(p1.x,p1.y,p1.z) met de matrix van het quaternion Q(w,x,y,z). de matrix zou dan dezelfde zijn als die in de figuur die ik eerder meegaf.
Handige websites



-Website 1

-Website2

Reageer