OpenGL Make Object Stick для камеры - PullRequest
1 голос
/ 21 мая 2019

В моих приключениях, чтобы лучше понять, что именно происходит с матрицами и вершинной математикой с OpenGL, я хотел посмотреть, смогу ли я заставить объект «прилипать» перед моей «камерой». Я играю с этим уже пару дней и чувствую, что приближаюсь.

До сих пор мне удавалось заставить объект следить за движением камеры, за исключением ее вращения (кажется, я просто не могу понять этот фронтальный вектор). Для создания новой позиции объекта у меня есть следующий код:

glm::mat4 mtx_trans = glm::mat4(1.0f);
mtx_trans = glm::translate(mtx_trans, camera->getPosition() + camera->getFront());

glm::vec4 cubePosVec4 = glm::vec4(0.0f, 0.0f, -3.0f, 1.0);
cubePosVec4 = mtx_trans * cubePosVec4;

cubePositions[9] = glm::vec3(cubePosVec4.x, cubePosVec4.y, cubePosVec4.z);

Где camera->getPosition() получает вектор текущего положения камеры, а camera->getFront() получает текущий фронтальный вектор камеры.

Как уже упоминалось, я нахожусь в процессе изучения того, что все здесь происходит, так что, возможно, я все об этом ошибаюсь ... В таком случае, как я должен идти о "блокировании" объекта на определенном расстоянии от камеры?

1 Ответ

1 голос
/ 21 мая 2019

Если объект должен всегда находиться в одной и той же позиции по отношению к камере, то вам нужно пропустить преобразование по матрице вида.

Обратите внимание, что матрица вида преобразуется из мирового пространства в пространство просмотра,Если объект всегда должен быть расположен перед камерой, то объект не должен быть размещен в мире, он должен быть размещен в виде.Таким образом, матрица «вида» для объекта - это единичная матрица.

Таким образом, обычное преобразование представления модели для объекта в вашем случае - это перемещение объекта вдоль оси z в отрицательном направлении.Перевод должен быть отрицательным, потому что ось z указывает вне вида (в пространстве вида):

glm::mat4 mtx_trans = glm::mat4(1.0f);
mtx_trans = glm::translate(mtx_trans, glm::vec3(0.0f, 0.0f, -3.0f));
...