2017-07-17 2 views
1

La matrice de projection est une projection en perspective. Je veux voir quelle zone est visible de la caméra donnée. Pour visualiser que je veux étirer mon cube comme le tronc, afin que je puisse voir le résultat d'un autre appareil photo.obtiennent le visionnement frustum comme worldcoordinates

Mon Idear:

obtenir l'inverse de la viewProjectionMatrix et multiplier mon cubecoordinate avec elle:

glm::vec4 CubeCoordinates[8]{           
    glm::vec4(-1.0f, -1.0f, 1.0f, 1.0f), 
    glm::vec4(-1.0f, 1.0f, 1.0f, 1.0f), 
    glm::vec4(1.0f, 1.0f, 1.0f, 1.0f), 
    glm::vec4(1.0f, -1.0f, 1.0f, 1.0f), 
    glm::vec4(-1.0f, -1.0f, -1.0f, 1.0f), 
    glm::vec4(-1.0f, 1.0f, -1.0f, 1.0f), 
    glm::vec4(1.0f, 1.0f, -1.0f, 1.0f), 
    glm::vec4(1.0f, -1.0f, -1.0f, 1.0f) }; 

glm::mat4 InvertedViewProjectionMatrix = glm::inverse(refCamera.GetViewProjectionMatrix()); 

for (uint32_t i = 0; i < 8; ++i) 
{ 
    CameraEdgesWorldSpace[i] = InvertedViewProjectionMatrix * CubeCoordinates[i]; 
} 

Maintenant, les cubecoordinates devraient être WorldSpace et ressembler à tronc de cône. Mais les coordonnées de sortie sont erronées.

Je peux vous garantir que viewProjectionMatrix fonctionne correctement, car je l'utilise comme partout.

Le calcul est-il erroné? ou est-ce que j'utilise la mauvaise commande pour inverser la matrice (je suis nouveau à GLM)?

+3

Il vous manque la perspective en perspective. Après une projection (ou une projection inverse), la coordonnée w ne sera plus 1. – BDL

+0

alors je dois seulement diviser par w? – Thomas

+0

Oui. Si cela ne vous aide pas, veuillez ajouter un exemple montrant les valeurs dans votre matrice de caméra et les vecteurs résultants après la division. – BDL

Répondre

2

La matrice de projection mappe les coordonnées de l'œil pour fixer les coordonnées. Maintenant, vous n'avez pas de coordonnées de clip à back-project, vous n'avez que les NDC.

Comment convertir du NDC aux coordonnées du plan? Eh bien, gardez à l'esprit que nous travaillons avec des coordonnées homogènes plutôt que des coordonnées euclidiennes (d'où la 4ème dimension w). Les coordonnées homogènes sont invariantes par rapport à la multiplication par une constante non nulle. C'est-à-dire que le point (a, b, c, d) est équivalent à (k*a, k*b, k*c, k*d) pour tout k non nul.

Vous allez de coordonnées de plan à NDC en les multipliant par 1/w. C'est une multiplication par une constante! Par conséquent, NDC est en lui-même une coordonnée de clip valide, vous pouvez donc la projeter en arrière.

Maintenant, pour passer des coordonnées homogènes aux coordonnées euclidiennes, il faut toujours diviser par w. La raison pour laquelle nous ne le faisons pas normalement dans OpenGL est que les transformations affines n'affectent pas w, donc il reste généralement 1. Pas dans ce cas cependant, puisque la matrice de projection et son inverse affectent la coordonnée w. Par conséquent, comme souligné par BDL dans les commentaires, il vous manque une division de w. Vous devez prendre le cube visible en coordonnées NDC, les passer à travers une chaîne de transformations vers l'arrière, et enfin diviser par w afin d'aller aux coordonnées euclidiennes. En fait, vous pouvez sauter la division par w, car vous pouvez simplement rester dans des coordonnées homogènes et le rendre avec une vue d'une autre caméra.