2016-03-15 2 views
0

J'utilise GLM et GLFW pour dessiner un carré. J'ai le code suivant:Vertex OpenGL LookAt ne montre pas

static const GLfloat g_vertex_buffer_data[] = { 
    // square 

    0, 0, 0, 
    1, 0, 0, 
    0, 0, 1, 

    1, 0, 0, 
    1, 0, 1, 
    0, 0, 1, 

}; 

glm::mat4 Projection = glm::perspective(glm::radians(45.0f), (float)_width/(float)_height, 0.1f, 100.0f); 

glm::mat4 View = glm::lookAt(glm::vec3(0.f, 5.f, 0.f), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); 

glm::mat4 Model = glm::mat4(1.0f); 

glm::mat4 mvp = Projection * View * Model; 
GLuint MatrixID = glGetUniformLocation(programID, "MVP"); 


glm::mat4 MyModel = glm::mat4(1.0f); 
glm::mat4 MyMVP = Projection * View * MyModel; 

La chose étrange est ici:

glm::mat4 View = glm::lookAt(glm::vec3(0.f, 5.f, 0.f), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); 

En ce moment, je ne vois rien. Mais quand je le change en:

glm::mat4 View = glm::lookAt(glm::vec3(0.f, 5.f, 0.000001f), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); 

Ensuite, je suis en mesure de voir le carré. Pourquoi ne suis-je pas capable de le voir quand je mets le Z coördinate à zéro, pourquoi ça marche quand je le change en quelque chose> 0? En fait, je veux que ce soit zéro (donc en regardant de 5 unités jusqu'au point central) mais cela ne fonctionne pas pour une raison quelconque.

--- --- modifier

est avec glm::vec3(0.f, 5.f, 0.0000000000001f)

http://bit.ly/251TAC7

Ceci est le résultat avec glm::vec3(0.f, 5.f, 0.000000000000f)

http://bit.ly/1QUqBZz

+0

Votre vecteur haut doit être (0,0,1) et non (0,1,0). Actuellement, la direction de votre vue et le vecteur ascendant sont les mêmes, donc le produit croisé ne fonctionnera pas correctement. Lorsque vous passez à 0.001f, le vecteur ascendant peut être "approximé". – aslg

+0

@aslg Ça a marché, mais qu'est-ce que ça veut dire quand je change de vecteur comme tu l'as dit? Qu'est-ce qui se passe réellement? J'ai fait une édition en passant – Markinson

Répondre

2

donc votre configuration lookat est faux. Votre caméra pointe actuellement de (0,5,0) à (0,0,0) avec un vecteur haut de (0,1,0).

Cela signifie que votre appareil photo est à la recherche dans la direction Y négative

normalize((0,0,0) - (0,5,0)) = (0,-1,0) 

Quelle est la même direction que le vecteur vers le haut (inversé, mais qui est hors de propos). Clairement, votre caméra ne peut pas pointer dans la même direction que le vecteur haut.

Pour résoudre votre problème, il vous suffit d'utiliser le vecteur haut (0,0,1).


OP's scene

C'est ce que votre scène ressemble à une caméra de configuration correctement. XYZ est le référentiel mondial (vous pouvez également y voir votre quad) et UVN est le référentiel de la caméra. N est la direction de la vue, V le vecteur ascendant et U est un vecteur latéral parallèle à la fois à N et à V. Vous n'avez pas à gérer les coordonnées UVN de la caméra puisque GLM le fait pour vous, il vous suffit de fournir les points Centre et Eye et le vecteur Up dans les coordonnées du monde. Si votre vecteur ascendant est le même que le sens de la vue, alors ils ne peuvent pas être orthogonaux et le référentiel de la caméra n'est pas bien défini. Changer le point central pour avoir Z = 0.0000001f au lieu de 0, fait que le vecteur ascendant n'est pas exactement parallèle à la direction de la vue. L'implémentation de la fonction de visualisation se rapproche un peu du vecteur ascendant que vous fournissez au vecteur réel. Ceci est fait pour que vous n'ayez pas à calculer le vecteur exact chaque fois que vous voulez configurer votre caméra.

Vous devez simplement spécifier que le vecteur ascendant est (0,0,1) et si votre direction de vue n'est pas orthogonale au vecteur ascendant, regardez calculer la meilleure approximation du vecteur ascendant tel que le UVN les vecteurs sont toujours orthogonaux.Sauf si le vecteur haut coïncide avec la direction de la vue, auquel cas le vecteur haut pourrait être n'importe quoi.

Si vous ne comprenez pas les coordonnées de la caméra, les vecteurs ascendants, etc., prenez le temps de regarder/lire. Il y a de bonnes réponses à ce sujet aussi.