Pitch en Yaw roteren.
Pitch en Yaw roteren.
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?
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?
Re: Pitch en Yaw roteren.
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?
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?
Re: Pitch en Yaw roteren.
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
http://en.wikipedia.org/wiki/Rotation_matrix
Re: Pitch en Yaw roteren.
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.
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.
Re: Pitch en Yaw roteren.
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.
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.
Re: Pitch en Yaw roteren.
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.
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.
Re: Pitch en Yaw roteren.
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.
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.
Re: Pitch en Yaw roteren.
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
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
Re: Pitch en Yaw roteren.
Dit is niet onlogisch, er geldt immers datTigris schreef:Wel heb ik gevonden dat de lengte van a11, a12 en a13 1 is met een afweiking van ongeveer 0.5.
Lengte blijft immers behouden na rotatie.
Re: Pitch en Yaw roteren.
Ik vind het wel raar dat het vliegtuig standaard in de richting van de negatieve x-as vliegt.Tigris schreef: p = 0°, y = 0° en r = 0°:
http://i169.photobucket.com/albums/u208 ... /0_0_0.jpg
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?
Re: Pitch en Yaw roteren.
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.
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.
Re: Pitch en Yaw roteren.
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.
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.
Re: Pitch en Yaw roteren.
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:
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: