
При рендеринге я сначала рассчитываю "глобальный" вид. матрицу, применяя матрицу мирового преобразования узла камеры в графе сцены к матрице 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
Мобильная версия