2012-04-15 16 views

Antwort

3

Ich würde das auf diese Weise tun:

A = V1xV2; //Cross product, this gives the axis of rotation 
    sin_angle = length(A)/(|V1| |V2|); //sine of the angle between vectors 

    angle = asin(sin_angle); 
    A_n = normalize(A); 

Jetzt können Sie eine Quaternion mit Winkel und a_n bauen.

q = (A_n.x i + A_n.y j + A_n.z k)*sin(angle/2) + cos(angle/2); 

Und these Formeln verwenden, um Ihren Euler-Winkel zu erhalten.

+0

so haben wir einzigartige Antwort? – MHF

+0

asin funktioniert nicht, da der Sinus zyklisch ist. – Joonazan

1

Brauchen Sie wirklich die Rotationswinkel oder ist es eine Rotationsmatrix, nach der Sie suchen? Wenn letzteres der Fall, können Sie es die Art und Weise tun es in OpenFOAM getan: http://github.com/OpenFOAM/OpenFOAM-2.1.x/blob/master/src/OpenFOAM/primitives/transform/transform.H#L45

Beachten Sie, dass in OpenFOAM für vector der & Bediener das innere Produkt bezeichnet, die ^ Bediener das Kreuzprodukt und * ist das äußere Produkt. Die sqr-Funktion berechnet die elementweisen Quadrate magSqr das Quadrat der Größe eines vector (d. H. v&v).

+0

nein ich brauche Drehwinkel – MHF

+0

Was ist VSMALL? – RyanCheu

+0

Eine sehr kleine Zahl, wenn sie für die doppelte Genauigkeit kompiliert wird, ist sie "1.0e-300", für Float ist sie "1.0e-150". –

Verwandte Themen