gpt4 book ai didi

c++ - OpenGL如何用GLM正确计算相机矩阵

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:03 24 4
gpt4 key购买 nike

我正在使用 OpenGL 图形引擎,但遇到了一个非常奇怪的问题。基本上我正在导入(通过 Assimp)一个 .DAE 场景(在 Cinema4D 中制作),它也包含一个相机。相机位于原点,向左旋转 20 度,向上旋转 20 度,因此立方体的一部分应该出现在视口(viewport)的右下角。

渲染时,我首先计算“全局”lookAt 矩阵,方法是将场景图中相机节点的世界变换矩阵应用于 lookAt 矩阵:

cameraMatrix = transform * glm::lookAt(camera->position, camera->lookAt, camera->upward);

然后用它来计算最终网格的模型 View 矩阵:

// 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);
}
)";

最佳答案

首先,这是错误的:

cameraMatrix = transform * glm::lookAt(camera->position, camera->lookAt, camera->upward);

correct order如下:

MVP = P * V * M;

其中P,V,M分别为投影矩阵、 View 矩阵和模型矩阵。

此外,该表达式没有意义,因为您的 glm::lookAt 已经根据相机的变换计算了 lookAt 矩阵。(如果我们暗示您的“变换”是相机的模型矩阵)

现在,关于 glm::lookAt()。不要用它来获取 View (相机)矩阵。虽然它确实会返回一个朝向您指定方向的矩阵,但这不会是一个正确的 View 矩阵,因为眼睛位置(该矩阵的平移部分)没有像 View 矩阵那样反转。

获得正确 View 矩阵的最简单方法是反转其模型矩阵。

glm::mat4 V = glm::inverse(M);

就是这样。现在您可以将“V”提取到着色器中或在 CPU 上计算 MVP 矩阵。

关于c++ - OpenGL如何用GLM正确计算相机矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45632790/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com