Проблема с целевой камерой OpenGL - PullRequest
1 голос
/ 05 мая 2020

Я реализую игру в трехмерный лабиринт на C ++, используя OpenGL, где камера находится в фиксированном положении точно над серединой лабиринта, глядя на середину. Он работает и выглядит так, как я хотел, но мой код не так хорош, потому что мне нужно было поместить + 0.01f в положение, чтобы оно работало хорошо. Если я пропущу это, лабиринт не появится, кажется, что камера направлена ​​в противоположную сторону .. Как я могу это исправить элегантно?

glm::vec3 FrontDirection = glm::vec3(((GLfloat)MazeSize / 2) + 0.01f, 0.0f, ((GLfloat)MazeSize / 2)

The (0,0,0) ori go location - это левый угол лабиринта (начальная позиция), поэтому я установил позицию следующим образом:

glm::vec3 CameraPosition = glm::vec3(((GLfloat)MazeSize / 2), ((GLfloat)MazeSize + 5.0f), ((GLfloat)MazeSize / 2))

UpDirection is (0.0f, 1.0f, 0.0f) Функция lookAt выглядит так:

Matrix = glm::lookAt(CameraPosition, FrontDirection, UpDirection);

Я знаю, что по соглашению в OpenGL камера указывает на отрицательную ось z, поэтому FrontDirection в основном указывает в направлении, обратном тому, на что она нацелена. Для меня было бы совершенно ясно установить позиции, как я сделал выше, но это все еще не работает, как я ожидал. (если я не поставлю это + 0.01f)

Заранее спасибо за ваш ответ!

1 Ответ

1 голос
/ 05 мая 2020

Я знаю, что по соглашению в OpenGL камера указывает на отрицательную ось z

В области просмотра ось Z указывает за пределы области просмотра, но это совершенно не имеет значения. Вы определяете матрицу обзора, положение и ориентацию камеры. Положение камеры - это первый аргумент glm::lookAt. Камера смотрит в направлении цели , второго аргумента glm::lookAt.

Второй параметр glm::lookAt не является вектором направления, это точка на линии прямой видимости. Вычислите точку на линии обзора по CameraPosition+FrontDirection:

Matrix = glm::lookAt(CameraPosition, CameraPosition+FrontDirection, UpDirection);

Ваш восходящий вектор имеет то же направление, что и линия обзора. Направление вверх должно быть ортогонально к линии прямой видимости. Вектор вверх определяет рулон :

glm::vec3 CameraPosition = glm::vec3(
    ((GLfloat)MazeSize / 2), ((GLfloat)MazeSize + 5.0f), ((GLfloat)MazeSize / 2));
glm::vec3 CameraTarget = glm::vec3(
    ((GLfloat)MazeSize / 2), 0.0f, ((GLfloat)MazeSize / 2));
glm::vec3 UpDirection = glm::vec3(0.0f, 0.0f, 1.0f); 

Matrix = glm::lookAt(CameraPosition, CameraTarget, UpDirection);
...