OpenGL, как правильно рассчитать матрицу камеры с помощью GLMC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 OpenGL, как правильно рассчитать матрицу камеры с помощью GLM

Сообщение Anonymous »

Я работаю над графическим движком OpenGL и столкнулся с очень странной проблемой. По сути, я импортирую (через Assimp) сцену .DAE (созданную в Cinema4D), которая также содержит камеру. Камера находится в исходном положении и повернута на 20 градусов влево и на 20 градусов вверх, так что часть куба должна появиться в правом нижнем углу области просмотра.
Изображение

При рендеринге я сначала рассчитываю "глобальный" вид. матрицу, применяя матрицу мирового преобразования узла камеры в графе сцены к матрице LookAt:
cameraMatrix = transform * glm::lookAt(camera->position, camera->lookAt, camera->upward);

а затем использовать его для расчета матриц вида модели окончательных сеток:
// mesh.second is the world matrix
mat4 modelvMatrix = renderList->cameraMatrix * mesh.second;

который затем объединяется с матрицей проекции и передается в шейдер. Однако результат (текстуры пока не работают) выглядит «зеркальным», как если бы преобразования были применены наоборот:
Изображение

Выполняем некоторые математические вычисления вручную с использованием той же матрицы преобразования:
//cameraMatrix = transform * glm::lookAt(camera->position, camera->lookAt, camera->upward);
cameraMatrix = camera->getCameraMatrix(transform);

mat4 Camera::getCameraMatrix(mat4p transform)
{
auto invTr = glm::inverseTranspose(mat3(transform));
auto pos = vec3(transform * vec4(position, 1));
auto dir = invTr * glm::normalize(lookAt - position);
auto upw = invTr * upward;
return glm::lookAt(pos, pos + dir, upw);
}

кажется, решает проблему:
Изображение

Однако я не уверен, что вывод полностью верен, поскольку он не совсем зеркален первому изображению. Локальная матрица преобразования узла камеры:
mat4x4(
(0.939693, 0.000000, -0.342020, 0.000000),
(0.116978, 0.939693, 0.321394, 0.000000),
(0.321394, -0.342020, 0.883022, 0.000000),
(0.000000, -0.000000, 0.000000, 1.000000))

Как правильно рассчитать матрицу камеры?
РЕДАКТИРОВАТЬ
Я спрашивал об исчислении матриц:
mat4 modelvMatrix = renderList->cameraMatrix * mesh.second;
mat4 renderMatrix = projectionMatrix * modelvMatrix;
shaderProgram->setMatrix("renderMatrix", renderMatrix);
mesh.first->render();

и код шейдера:
const std::string Source::VertexShader= R"(
#version 430 core

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec2 vertexTexCoord;

uniform mat4 renderMatrix;

out vec2 texCoord;

void main()
{
gl_Position = renderMatrix * vec4(position, 1.0);
texCoord = vertexTexCoord;
}
)";

const std::string Source::FragmentShader= R"(
#version 430 core

uniform sampler2D sampler;

in vec2 texCoord;

out vec3 color;

void main()
{
color = vec3(0.0, 1.0, 0.0);
//color = texture(sampler, texCoord);
}
)";


Подробнее здесь: https://stackoverflow.com/questions/456 ... x-with-glm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»