Изменить положение и направление камеры в OpenGL? - PullRequest
1 голос
/ 08 марта 2019

У меня есть код (игра) с фиксированной камерой в ортопроекции. Он работает плавно, пока я не изменю положение камеры с (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), текстуры не отображаются (отображаются). Разве он не должен отображать то же, что и до изменений?

1 Ответ

3 голосов
/ 09 марта 2019

Проблема связана с матрицей ортографической проекции, поскольку она не центрирована. Когда ось z вида инвертирована, то ось x тоже инвертируется. Обратите внимание, что Правило правой руки все еще должно выполняться, а x.axis является перекрестным произведением оси Y и оси Z.

Когда геометрия равна z-5, а матрица вида и проекции выглядит следующим образом

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