Folosirea unghiurilor euler poate duce la un gol

Majoritatea programatorilor, pentru prima dată când încearcă să programeze mișcarea camerei, scrie despre acest cod:

Acest cod nu va funcționa sau cel puțin se va părea. că codul funcționează, dar numai pentru primele schimbări și, poate, pentru mici modificări în pitch și roll. Tocmai ați descoperit acest lucru - și de aceea ați citit acest articol - nu?







Deci, când convertiți aceste trei colțuri într-o matrice (sau când utilizați trei funcții glRotate), programul care formează matricea face unele ipoteze cu privire la ORDINAREA acestor trei rotații.

Imaginați-vă un avion. Trei rotații posibile de-a lungul axelor sunt numite "Rubrică", "Pitch" și "Roll". „Titlu“ - „panda“ este uneori numit „girație“ - dar mi place această alegere, pentru că în forma prescurtată a cuvântului este scris ca Y „iar acest lucru poate duce la confuzii cu denumirea de axa y Y - așa că am înlocuit cuvântul“ ambardeei "la" Rubrica ".

  • Modificările în rândul "Poziție" merg spre stânga sau spre dreapta.
  • Modificările în pitch ("pitch") determină scăderea nasului avionului, iar coada să se ridice (sau invers).
  • Modificările rolei ("Roll") ridică capătul unei aripi și coboară capătul celeilalte.

bine, asta e tot ce ar trebui să facă programul tău. De asemenea, suntem de acord că rotirile pozitive care se întâlnesc opus mișcării în sens orar vor fi pozitive și presupun că rotația zero corespunde unui zbor orizontal spre nord.

(Când folosiți trei unghiuri pentru a reprezenta rotația, ele sunt adesea denumite "unghiuri de rotire Euler" sau pur și simplu "Eulers"). Eu, de obicei, înregistrez unghiurile Euler ca (H, P, R)

De fapt, întreaga problemă este că atunci când combinați aceste trei rotații, trebuie să faceți acest lucru într-o ordine specială - puteți alege orice ordin - dar matematica întotdeauna vă obligă să faceți o alegere specifică. Asta este, puteți face viraje în această ordine: prima rola, apoi pitch și la sfârșitul răsuciți. Acum, să vedem ce se poate întâmpla cu o astfel de succesiune de operațiuni - și, din simplitate, luați în considerare doar rola și pasul.

(Dacă sunteți un dreapta, va fi mult mai ușor să urmați discuția dacă aruncați avionul în afara hârtiei.) Fold una acum! Oamenii stângaci au de obicei o imaginație spațială mai bună și pot să-și dea seama totul în mintea lor :-)

  1. Aeronava (în absența rotirii) este aliniată orizontal și îndreptată spre nord.
  2. Setați unghiurile Yaw / Tangier / Roll - (0,90,90) și vedeți ce se întâmplă:
  3. Avionul are acum o rolă de 90 de grade (astfel încât capătul drept al aripii să indice către cer și la stânga până la sol).
  4. . și pitch la 90 de grade (ceea ce înseamnă că nasul este ridicat UP). astfel încât nasul planului să îndrepte spre Vest, iar coada să fie îndreptată către Est, aripa dreaptă este încă îndreptată în sus, iar aripa stângă este îndreptată în jos.
  5. Acum, pilotul încearcă să alinieze planul orizontal prin rotirea mânerului joystick-ului spre dreapta - care, în conformitate cu codul de mai sus, ar trebui să reducă treptat rola aeronavei la zero. Vă puteți aștepta, ca rezultat, că nasul avionului va fi în continuare îndreptat spre Vest, dar în realitate, acum nasul avionului și a ruloului.
  6. Astfel, la sfârșitul acestei manevre, HPR - unghiurile se vor schimba de la (0,90,90) la (0,90,0) - care este poziția reală a avionului în spațiu?
  7. Să ne întoarcem la primul punct (planul este aliniat orizontal și îndreptat spre nord) și să determinăm poziția aeronavei dacă unghiurile HPR sunt date ca (0.90.0).
  8. Excelentă rolă zero stabilește poziția corectă a aripilor - aripa stângă este îndreptată spre vest și spre dreapta spre est. iar un pas de 90 de grade ridică nasul avionului spre cer!

Astfel, după reducerea unghiului de înclinare la zero, planul nostru, în loc să fie aliniate orizontal și zbura spre vest, este într-o poziție cu nasul, locasuri vertical! Din punct de vedere al pilotului, aeronava a avut rola de 90 de grade la stânga și zboară spre vest, iar după rotirea mânerului de joystick-ul spre dreapta pentru a se alinia cu planul orizontal, unghiul de girație este, de fapt schimbat. din cauza poziției zborului spre vest, avionul sa transformat în sus cu un nas proeminent ca nasul aeronavei se întoarse spre dreapta, iar coada - .. la stânga, care este, prin definiție, a făcut o „panda“. Încercarea de a echilibra avionul care încă zboară spre vest, schimbând unghiul lui Rysk (care funcționează ca un cârma) sau Tangage, nu reușește, de asemenea!







Acest tip de fenomen se numește adesea "blocarea gimbalelor" - prin numele efectului, care se întâmplă cu mecanisme reale care au trei balamale axiale (adică cu trei grade de libertate). Când axele celor două balamale sunt paralele una cu cealaltă, pierdeți un grad de libertate în acest sistem. Am o cheie de aprindere a mașinii, atât de flexibilă încât poate fi îndoită într-un unghi drept, dar în ciuda acestui fapt, ei pot porni cu ușurință motorul.

Adăugați un al treilea unghi de rotație și problema se poate opri.

Tocmai ai aflat despre toate astea. Dar ce trebuie făcut pentru a rezolva asta?

Trebuie să înțelegem la ce pas am făcut o greșeală. Problema este că prima schimbare în unghiul nominal sa întâmplat pentru a schimba unghiul de pas, și o scădere a băncii - „Alinierea“ - .. După ce situația care a apărut ca urmare a modificărilor inițiale unghiuri Kren + Pitch (adică nu doar restaurarea unghiului rolei inițial, care este, de fapt face cod naiv la începutul acestui document).

Ei bine, după ce am spus, este tentant să ne schimbăm codul după cum urmează:

fără îndoială, vă va părea. că acest cod funcționează - și din punct de vedere matematic este corect emis. Din moment ce păstrăm rotația "curentă" ca matrice, toate noțiunile de "ordine" a operațiilor înainte de formarea matricei au fost uitate - și dacă modificările unghiului sunt relativ mici (de obicei sunt), atunci acest cod va funcționa bine.

Cu toate acestea, există o problemă enervantă care rezultă din particularitățile matematicii computerizate - eroarea de rotunjire.

Când salvați o rotație ca unghiurile Euler, poate să apară o acumulare de erori mici care apar în rotunjire - dacă schimbați unghiul „patrulează“ cu 0.1 grade în fiecare dintre cele 3600 cadre, unghiul rezultat „panda“ nu va fi exact egală cu zero. Cu toate acestea, jucătorul care controlează scena cu ajutorul joystickului, nu va observa această eroare - acest lucru este destul de natural pentru oameni.

Din păcate, matricile 3x3 și 4x4 pot face mult mai mult decât rotația simplă. Cu alegerea corectă a valorilor elementelor matricei, poate produce o forfecare, întindere sau altceva. Asta se întâmplă atunci când multiplicați matricele de rotație: matricea începe treptat să producă o forfecare și întindere - după zece minute de funcționare de către joystick, veți începe să vedeți distorsiunile din scenă cu ochiul liber. Deoarece utilizatorul nu are control asupra codului, acesta nu are o modalitate de a corecta distorsiunea.

Există un mecanism de "corectare" a matricei. Dacă ați citit articolul meu „Asigurați-vă prieteni cu matricea“ ( „Matricele pot fi prieteni tăi“), atunci știi că poți normaliza cele trei rânduri de matrice și aliniați axa, astfel încât acestea să devină reciproc perpendiculare - și matricea ta va deveni din nou „un pur de rotație “. Faceți această operație în fiecare cadru sau cel puțin o dată în câteva cadre și nimeni nu va observa denaturări.

Acest lucru funcționează destul de bine, dar am observat că mulți oameni consideră că funcționează prost în sisteme în care rotația curentă este cunoscută doar ca o matrice. Dacă, de exemplu, doriți să creați o busolă, atunci trebuie să știți cum este orientată scena. Dar nu puteți obține această informație direct din matrice. Prin urmare, mulți oameni transformă matricea în colțurile lui Euler.

Dacă vei face ceva de genul ăsta, poți să faci așa:

Economisiți timp evitând normalizarea complicată a matricei, deoarece în fiecare cadru matricea este reconstruită din unghiurile Euler. Cu toate acestea, trebuie să luăm măsuri de precauție, deoarece atunci când convertim matricea la unghiurile Euler, obținem câteva valori "necunoscute" pentru unele orientări. Dacă poziția punctului de observare este rotită la 90 de grade de-a lungul unghiului de înclinare, atunci schimbările în unghiul de rulare și înclinare vor produce efectul corect. Prin urmare, deși rolul + pitch == constant, diferența dintre ele este fuzzy și se poate schimba complet de la cadru la cadru. Dacă utilizați doar unghiul de înclinare pentru a crea, să zicem, o busolă, așteptați apoi citiri incredibile la anumite unghiuri de Roll și Tanage. Acest lucru se întâmplă și în viața reală - deci nu vă faceți griji!

Pe lângă unghiurile Euler și transformările matricei, există o altă modalitate foarte convenabilă de a reprezenta rotațiile. Quaternion (așa cum se poate vedea prin nume) este un set de patru numere care pot fi reprezentate ca vector (X, Y, Z) a lungimii unității și unghiul de rotație în jurul acestui vector. Combinațiile de deplasări vectoriale și modificări de unghi codifică orice rotație posibilă.

Aceasta este aceeași idee ca și în cei patru parametri ai funcției glRotate (deși patru cifre quaternion, pentru comoditate în calcule, au un înțeles diferit).

Nu intenționez aici pentru a descrie în detaliu cuaternionii, dar ele sunt foarte ușor de utilizat, deoarece (cum ar fi matrice) codifica unghiuri indiferent de ordinea de intrare, și. în plus, (cum ar fi Euler unghiuri) pot codifica în mod unic de rotație, și, prin urmare, mult mai puțin sensibile la rotunjire erori (deși va trebui să verificați partea vectorului a Quaternion - lungimea trebuie să fie întotdeauna egală cu 1,0 - este mult mai ușor de făcut decât să normaliza matricea).

Alte articole pentru programatori.







Articole similare

Trimiteți-le prietenilor: