Question

Je travaille sur un problème de vision par ordinateur qui doit être rendue un modèle 3D à l'aide d'une caméra calibrée. J'écris une fonction qui casse la matrice de la caméra calibrée dans une matrice modelview et une matrice de projection, mais j'ai rencontré un phénomène intéressant dans opengl qui défie toute explication (au moins par moi).

La description courte est que les résultats de la négation de la matrice de projection en rien être rendu (au moins dans mon expérience). Je suppose que la multiplication de la matrice de projection par un scalaire serait sans effet, parce qu'il transforme des coordonnées homogènes, qui ne sont pas affectées par l'extension.

Ci-dessous mon raisonnement pourquoi je trouve cela inattendu; peut-être quelqu'un peut indiquer où mon raisonnement est erroné.

Imaginez la matrice de projection en perspective suivante, ce qui donne des résultats corrects:

    [ a b c 0 ]
P = [ 0 d e 0 ]
    [ 0 0 f g ]
    [ 0 0 h 0 ]

multipliant par les coordonnées de la caméra donne les coordonnées de clip homogène:

[x_c]   [ a b c 0 ]   [X_e]
[y_c] = [ 0 d e 0 ] * [Y_e]
[z_c]   [ 0 0 f g ]   [Z_e]
[w_c]   [ 0 0 h 0 ]   [W_e]

Enfin, pour obtenir les coordonnées du dispositif normalisé, on divise x_c, y_c et z_c par w_c:

[x_n]   [x_c/w_c]
[y_n] = [y_c/w_c]
[z_n]   [z_c/w_c]

Maintenant, si on nie P, les coordonnées de clip résultant doit être réduit à néant, mais étant donné qu'ils sont des coordonnées homogènes, de multiplication par un scalaire (par exemple -1) ne doit pas avoir d'effet sur les coordonnées de l'appareil normalisées résultantes. Cependant, dans openGl, annihilant les résultats P en rien être rendu. Je peux multiplier P par un scalaire non négatif et obtenir les mêmes résultats rendus exacts, mais dès que je multiplie par un scalaire négatif, rien ne rend. Qu'est-ce qui se passe ici ??

Merci!

Était-ce utile?

La solution

Eh bien, l'essentiel de celui-ci est que le test se fait par découpage:

-w_c < x_c < w_c
-w_c < y_c < w_c
-w_c < z_c < w_c

par une pause Multiplying valeur négative cette test.

Autres conseils

Je viens de découvrir cette friandise qui progresse vers une réponse:

Du livre rouge, annexe G:

  

Éviter d'utiliser négatif w coordonnées des sommets et des coordonnées négatives q de texture. OpenGL pourrait ne pas couper correctement les coordonnées et peut faire des erreurs d'interpolation lorsque les primitives ombrage définies par ces coordonnées.

la matrice de Inversion projection activera en négatif W écrêtage coordonnée, et apparemment opengl n'aime pas. Mais quelqu'un peut-il expliquer pourquoi opengl ne gère pas ce cas?

Référence: http://glprogramming.com/red/appendixg.html

Les raisons que je peux penser:

  • En inversant la matrice de projection, les coordonnées ne seront plus parmi les zNear et avions zFar de la vue tronquée (nécessairement supérieur à 0).
  • Pour créer coordonnées de la fenêtre, les coordonnées de l'appareil normalisées sont converties / mis à l'échelle par la fenêtre. Donc, si vous avez utilisé un scalaire négatif pour les coordonnées du clip, les coordonnées du dispositif normalisé (tête en bas) se traduisent par la fenêtre de coordonnées de la fenêtre qui sont ... hors de votre fenêtre (à gauche et ci-dessous, si vous voulez)

En outre, puisque vous avez mentionné en utilisant une matrice de la caméra et que vous avez inversé la matrice de projection, je dois demander ... à laquelle les matrices demandez-vous ce que de la matrice de la caméra? Utilisation de la matrice de projection enregistrer proche / lointain / fovy / aspect provoque toutes sortes de problèmes dans le tampon de profondeur, y compris tout ce qui utilise z (test de profondeur, l'abattage du visage, etc).

La section FAQ OpenGL sur les transformations a un peu plus détails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top