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/
Par curiosité, quel est votre cas d'utilisation où vous devez déterminer mille angles ou plus à chaque image? – Serlite
@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