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

标签 c++ opengl glm-math

我有一个代码(游戏),在正交投影中带有固定相机。它运行顺利,直到我将相机位置从 (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 轴是 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/

相关文章:

python - 如何设置 python 异常消息以使用特殊语言?

c++ - 可以取地址的变量是左值,这是真的吗?

c++ - 编写 makefile 来构建动态库

java - 尝试使用 jogl 加载并初始化着色器

java - slick2d - statebasedgame错误 - 在当前线程中找不到OpenGL上下文

c++ - 编译器在编译时如何检测数字溢出?

c++ - OpenGL 无缘无故地裁剪一个对象

c++ - openGL:使用 glm 的转换顺序是什么?

c++ - 避免花键挤出时出现扭曲伪影?

c - 我的 GLFW 窗口正在显示它后面的内容