2016-03-15 2 views
0

Я использую GLM и GLFW для рисования квадрата. У меня есть следующий код:Vertex OpenGL LookAt не отображается

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; 

Странная вещь прямо здесь:

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 View = glm::lookAt(glm::vec3(0.f, 5.f, 0.000001f), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); 

Тогда я действительно могу видеть площадь. Почему я не могу его увидеть, когда я меняю Z coördinate на ноль, почему он работает, когда я меняю его на что-то> 0? Я на самом деле хочу, чтобы он был нулевым (поэтому смотри от 5 единиц до центральной точки), но это почему-то не работает.

--- редактировать ---

Это с glm::vec3(0.f, 5.f, 0.0000000000001f)

http://bit.ly/251TAC7

Это результат с glm::vec3(0.f, 5.f, 0.000000000000f)

http://bit.ly/1QUqBZz

+0

Ваш вектор вверх должен быть (0,0,1), а не (0,1,0). В настоящее время ваше направление просмотра и вектор вверх совпадают, поэтому кросс-продукт не будет работать хорошо. Когда вы переходите на 0.001f, вектор вверх может быть «приблизительным». – aslg

+0

@aslg Это сработало, но что это значит, когда я изменяю вектор вверх, как вы сказали? Что на самом деле происходит? Кстати, я сделал редактирование – Markinson

ответ

2

Так что ваша установка LookAt является неправильно. Ваша камера в настоящее время указывает от (0,5,0) до (0,0,0) с вектором вверх (0,1,0).

Это означает, что камера смотрит в отрицательном направлении Y

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

что то же самое направление, вверх вектора (перевернутой, но это не имеет значения). Очевидно, что ваша камера не может указывать в том же направлении, что и вектор вверх.

Чтобы решить вашу проблему, вам нужно использовать только вектор вверх (0,0,1).


OP's scene

Это то, что ваша сцена выглядит с должной настройки камеры. XYZ является мировым референтом (вы также можете видеть свой квад), а UVN - это ссылка на камеру. N - это направление просмотра, V - вектор вверх, а U - боковой вектор, параллельный как N, так и V. На самом деле вам не приходится иметь дело с координатами UVN камеры, поскольку GLM делает это для вас, вам нужно только предоставить Центр и Глазные точки и вектор Up в мировых координатах.

Если ваш вектор вверх совпадает с направлением просмотра, то они не могут быть ортогональными, а референт камеры не определен.

Изменение центральной точки на Z = 0,0000001f вместо 0, делает так, чтобы вектор вверх не был точно параллелен направлению просмотра. Реализация взгляда на функцию несколько приближается к вектору вверх, который вы передаете реальному вектору. Это делается для того, чтобы вам не приходилось вычислять точный вектор вверх каждый раз, когда вы хотите настроить камеру.

Вы просто должны указать, что вектор вверх равен (0,0,1), и если ваше направление просмотра не будет ортогональным вектору вверх, посмотрите на вычисление наилучшего приближения вектора вверх так, чтобы UVN векторы по-прежнему ортогональны.За исключением того, что вектор вверх совпадает с направлением представления, и в этом случае вектор вверх может быть чем угодно.

Если вы не понимаете координаты камеры, вверх векторы и т. Д., Не спешите смотреть/читать. В этом тоже есть хорошие ответы.