Een vector roteren in een 3D-ruimte

Ik ben een Android-project aan het maken in open g es dat de versnellingsmeter gebruikt om de verandering in specifieke assen te berekenen en mijn doel is om de bewegingsvector van mijn ruimtevaartuig-achtige object te roteren. Het probleem is dat ik de wiskunde achter rotatiematrices niet kan begrijpen. De standaard bewegingsvector is 0,1,0 , betekent +y, dus het object kijkt in het begin omhoog. en ik probeer de bewegingsvector te roteren, zodat ik het object kan verplaatsen waar het wijst. Ik kan rotatieveranderingen in de telefoon verzamelen. x-as: roteren[0], y-as: roteren[1], z-as: roteren[2]. Hoe kan ik mijn bewegingsvector roteren met behulp van de rotatiematrix?


Antwoord 1, autoriteit 100%

Als je een vector wilt roteren, moet je een zogenaamde rotatiematrixmaken.

Rotatie in 2D

Stel dat je een vector of een punt wilt roteren met θ, dan stelt trigonometriedat de nieuwe coördinaten zijn

   x' = x cos θ − y sin θ
    y' = x sin θ + y cos θ

Om dit te demonstreren, nemen we de hoofdassen X en Y; wanneer we de X-as 90 ° tegen de klok in draaien, zouden we moeten eindigen met de X-as getransformeerd in Y-as. Overweeg

   Unit vector along X axis = <1, 0>
    x' = 1 cos 90 − 0 sin 90 = 0
    y' = 1 sin 90 + 0 cos 90 = 1
    New coordinates of the vector, <x', y'> = <0, 1>  ⟹  Y-axis

Wanneer u dit begrijpt, wordt het eenvoudig maken van een matrix om dit te doen. Een matrix is ​​slechts een wiskundig hulpmiddel om dit in een comfortabele, gegeneraliseerde manier uit te voeren, zodat verschillende transformaties zoals rotatie, schaal en vertaling (bewegen) in één stap worden gecombineerd en uitgevoerd, met behulp van één gemeenschappelijke methode. Van lineaire algebra, om een ​​punt of vector in 2D te roteren, is de matrix die moet worden gebouwd

   |cos θ   −sin θ| |x| = |x cos θ − y sin θ| = |x'|
    |sin θ    cos θ| |y|   |x sin θ + y cos θ|   |y'|

Rotatie in 3D

Dat werkt in 2D, terwijl we in 3D moeten worden ingevoerd om de derde as te rekenen. Roteren van een vector rond de oorsprong (een punt) in 2D betekent eenvoudigweg draaien om de Z-as (een lijn) in 3D; Omdat we draaien rond de z-as, moet de coördinaat constant worden gehouden, d.w.z. 0 ° (rotatie gebeurt op het xy-vliegtuig in 3D). In 3D-roterende rond de Z-as zou

zijn

   |cos θ   −sin θ   0| |x|   |x cos θ − y sin θ|   |x'|
    |sin θ    cos θ   0| |y| = |x sin θ + y cos θ| = |y'|
    |  0       0      1| |z|   |        z        |   |z'|

rond de y-as zou

zijn

   | cos θ    0   sin θ| |x|   | x cos θ + z sin θ|   |x'|
    |   0      1       0| |y| = |         y        | = |y'|
    |−sin θ    0   cos θ| |z|   |−x sin θ + z cos θ|   |z'|

Rond de x-as zou

zijn

   |1     0           0| |x|   |        x        |   |x'|
    |0   cos θ    −sin θ| |y| = |y cos θ − z sin θ| = |y'|
    |0   sin θ     cos θ| |z|   |y sin θ + z cos θ|   |z'|

Opmerking 1 : Axis rond welke rotatie is gedaan, heeft geen sine- of cosinale elementen in de matrix.

