niet echt een programmeerprobleem, maar dit forum kwam volgens mij het dichst in de buurt, iig zullen hier mensen met de juiste kennis rondwandelen
(modjes, verplaats gerust als jullie em beter in een ander forum vinden passen)
ik heb een 3D wereld waarbij +Z = up.
ik heb een poppetje, dat standaard face forward naar -Y gericht staat, zijn linkerkant is dan gericht naar +X.
ik heb 3 variabelen met radialen waarmee het arme ventje geroteerd gaat worden: een voor de hoek die elke as moet worden geroteerd.
stel nu dat rotY = 0.25 * pi.
gevolg is dat het mannetje 45 graden naar rechts helt. (een beetje een onnatuurlijke houding, maar laten we stellen dattie net wat teveel heeft gedronken en naar rechts aan het omvallen is
)
so far so good, maar n00by als ik ben heb ik er ooit voor gekozen om een nare volgorde van rotatie te bedenken:
het quaternion gebeuren mag je vergeten, maar het komt er op neer:
gevolg is dat het mannetje nu andersom, richting +Y kijkt, maar hij helt nu (relatief tov. z'n eigen face-forward) niet meer naar rechts, maar naar links!
toegepast in mijn spel was dit eerder niet zo'n probleem: de Z rotatie deed ik via een hogergelegen 'node', waardoor eerst om die Z as geroteerd werd, en pas daarna over de X Y Z'en van mijn ventje-animatie. de animaties bouw ik in een zelfgemaakt animatieprogramma, waardoor de rare volgorde van roteren me niet zo opviel: ik zorgde er gewoon, op zicht, voor dat de animaties er natuurlijk uitzien, ongeacht welke vreemde X Y Z hoeken hier voor nodig waren. in die animaties worden overigens dus de 3 radialen - voor elke as 1 - opgeslagen.
nu ik m'n spel aan het uitbreiden ben wordt dit echter een probleem: vanwege $lang_verhaal wil ik de Z rotaties nu in dezelfde 'node', en om rare X/Y rotatie effecten te voorkomen moet de volgorde dus andersom (tenminste, dat leek me het meest logisch): eerst Z, dan Y, dan X. [zie *edit onderaan!]
probleem is nu dat ik al een huge database aan animaties heb gemaakt, die bij zo'n verandering allemaal zwaar broken gaan zijn
nu wil ik die animaties dus gaan omzetten, maar ik weet niet precies hoe ik de nieuwe hoeken bereken.
mijn vraag samengevat dus:
ik heb 3 radialen, rotX, rotY, rotZ, die ik met volgorde X Y Z toepas.
ik wil deze omzetten naar 3 nieuwe radialen die hetzelfde resultaat moeten opleveren als ik ze met volgorde Z Y X toepas.
hoe bereken ik deze 3 radialen?
ik hoop dat het zo een beetje duidelijk is, t blijft lastig om zoiets goed uit te leggen en zeker ook om het te begrijpen als je dit als buitenstaander leest. nu weet ik dat er hier de nodige mensen rondhangen die een stuk slimmer zijn dan ik, dus eej, ik dacht ik vraag het gewoon
sowieso bedankt voor het lezen, en hopelijk voor het antwoord!
** edit: eigenlijk zou het veel logischer zijn als die rotaties elk gewoon onafhankelijk van elkaar werden toegepast (dus dat de relatieve Y as niet door de X rotatie wordt aangepast etc) .. mits ik ga snappen hoe ik dat ga fixen qua quaternions, maar dat moet te doen zijn.
dan wordt de vraag: hoe zet ik mijn radialen om naar 3 nieuwe radialen die op deze onafhankelijke manier toegepast hetzelfde resultaat opleveren?
waar koop ik meer inzicht in dit soort ogenschijnlijk simpele dingen die ik maar lastig begrijp
ik heb een 3D wereld waarbij +Z = up.
ik heb een poppetje, dat standaard face forward naar -Y gericht staat, zijn linkerkant is dan gericht naar +X.
ik heb 3 variabelen met radialen waarmee het arme ventje geroteerd gaat worden: een voor de hoek die elke as moet worden geroteerd.
C++:
1
| radian rotX, rotY, rotZ; |
stel nu dat rotY = 0.25 * pi.
gevolg is dat het mannetje 45 graden naar rechts helt. (een beetje een onnatuurlijke houding, maar laten we stellen dattie net wat teveel heeft gedronken en naar rechts aan het omvallen is
so far so good, maar n00by als ik ben heb ik er ooit voor gekozen om een nare volgorde van rotatie te bedenken:
C++:
1
2
3
4
5
| Quaternion quat_rotX, quat_rotY, quat_rotZ; quat_rotX.SetAngleAxis(rotX, Vector3(1, 0, 0)); quat_rotY.SetAngleAxis(rotY, Vector3(0, 1, 0)); quat_rotZ.SetAngleAxis(rotZ, Vector3(0, 0, 1)); ventje->SetRotation(rotX * rotY * rotZ); |
het quaternion gebeuren mag je vergeten, maar het komt er op neer:
- eerst wordt het ventje om de X-as gedraaid: hij helt naar voren of naar achter
- dan wordt het resultaat om de Y-as gedraaid:
- als de X rotatie 0 was betekent dit een helling naar links/rechts, maar
- als de X rotatie bijvoorbeeld 1/2 * pi was (ventje achterover 'liggend') betekent het een draaing over de absolute Z-as, immers, de relatieve Y-as was al geroteerd door de X rotatie.
- daarna hetzelfde verhaal om de Z-as.
gevolg is dat het mannetje nu andersom, richting +Y kijkt, maar hij helt nu (relatief tov. z'n eigen face-forward) niet meer naar rechts, maar naar links!
toegepast in mijn spel was dit eerder niet zo'n probleem: de Z rotatie deed ik via een hogergelegen 'node', waardoor eerst om die Z as geroteerd werd, en pas daarna over de X Y Z'en van mijn ventje-animatie. de animaties bouw ik in een zelfgemaakt animatieprogramma, waardoor de rare volgorde van roteren me niet zo opviel: ik zorgde er gewoon, op zicht, voor dat de animaties er natuurlijk uitzien, ongeacht welke vreemde X Y Z hoeken hier voor nodig waren. in die animaties worden overigens dus de 3 radialen - voor elke as 1 - opgeslagen.
nu ik m'n spel aan het uitbreiden ben wordt dit echter een probleem: vanwege $lang_verhaal wil ik de Z rotaties nu in dezelfde 'node', en om rare X/Y rotatie effecten te voorkomen moet de volgorde dus andersom (tenminste, dat leek me het meest logisch): eerst Z, dan Y, dan X. [zie *edit onderaan!]
probleem is nu dat ik al een huge database aan animaties heb gemaakt, die bij zo'n verandering allemaal zwaar broken gaan zijn
mijn vraag samengevat dus:
ik heb 3 radialen, rotX, rotY, rotZ, die ik met volgorde X Y Z toepas.
ik wil deze omzetten naar 3 nieuwe radialen die hetzelfde resultaat moeten opleveren als ik ze met volgorde Z Y X toepas.
hoe bereken ik deze 3 radialen?
ik hoop dat het zo een beetje duidelijk is, t blijft lastig om zoiets goed uit te leggen en zeker ook om het te begrijpen als je dit als buitenstaander leest. nu weet ik dat er hier de nodige mensen rondhangen die een stuk slimmer zijn dan ik, dus eej, ik dacht ik vraag het gewoon
sowieso bedankt voor het lezen, en hopelijk voor het antwoord!
** edit: eigenlijk zou het veel logischer zijn als die rotaties elk gewoon onafhankelijk van elkaar werden toegepast (dus dat de relatieve Y as niet door de X rotatie wordt aangepast etc) .. mits ik ga snappen hoe ik dat ga fixen qua quaternions, maar dat moet te doen zijn.
dan wordt de vraag: hoe zet ik mijn radialen om naar 3 nieuwe radialen die op deze onafhankelijke manier toegepast hetzelfde resultaat opleveren?
waar koop ik meer inzicht in dit soort ogenschijnlijk simpele dingen die ik maar lastig begrijp
[ Voor 7% gewijzigd door Verwijderd op 02-04-2010 23:51 ]