Pitch en Yaw roteren.

Wiskunde is niet alleen een vak op school. Kom je ergens in de praktijk (bijvoorbeeld tijdens je werk) een wiskundig probleem tegen dan kun je hier om hulp vragen.
Plaats reactie
Tigris
Nieuw lid
Nieuw lid
Berichten: 11
Lid geworden op: 23 nov 2010, 22:20

Pitch en Yaw roteren.

Bericht door Tigris » 26 okt 2011, 16:29

Hallo,

Een speler heeft in een 3D spel twee hoeken pitch en yaw. Als de speler naar beneden kijkt dan is pitch 89°, als de speler naar voren kijkt dan loopt het aantal graden terug naar 0 en als de speler naar boven kijkt dan loop het aantal graden terug naar 271. yaw gaat 360° rond.

Nu stapt de speler in een vliegtuig en de pitch en de yaw worden van de speler overgenomen en toegepast op de vliegtuig. De vliegtuig bevat roll die door verschillende omstandigheden worden beïnvloed. Omdat de vliegtuig draait op roll en de speler niet moet pitch en yaw omgerekend worden of anders gezegd gedraaid worden. Als de vliegtuig op roll draait en de speler beweegt niet dan mag pitch en yaw voor de vliegtuig niet veranderen.

Hoe bereken ik pitch en yaw voor de vliegtuig die op roll gedraaid wordt?

Tigris
Nieuw lid
Nieuw lid
Berichten: 11
Lid geworden op: 23 nov 2010, 22:20

Re: Pitch en Yaw roteren.

Bericht door Tigris » 02 nov 2011, 18:21

Op deze manier laat ik de hoeken draaien:

RadRoll = rad(VliegtuigRoll)
CosRoll = cos(RadRoll)
SinRoll = sin(RadRoll)

VliegtuigPitch = SpelerPitch * CosRoll – SpelerYaw * SinRoll
VliegtuigYaw = SpelerYaw * CosRoll + SpelerPitch * SinRoll

Bron: viewtopic.php?f=9&t=4014

Het probleem van deze manier is dat VliegtuigPitch en VliegtuigYaw veranderen als VliegtuigRoll ook veranderd, tenzij SpelerPitch en SpelerYaw 0° zijn.

Op deze manier veranderd VliegtuigPitch en VliegtuigYaw alleen waneer SpelerPitch of SpelerYaw veranderd:

RadRoll = rad(VliegtuigRoll)
CosRoll = cos(RadRoll)
SinRoll = sin(RadRoll)

VliegtuigPitch = (SpelerPitch * CosRoll – SpelerYaw * SinRoll) + VorigePitch
VliegtuigYaw = (SpelerYaw * CosRoll + SpelerPitch * SinRoll) + VorigeYaw

SpelerPitch = 0
SpelerYaw = 0
VorigePitch = VliegtuigPitch
VorigeYaw = VliegtuigYaw

Op deze manier is het eerste probleem verholpen. Wanneer VliegtuigRoll -180, -90, 0, 90 of 180 graden is zijn er geen problemen.
Maar wanneer VliegtuigRoll bijvoorbeeld 45° is dan krijgen VliegtuigPitch en VliegtuigYaw hoeken die niet kloppen.
Kan iemand mij hiermee verder helpen?

Gebruikersavatar
wnvl
Vergevorderde
Vergevorderde
Berichten: 1490
Lid geworden op: 05 okt 2011, 16:30

Re: Pitch en Yaw roteren.

Bericht door wnvl » 02 nov 2011, 21:10

Je uitleg is niet zo eenvoudig te begrijpen, maar misschien kan onderstaande link helpen. Hier wordt uitgelegd hoe rotaties voorgesteld worden met matrices. Het 3D geval is hier van toepassing. Misschien kan je op basis hiervan je vraag nauwkeuriger formuleren.

http://en.wikipedia.org/wiki/Rotation_matrix

Tigris
Nieuw lid
Nieuw lid
Berichten: 11
Lid geworden op: 23 nov 2010, 22:20

Re: Pitch en Yaw roteren.

Bericht door Tigris » 03 nov 2011, 15:34

Ok, even mijn laatste bericht opnieuw.

Op deze manier laat ik de hoeken draaien:



Bron: viewtopic.php?f=9&t=4014

Het probleem van deze manier is dat Vpy veranderd als Vr ook veranderd, tenzij Spy 0 is.

Op deze manier veranderd Vpy alleen waneer Spy veranderd:







Op deze manier is het eerste probleem verholpen. Wanneer Vr -180, -90, 0, 90 of 180 graden is zijn er geen problemen.
Maar wanneer Vr bijvoorbeeld 45° is, dan kloppen de hoeken van Vpy niet.
Ik hoop dat het op deze manier correct genoteerd is.

Gebruikersavatar
wnvl
Vergevorderde
Vergevorderde
Berichten: 1490
Lid geworden op: 05 okt 2011, 16:30

Re: Pitch en Yaw roteren.

Bericht door wnvl » 03 nov 2011, 20:44

Tigris,

Nu ik eraan begonnen ben, wil ik het probleem wel graag oplossen. Maar ik geraak er nog niet aan uit.


Laat ons systematisch beginnen.

We hebben een vast xyz assenstelsel dat gekoppeld is aan de aarde (het aardoppervlak komt overeen met het vlak z=0). Laat ons veronderstellen dat het vliegtuig in een x'y'z' assenstelsel vliegt volgens de positieve x' as. Het gezichtspunt van de speler laat ik voorlopig nog buiten beschouwing. Hoe is dit x'y'z' geroteerd t.o.v. xyz assenstelsel? Deze rotatie kan voorgesteld worden door een 3x3 matrix.

Zie sectie "Rotations in three dimensions" in de link http://en.wikipedia.org/wiki/Rotation_matrix.

Als ik het goed heb gaat in die matrix "VliegtuigRoll" voorkomen.

Als we dit gevonden hebben, kunnen we daarna in eern volgende stap het gezichtspunt van de speler (spelerpitch/yaw) erbij betrekken.

Vliegrichting in het x'y'z' assenstelsel is

Dit x'y'z' assenstelsel wordt bekomen door het xyz assenstelsel te roteren over een hoek rond de x-as, een hoek rond de y-as en een hoek rond de z-as. Deze 3 hoeken hebben we nodig om de rotatie matrix voor te stellen. Waarschijnlijk zijn sommige van deze 3 hoeken 0. Kan je in alle geval deze 3 hoeken geven / berekenen, nadien is het eenvoudig om de rotatiematrix op te stellen.

Tigris
Nieuw lid
Nieuw lid
Berichten: 11
Lid geworden op: 23 nov 2010, 22:20

Re: Pitch en Yaw roteren.

Bericht door Tigris » 04 nov 2011, 01:53

Het is een rechts-handige rotatie matrix:



Bron: http://46dogs.blogspot.com/2011/04/righ ... x-for.html

p, y en r zijn in radialen, in mijn afgelopen posts waren ze in graden.

De rotatie matrix en hoeken van het vleigtuig zijn verkrijgbaar en aanpasbaar. Voor de speler is ook alle data te verkrijgen maar niet alles is aanpasbaar.

Gebruikersavatar
wnvl
Vergevorderde
Vergevorderde
Berichten: 1490
Lid geworden op: 05 okt 2011, 16:30

Re: Pitch en Yaw roteren.

Bericht door wnvl » 04 nov 2011, 02:25

OK.

Rv=Rotatiematrix vliegtuig=


de keuze voor deze matrix betekent dat yaw eerst, dan pitch en tot slot roll wordt uitgevoerd.

yv= yaw vliegtuig = rotatie rond z as tegen klok in
pv= pitch vliegtuig = rotatie rond y as tegen klok in
rv= roll vliegtuig = rotatie rond x as tegen klok in

xyz=vast assenstelsel
x'y'z'=roll(pitch(yaw xyz assenstelsel))

Ermee rekening houdend dat we in de x' richting vliegen en dat de z as loodrecht op het aardoppervlak staat.
Oorsprong van alle assenstelsels valt samen en ligt in het massacentrum van het vliegtuig.

Als nu een speler gekoppeld wordt aan het vliegtuig, gaat het x'y'z' assenstelsel geroteerd worden naar een x''y""z'' assenstelsel.

