2008-10-31 8 views
1

Dans mon application Direct3D, la caméra peut être déplacée à l'aide de la souris ou des touches fléchées. Mais si je code dur (0,1,0) en tant que vecteur de direction vers le haut en LookAtLH, la trame disparaît à certaines orientations de la caméra.Définition dans la matrice de vue Direct3D lorsque la caméra est en mouvement constant

Je viens d'apprendre à la dure que lorsque vous regardez le long de l'axe des Y, (0,1,0) ne fonctionne plus comme la direction du haut (semble évident?). Je pense à changer de direction pour quelque chose d'autre pour chacun de ces cas spéciaux. Existe-t-il un moyen plus gracieux de gérer cela?

Répondre

4

En supposant que vous pouvez calculer un vecteur pointant vers l'avant (ce que vous regardez - votre position) et un vecteur pointant vers la droite (toujours sur le plan XZ sauf si vous pouvez rouler). Normaliser ces deux vecteurs, puis up est avant x droit (où x est produit croisé).

En général, vous pouvez insérer votre lacet, tangage et roulis dans une matrice de rotation et faire pivoter les vecteurs d'axe pour aller droit, haut et en avant, mais je suppose que c'est ce que vous utilisez LookAtLH à éviter.

Voir http://en.wikipedia.org/wiki/Rotation_matrix#The_3-dimensional_rotation_matricies

1

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.

+0

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 –