Я пытаюсь создать класс Camera для проекта 3D OpenGL. Однако я не могу понять, как на самом деле применить камеру к моей сцене. У меня есть эти функции камеры (среди прочих):
void Camera::update(){
glm::vec3 direction(cos(_verticalAngle) * sin(_horizontalAngle), sin(_verticalAngle), cos(_verticalAngle) * cos(_horizontalAngle));
glm::vec3 right = glm::vec3(sin(_horizontalAngle - 3.14f/2.0f), 0, cos(_horizontalAngle - 3.14f/2.0f));
glm::vec3 up = glm::cross(right, direction);
_projectionMatrix = glm::perspective(_FoV, float(VIEWPORT_X) / float(VIEWPORT_Y), 0.1f, 250.0f);
_viewMatrix = glm::lookAt(_position, _position + direction, up);
}
glm::mat4 Camera::getProjectionMatrix(){
return _projectionMatrix;
}
glm::mat4 Camera::getViewMatrix(){
return _viewMatrix;
}
Они были созданы из учебника, но я не уверен, что они работают, так как я не могу их протестировать. Я хочу, чтобы OpenGL использовал матрицы вида и проекции для имитации камеры. Как именно я могу сказать OpenGL использовать эти матрицы проекции и вида, чтобы он надлежащим образом имитировал камеру отдельно от преобразований модели? Я знаю, что OpenGL не будет принимать матрицы glm по умолчанию, но я видел этот тип вещей в нескольких уроках:
glm::mat4 ProjectionMatrix = getProjectionMatrix();
glm::mat4 ViewMatrix = getViewMatrix();
glm::mat4 ModelMatrix = glm::mat4(1.0);
glm::mat4 MVP = ProjectionMatrix * ViewMatrix * ModelMatrix;
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
но glUniformMatrix4fv (который, я думаю, применяет преобразование камеры?) не имеет смысла для меня. Это всегда имеет отношение к шейдерам, которых у меня нет. У меня просто есть каркасный тестовый сет. Может ли кто-нибудь предоставить мне фрагмент кода для этой проблемы?
Я не знаю об использовании GLM, но я могу помочь с обычной частью OpenGL.
glUniformMatrix4fv обновляет унифицированную матрицу 4×4 в месте, указанном MatrixID в конкретной шейдерной программе.
Я рекомендую работать через Изучение современного 3D графического программирования, который превосходен как справочник и руководство.
Для обсуждения того, как эти униформы используются в шейдерной программе GLSL, смотрите:
Изучение современного программирования 3D-графики — Глава 3
используйте glLoadMatrixf (), если вы не используете шейдеры, если вы хотите просто умножить текущую матрицу, используйте glMultMatrixf (), текущий режим матрицы может переключиться на использование glMatrixMode (GL_PROJECTION или GL_MODELVIEW); например (это ваш код):
lm::mat4 ProjectionMatrix = getProjectionMatrix();
//setup projection matrix for opengl
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMultMatrixf(glm::value_ptr(ProjectionMatrix));
or:
glMultMatrixf(&ProjectionMatrix[0][0]);
РЕДАКТИРОВАТЬ:
если вы хотите применить преобразование к вашей модели: (model_view объединяются в фиксированной функции)
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(&viewMatrix[0][0]);
glMultMatrixf(&modelTransform[0][0]); //model * view
Draw_your_model();
вам может понадобиться установить ваше преобразование следующим образом:
GLM :: переводить (modelTransform, -10, -10, -10); поэтому ваша модель будет в (10,10,10)
Основываясь на вашем коде, вы должны сделать следующее:
glm::mat4 ProjectionMatrix = getProjectionMatrix();
glm::mat4 ViewMatrix = inverse(getViewMatrix());//view(camera) must be inverse(if you don't already do it)
glm::mat4 ModelMatrix = glm::mat4(1.0);
glm::mat4 MVP = ProjectionMatrix * ViewMatrix * ModelMatrix;
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, value_ptr(MVP));//use value_ptr method to pass matrix pointer
Также, чтобы установить правильную матрицу камеры, я бы предложил использовать встроенный метод lookAt () GLM, чтобы вычислить eye, dir, up и скомпоновать их в окончательную матрицу для вас.