Opmerking 2:deze methode voor het uitvoeren van rotaties volgt de Euler-hoekrotatiesysteem, dat eenvoudig te leren en te begrijpen is. Dit werkt prima voor 2D en voor eenvoudige 3D-cases; maar wanneer rotatie rond alle drie de assen tegelijkertijd moet worden uitgevoerd, zijn Euler-hoeken mogelijk niet voldoende vanwege een inherente tekortkoming in dit systeem dat zich manifesteert als Gimbal-slot. Mensen nemen in dergelijke situaties hun toevlucht tot Quaternion‘s, die geavanceerder zijn dan deze, maar geen last hebben van Gimbal vergrendelt bij correct gebruik.

Ik hoop dat dit de basisrotatie verduidelijkt.

Rotatie geen revolutie

De bovengenoemde matrices roteren een object op een afstand r = √(x² + y²) vanaf de oorsprong langs een cirkel met straal r; zoek poolcoördinatenop om te weten waarom. Deze rotatie zal zijn met betrekking tot de oorsprong van de wereldruimte, ook wel revolutiegenoemd. Gewoonlijk moeten we een object rond zijn eigen frame/spil draaien en niet rond de lokale oorsprong van de wereld. Dit kan ook worden gezien als een speciaal geval waarin r = 0. Omdat niet alle objecten zich in de wereldoorsprong bevinden, zal eenvoudig roteren met behulp van deze matrices niet het gewenste resultaat geven van roteren rond het eigen frame van het object. U zou eerst het object vertalen(verplaatsen) naar de wereldoorsprong (zodat het object oorsprong zou uitlijnen met die van de wereld, waardoor r = 0 wordt, de rotatie uitvoeren met een (of meer) van deze matrices en deze vervolgens weer terugvertalen naar de vorige locatie. De volgorde waarin de transformaties worden toegepast is van belang. Het combineren van meerdere transformaties wordt aaneenschakelingof compositiegenoemd.

Compositie

Ik raad je aan om te lezen over lineaire en affiene transformaties en hun samenstelling om meerdere transformaties in één keer uit te voeren, voordat je gaat spelen met transformaties in code. Zonder de fundamentele wiskunde erachter te begrijpen, zou het debuggen van transformaties een nachtmerrie zijn. Ik vond deze lesvideoeen zeer goede bron. Een andere bron is deze tutorial over transformatiesdie intuïtief is en illustreert de ideeën met animatie (voorbehoud: door mij geschreven!).

Rotatie rond willekeurige vector

Een product van de bovengenoemde matrices zou voldoende moeten zijn als je alleen rotaties rond de hoofdassen (X, Y of Z) nodig hebt, zoals in de geposte vraag. In veel situaties wilt u echter misschien rond een willekeurige as/vector roteren. De Rodrigues’-formule(ook wel axis-angle-formule genoemd) is een algemeen voorgeschreven oplossing voor dit probleem . Gebruik het echter alleen als u vastzit aan alleen vectoren en matrices. Als je Quaternions gebruikt, bouw dan gewoon een quaternion met de vereiste vector en hoek. Quaternions zijn een superieur alternatief voor het opslaan en manipuleren van 3D-rotaties; het is compact ensnel, b.v. het aaneenschakelen van twee rotaties in as-hoekweergave is vrij duur, matig met matrices maar goedkoop in quaternionen. Gewoonlijk worden alle rotatiemanipulaties gedaan met quaternionen en als laatste stap geconverteerd naar matrices bij het uploaden naar de rendering-pipeline. Zie Quternions begrijpenvoor een goede inleiding over quaternions.


Antwoord 2

Ik heb beredeneerd dat de X-component van je vector M*cos(o)cos(t)+x moet zijn,
Y-component moet M
cos(t)sin(o)+y zijn en de z-component moet Mcos(o)*sin(t)+z zijn waarbij M de grootte is van de vector, o is de rotatiehoek in het verticale vlak, t is de rotatiehoek in het horizontale vlak, x is de x-waarde van het rotatiecentrum, y is de y-waarde van het rotatiecentrum en z is de z-waarde van het rotatiecentrum. Vertel me alsjeblieft of dit voor jou werkt.

Other episodes