La façon gracieuse à manipuler est d'utiliser l'unité Quaternions. Un quaternion est un vecteur de 4 valeurs qui code une orientation dans l'espace 3D (pas une rotation comme certains articles l'affirment) et une quaternion unitaire est celle où la longueur du vecteur sqrt (x^2 + y^2 + z^2 + w^2) est 1,0. Il y a un ensemble d'opérations mathématiques pour travailler avec des quaternions qui sont analogues à l'utilisation de matrices pour encoder des rotations, avec le bonus supplémentaire que les quaternions ne peuvent jamais représenter une orientation dégénérée. Vous pouvez convertir librement des quaternions en une matrice 3x3 ou 4x4 lorsque vous avez besoin de transmettre le résultat à un GPU.
Votre problème est que, pendant que vous déplacez votre appareil photo, vous introduisez une petite torsion dans le sens de la montée de la caméra. En forçant la caméra à se recentrer sur le vecteur (0,1,0) à chaque itération, vous tournez la caméra et vous fixez l'orientation de la caméra pour rester sur la surface d'une sphère, mais lorsque votre caméra frappe le il n'y a pas de bonne direction pour appeler "up" et votre matrice devient singulière et vous donne des polygones de taille nulle (d'où l'écran noir). Les quaternions ont la capacité d'interpoler à travers ces pôles et de sortir de l'autre côté, vous laissant une matrice valide à tout moment. tout ce que vous avez à faire est de contrôler la "torsion". Pour mesurer cette torsion, vous devriez lire l'article de Ken Shoemake intitulé «Fiber Bundle Twist Reduction» dans le livre Graphics Gems 4. Il montre un bon moyen de mesurer cette torsion accumulée et comment l'enlever quand elle est offensive.
La solution que j'utilise actuellement est la suivante: i) initialement définir comme (0,1,0) ou quelque chose de approprié et stocker dans un vecteur ii) lorsque l'utilisateur change l'orientation de la caméra, tourner le vecteur stocké le définir comme le nouveau vecteur haut –