2009-12-17 5 views
0

comme devoir, nous sommes en train d'écrire un logiciel de pixellisation. J'ai remarqué que ma mise en mémoire tampon ne fonctionnait pas aussi bien qu'elle le devrait, donc j'essaye de la déboguer en l'affichant à l'écran. (Le noir est proche, le blanc est loin).Mise en œuvre d'un tampon z dans un logiciel de pixellisation

Cependant, j'obtiens des valeurs particulières pour le z par vertex. C'est ce que j'utilise pour transformer les points:

float Camera::GetZToPoint(Vec3 a_Point) 
{ 
    Vec3 camera_new = (m_MatRotation * a_Point) - m_Position; 

    return (HALFSCREEN/tanf(_RadToDeg(60.f * 0.5f))/camera_new.z); 
} 

m_MatRotation est une matrice 3x3. La multiplier par un vecteur renvoie un vecteur transformé. J'obtiens des valeurs maximum et minimum entre 0 et x, où x est un nombre apparemment aléatoire.

Est-ce que je fais cette transformation non? Si oui, comment puis-je normaliser mes valeurs Z de sorte qu'il se situe entre deux points de réglage?

Merci d'avance.

Répondre

4

Pour normaliser les valeurs Z, vous devez définir un plan de délimitation proche et un plan de délimitation éloigné. Ensuite, vous normaliser Z tel que son 0 au plan proche et 1 au plan lointain.

Cependant, vous le feriez généralement après la projection. Il semble que votre dernière ligne soit l'endroit où la projection se produit.

Un certain nombre d'autres choses:

  • Vous calculer la multiplication complète matrice-vecteur, mais ne garder que le Z, cela est inutile. Vous devriez envisager de transformer les points et conserver toutes leurs coordonnées X, Y, Z;
  • Vous recalculez tanf() à chaque sommet, mais sa constante;
  • Je vous suggère d'utiliser une matrice de projection plutôt que le calcul tanf; Commencez avec une projection orthogonale simple, il sera plus facile de déboguer.
1

En supposant que vous voulez savoir z à un vertez, qui serait a_Point:

D'abord, vous voulez effectuer la traduction avant la rotation de sorte que vous effectuez la rotation autour de votre appareil photo et non l'origine de votre espace, qui peut être ailleurs. Deuxièmement, camera_new n'est pas un nom très bien choisi, car il représente les coordonnées de a_Point dans le nouveau référentiel par la position de votre caméra. Au lieu de cela, procédez comme suit:

Vec3 point_new = (m_MatRotation * (a_Point-m_Position)); 

Si cela ne fonctionne pas, vous aurez à le faire à la dure en créant une véritable matrice de projection qui effectue la translation, la rotation et la projection en une seule multiplication. Voici quelques tutoriels qui m'ont aidé à comprendre comment faire cela.

http://www.songho.ca/opengl/gl_projectionmatrix.html

codeguru.com/cpp/misc/misc/math/article.php/c10123/

Une fois que vous avez réussi à projeter des sommets sur l'écran d'une manière en perspective correcte, vous ll faut trouver un moyen de remplir l'espace entre eux, et trouver, pour chaque pixel rempli, ce qui est z. C'est une toute nouvelle histoire et l'article de Wikipédia sur la cartographie des textures m'a aidé à le faire.

en.wikipedia.org/wiki/Texture_mapping#Perspective_correctness

Désolé, je ne peux pas vous donner plus de liens, Stackoverflow ne me laisserait pas parce que je suis un nouvel utilisateur ...