在OpenGL中更改摄像机位置和方向?

问题描述 投票:0回答:1

我有一个代码(游戏),在正射投影中有固定的相机。它运行平稳,直到我将相机位置从(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),则不会显示(渲染)纹理。它不应该显示与更改前相同的内容吗?

c++ opengl glm-math
1个回答
3
投票

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

当几何图形位于z-5and时,视图和投影矩阵如下所示

 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);

然后将对象投影到视口:

但是,如果切换几何体和视图的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);

然后该对象位于视口旁边:

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

projection = glm::ortho(-1920.0f, 0.0f, 0.0f, 1080.0f, 1.0f, 10.0f);
© www.soinside.com 2019 - 2024. All rights reserved.