2016-10-26 4 views
2

Je veux lire est de 180 (en variante 0)Lecture des valeurs spécifiques de quaternion

Si la rotation y (rouleau) les valeurs suivantes à partir d'une unité quaternion https://docs.unity3d.com/ScriptReference/Quaternion.html

Si la rotation de x (hauteur) est de 180 (en variante, 0)

Quelle est la formule la plus performante pour obtenir la rotation z (lacet)?

J'ai trouvé cette formule en ligne pour obtenir l'axe z, est-ce le plus performant? z = qz/sqrt (1-qw * qw) http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/

+0

Par curiosité, quel est votre cas d'utilisation où vous devez déterminer mille angles ou plus à chaque image? – Serlite

+0

@Serlite 1000 fois par image était une exagération pour promouvoir la compréhension que la performance est très importante. J'en ai besoin pour la détection de collision non-axis axis où un collisionneur rectangulaire est impliqué. Pourquoi je fais un système supplémentaire au-dessus de Unity est pour une raison très spécifique et compliquée. – Martin

Répondre

0

La formule I posté était une conversion de quaternion en angle et en axe. Ce dont j'avais besoin, c'était quaternion à tous les angles. J'ai réalisé que je n'avais pas besoin d'angles x et y de toute façon.

trouvé un code en ligne et en forme pour répondre à mes besoins, ce ne convertit que l'angle z radians (1,3 ms 10K itérations)

public double GetZAngle(Quaternion q1) 
{ 
    double sqw = q1.w * (double)q1.w; 
    double sqx = q1.x * (double)q1.x; 
    double sqy = q1.y * (double)q1.y; 
    double sqz = q1.z * (double)q1.z; 
    double unit = sqx + sqy + sqz + sqw; // If normalized is one, otherwise is correction factor 
    double test = (double)q1.x * q1.y + (double)q1.z * q1.w; 
    if (test > 0.499 * unit) // Singularity at north pole 
     return Math.PI/2; 
    if (test < -0.499 * unit) // Singularity at south pole 
     return -Math.PI/2; 
    return Math.Asin(2 * test/unit); 
} 

Il n'y a pas de modèle clair pour distinguer simplement si x et y angles étaient 0, mais il y a un extrait de code ici montre comment les retrouver tous en radians (2.14 ms 10K itérations (plus rapide que Unms 3 ms)) http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/

1

Vous n'êtes pas d'utiliser la formule complexe afin de lire une valeur d'un quaternion. L'unité l'a déjà fait pour vous!

La façon la plus simple est de lire l'Euler Angle du Quaternion comme ceci:

Vector3 angle = rotation.eulerAngles; 

Le vous pouvez lire chaque rotation facilement angle.x ...

+0

Désolé aurait dû dire pourquoi je fais ça. Quaternion.eulerAngles est converti en une opération longue, c'est une opération coûteuse lorsqu'elle est effectuée jusqu'à 1000 fois tous les 1/60 de seconde (3 ms pour 10000 itérations). J'ai juste besoin de savoir si les axes x et y sont 180 et lire l'angle z. Lorsque vous avez seulement besoin d'un angle, tous sont convertis, ce qui est un défaut d'optimisation du côté de Unity en général parce qu'il n'est pas optimisé en 2D. – Martin

+0

@Martin Ho! n'était pas au courant de cela. Merci pour votre précision –