x''y''z''=yawspeler(pitchspeler(x'y'z' assenstelsel))
Rs=Rotatiematrix speler=


ys= yaw speler = rotatie rond z as tegen klok in
ps= pitch speler = rotatie rond y as tegen klok in
rs= roll speler = rotatie rond x as tegen klok in = 0

We hebben dus

x'y'z'=rollvliegtuigvoor(pitchvliegtuigvoor(yawvliegtuig xyz assenstelsel))
x''y''z''=pitchspeler(yawspeler(x'y'z' assenstelsel))

Vraag is: bereken yawvliegtuigna en pitchvliegtuigna zodat

x''y''z''=rollvliegtuigna(pitchvliegtuigna(yawvliegtuigna xyz assenstelsel))

De totale rotatiematrix=nieuwe vliegtuig rotatiematrix=



met T de transpose (kolommen vervangen door rijën).
Bovenstaande matrixvermenigvuldiging is wel gigantisch maar je moet alleen maar a11 en a12 berekenen.

a11=cos(pv)cos(yv)cos(ps)cos(ys)+(cos(yv)sin(pv)sin(rv)+sin(yv)cos(rv))sin(ys)+(cos(yv)sin(pv)cos(rv)-sin(yv)sin(rv))cos(ys)sin(ps)
a12=-cos(pv)cos(yv)cos(ps)sin(ys)+(cos(yv)sin(pv)sin(rv)+sin(yv)cos(rv))cos(ys)+(-cos(yv)sin(pv)cos(rv)+sin(yv)sin(rv))sin(ys)sin(ps)
a13=cos(pv)*cos(yv)*sin(ps)+(-cos(rv)*sin(pv)*cos(yv)+sin(rv)*sin(yv))*cos(ps)


Uit deze Rvnieuw kan nieuwe pitch en yaw van het vliegtuig bepaald worden.

yaw=-Arctan(a12/a11)
pitch=Arccos(a11/cos(yaw))=Arcsin(a13)

Ben je akkoord met bovenstaande redenering of zie ik het helemaal verkeerd?
Best ook eens nakijken of ik geen rekenfouten heb gemaakt. Heb de berekeningen met Maple gemaakt. Ben nieuwsgierig of het klopt.

Als je berekeningen wil maken voor een specifiek geval, kan ik dat wel doen aangezien ik de formules in Maple heb.

Tigris
Nieuw lid
Nieuw lid
Berichten: 11
Lid geworden op: 23 nov 2010, 22:20

Re: Pitch en Yaw roteren.

Bericht door Tigris » 07 nov 2011, 00:01

Ik heb de berekening toegepast maar het geeft niet de juiste hoeken, het tolt en schokt alle kanten op. Dit gebeurt ook als rv 0 is. Maar wat er fout gaat, is buiten mijn wiskundige vermogen. Wel heb ik gevonden dat de lengte van a11, a12 en a13 1 is met een afweiking van ongeveer 0.5.

Dit zijn screenshots van de normale situatie:
Lichtblauw-rood = x
Lichtblauw-groen = y
Lichtblauw-blauw = z



Wit-rood = a11, a12 en a13
Wit-groen = a21, a22 en a23
Wit-blauw = a31, a32 en a33

p = 0°, y = 0° en r = 0°:
http://i169.photobucket.com/albums/u208 ... /0_0_0.jpg
p = 45°, y = 0° en r = 0°:
http://i169.photobucket.com/albums/u208 ... 45_0_0.jpg
p = 45°, y = 45° en r = 0°:
http://i169.photobucket.com/albums/u208 ... 5_45_0.jpg
p = 45°, y = 45° en r = 45°:
http://i169.photobucket.com/albums/u208 ... _45_45.jpg
p = 0°, y = 45° en r = 45°:
http://i169.photobucket.com/albums/u208 ... _45_45.jpg
p = 0°, y = 0° en r = 45°:
http://i169.photobucket.com/albums/u208 ... 0_0_45.jpg

Gebruikersavatar
wnvl
Vergevorderde
Vergevorderde
Berichten: 1490
Lid geworden op: 05 okt 2011, 16:30

Re: Pitch en Yaw roteren.

Bericht door wnvl » 07 nov 2011, 00:24

Tigris schreef:Wel heb ik gevonden dat de lengte van a11, a12 en a13 1 is met een afweiking van ongeveer 0.5.
Dit is niet onlogisch, er geldt immers dat



Lengte blijft immers behouden na rotatie.

Gebruikersavatar
wnvl
Vergevorderde
Vergevorderde
Berichten: 1490
Lid geworden op: 05 okt 2011, 16:30

Re: Pitch en Yaw roteren.

Bericht door wnvl » 07 nov 2011, 00:33

Tigris schreef: p = 0°, y = 0° en r = 0°:
http://i169.photobucket.com/albums/u208 ... /0_0_0.jpg
Ik vind het wel raar dat het vliegtuig standaard in de richting van de negatieve x-as vliegt.
Is dat normaal? Ik vind het raar dat in het bawegend assenstelsel gekoppeld aan het vliegtuig de x-as ineens de andere kant uitwijst. Wel mooie plaatjes.

Op zich verandert dat wel niets. Is het mogelijk om met afbeeldingen/berekeningen iets te laten zien waar het misloopt?

Tigris
Nieuw lid
Nieuw lid
Berichten: 11
Lid geworden op: 23 nov 2010, 22:20

Re: Pitch en Yaw roteren.

Bericht door Tigris » 07 nov 2011, 18:44

Door een combinatie van meerdere factoren waren de afbeeldingen onjuist. Deze heb ik opnieuw ge-upload.
Daarnaast ben ik erachter gekomen dat de rotatie matrix anders in elkaar lijkt te steken.

Rechts-handige rotatie matrix:


Zo lijkt de rotatie matrix te zijn:


Het is in het ieder geval geen links-handige rotatie matrix maar ik weet niet of er nog een andere soort rotatie matrix is dan een rechts-handige rotatie matrix. Het is jammer dat ik niet kan zien hoe alle interne berekeningen in elkaar steken.

Gebruikersavatar
wnvl
Vergevorderde
Vergevorderde
Berichten: 1490
Lid geworden op: 05 okt 2011, 16:30

Re: Pitch en Yaw roteren.

Bericht door wnvl » 07 nov 2011, 19:28

Ik heb de nieuwe tekeningen bekeken.

Eigenlijk is het probleem dat het niet mogelijk is om het vast assenstelsel te roteren en zo het assenstelsel gekoppeld aan het vliegtuig te bekomen. De groene as is ook gespiegeld om de oorsprong.

Ik begrijp echt niet wat de idee is van de makers van het spel om die groene as te spiegelen.

Hier hebben we een duidelijke verklaring voor nodig, anders blijven we met dubbelzinnigheden zitten omtrent de definitie van r, y en p vanuit spelersstandpunt en de tekens (+/-) van de verschillende componenten in de transformatiematrix.

Tigris
Nieuw lid
Nieuw lid
Berichten: 11
Lid geworden op: 23 nov 2010, 22:20

Re: Pitch en Yaw roteren.

Bericht door Tigris » 07 nov 2011, 22:24

Bij de speler is de groene as ook rechts net zoals bij de vliegtuig.
De enige reden die ik zou kunnen bedenken dat de groene as rechts ligt:

Boven, midden en onder van de matrix worden als volgt genoemd:
a11, a12 en a13 = Forward normalized vector
a21, a22 en a23 = Right normalized vector (en niet left)
a31, a32 en a33 = Up normalized vector

Bronnen:
http://wiki.garrysmod.com/?title=Angle.Forward
http://wiki.garrysmod.com/?title=Angle.Right
http://wiki.garrysmod.com/?title=Angle.Up

omdat left niet zou passen in het rijtje.
Bij mijn vorige vraag op het forum draaide het ook vooral om deze vectoren:
viewtopic.php?f=9&t=4003

Ik denk niet dat het onmogelijk is, omdat de berekening waar ik mee begonnen ben in principe wel werkt zolang Vr 0, 90, 180 of 270 graden zou zijn.

Bereken de hoeken p en y van het vliegtuig:



Zet de hoeken van de speller weer op nul:


Plaats reactie