【发布时间】:2018-01-19 19:53:57
【问题描述】:
我正在使用 OpenGL 图形引擎,但遇到了一个非常奇怪的问题。基本上我正在导入(通过Assimp)一个.DAE场景(在Cinema4D中制作),它还包含一个相机。相机位于原点,向左旋转 20 度,向上旋转 20 度,因此立方体的一部分应出现在视口的右下角。
渲染时,我首先通过将场景图中相机节点的世界变换矩阵应用于 lookAt 矩阵来计算“全局”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);
}
)";
【问题讨论】:
-
世界转型不先行吗?喜欢
cameraMatrix = glm::lookAt(...) * transform;? -
我不这么认为,反正我试过了但结果还是没变。
-
你应该显示为你的着色器代码。
-
此类问题通常来自轴的转换顺序混乱,首先确保您在 Cinema3D 中的轴匹配/转换为 OpenGL。其次确保正确应用转换:gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(position, 1.0);
-
我添加了代码。不幸的是,Cinema4D 没有交换轴的选项,并且从新代码中可以看出,矩阵的顺序似乎是正确的。然而这里奇怪的是,手动将变换应用于相机参数似乎会产生所需的输出,而简单地将变换和外观相乘似乎会搞砸。知道为什么吗?
标签: c++ opengl matrix glm-math assimp