gpt4 book ai didi

c++ - 在 OpenGL 中更改相机位置和方向?

转载 作者:搜寻专家 更新时间:2023-10-31 01:26:38 25 4
gpt4 key购买 nike

我有一个代码(游戏),在正射投影中有一个固定的相机。它运行平稳,直到我将相机位置从 (0,0,1) 更改为 (0,0,-1)

简而言之,我有 2 个纹理:

{    //texture 1               
960.0f, 0.0f, -5.0f, 0.0f, 0.0f,
960.0f, 1080.0f, -5.0f, 1.0f, 0.0f,
1920.0f, 0.0f, -5.0f, 0.0f, 1.0f,
1920.0f, 1080.0f, -5.0f, 1.0f, 1.0f
}

{ // texture 2
1290.0f, 390.0f, -7.0f, 0.0f, 0.0f,
1290.0f, 690.0f, -7.0f, 1.0f, 0.0f,
1590.0f, 390.0f, -7.0f, 0.0f, 1.0f,
1590.0f, 690.0f, -7.0f, 1.0f, 1.0f
}

转换矩阵:

view = glm::lookAt
(
glm::vec3( 0.0f, 0.0f, 1.0f ),
glm::vec3( 0.0f, 0.0f, 0.0f ),
glm::vec3( 0.0f, 1.0f, 0.0f )
);

projection = glm::ortho
(
0.0f,
1920.0f,
0.0f,
1080.0f,
1.0f, // zNear
10.0f // zFar
);

顶点着色器:

#version 330 core

layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec2 TexCoord;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
gl_Position = projection * view * model * vec4( aPos, 1.0 );

TexCoord = vec2( aTexCoord.x, aTexCoord.y );
}

如果我运行这段代码,它会正确显示两种纹理,进行深度测试,......

但是,如果我将相机位置更改为 (0, 0, -1) 并将纹理的 Z 坐标更改为它们的逆 +5+ 7,并保持相同的方向(0, 0, 0),不显示(渲染)纹理。它不应该显示与更改前相同的内容吗?

最佳答案

这个问题与正交投影矩阵有关,因为它没有居中。当 View 的 z 轴反转时,x 轴也反转。注意 Right-hand rule必须仍然满足并且 x.axis 是 y 轴和 z 轴的叉积。

当几何位于z-5且 View 和投影矩阵如下

 view = glm::lookAt(
glm::vec3(0.0f, 0.0f, 1.0f),
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 1.0f, 0.0f);
projection = glm::ortho(0.0f, 1920.0f, 0.0f, 1080.0f, 1.0f, 10.0f);

然后对象被投影到视口(viewport):

但是如果你切换几何体和 View 的z位置,那么你会得到以下情况:

 view = glm::lookAt(
glm::vec3(0.0f, 0.0f, -1.0f),
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 1.0f, 0.0f);

然后对象在视口(viewport)旁边:

沿 X 轴移动正交投影,以解决您的问题:

projection = glm::ortho(-1920.0f, 0.0f, 0.0f, 1080.0f, 1.0f, 10.0f);

关于c++ - 在 OpenGL 中更改相机位置和方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55066916/

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