Springen naar inhoud

Quaternionen voor programmatie


  • Log in om te kunnen reageren

#1

stekkedecat

    stekkedecat


  • >25 berichten
  • 88 berichten
  • Ervaren gebruiker

Geplaatst op 09 januari 2013 - 18:32

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

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 09 januari 2013 - 19:58

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.

#3

stekkedecat

    stekkedecat


  • >25 berichten
  • 88 berichten
  • Ervaren gebruiker

Geplaatst op 10 januari 2013 - 15:56

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?

Bijgevoegde miniaturen

  • move.png

Veranderd door stekkedecat, 10 januari 2013 - 16:08

Handige websites

-Website 1
-Website2

#4

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 10 januari 2013 - 17:27

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 LaTeX . Met Q' het conjugate van Q. (mintekens in de a,b,c componenten, de w component blijft dezelfde) (bron)

#5

stekkedecat

    stekkedecat


  • >25 berichten
  • 88 berichten
  • Ervaren gebruiker

Geplaatst op 13 januari 2013 - 17:56

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...

Veranderd door stekkedecat, 13 januari 2013 - 18:05

Handige websites

-Website 1
-Website2

#6

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 13 januari 2013 - 18:28

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: LaTeX .
(Zorg dat je die vermenigvuldiging en inversie juist implementeert.)

Gebruik die vector z' nu om P2 te vinden via: LaTeX .

Doet dit wat je wil?

#7

stekkedecat

    stekkedecat


  • >25 berichten
  • 88 berichten
  • Ervaren gebruiker

Geplaatst op 21 januari 2013 - 11:06

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-1 moet doen...

Bijgevoegde miniaturen

  • fc0105d480a903a798e28b4c99674a171.png

Veranderd door stekkedecat, 21 januari 2013 - 11:12

Handige websites

-Website 1
-Website2

#8

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 21 januari 2013 - 12:14

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.

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-1 moet 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 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.

#9

stekkedecat

    stekkedecat


  • >25 berichten
  • 88 berichten
  • Ervaren gebruiker

Geplaatst op 24 januari 2013 - 13:23

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





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures