c++ - 反转 x 轴的透视投影 (glm::perspective)

标签 c++ opengl glm-math perspectivecamera projection-matrix

当我在 OpenGL 中使用透视投影时,我的 X 轴会反转,如下图所示。下面的代码可能无效,因为我对其进行了很多更改以使其不那么晦涩。它可能不起作用,所以请记住这一点。这是代码和顶点:

 typedef struct{
   float x;
   float y;
   float z;
 } vertex_t;

  glm::vec3 position = glm::vec3(0, 0, 0);
  glm::vec3 look_at = glm::vec3(0, 0, 1);

  glm::mat4 projectionMatrix = glm::perspective(45.0f, (float)800 / (float)600, 0.1f, 100.f); 
  glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, 5.0f));
  glm::mat4 viewMatrix = glm::lookAt(
    position, 
    look_at,
    glm::vec3(0, 1, 0) 
  );

  vertex_t data[3] = {
    {-0.5,  0.5, -0.5f},
    { 0.5,  0.5, -0.5f},
    {-0.5, -0.5, -0.5f},
  };

  unsigned int indices[3] = {
    0, 1, 2
  };

 glm::mat4 mvp = projectionMatrix * viewMatrix * modelMatrix; //This is passed in as the uniform u_MVP later

这是顶点着色器:

#version 330 core

layout(location = 0) in vec4 position;

uniform mat4 u_MVP;

void main(){
  gl_Position = u_MVP * position;
}

这就是输出。正如您所看到的,它与提供的顶点不匹配。 enter image description here

如果您需要完整的代码,或者希望我提供原始版本,请告诉我。谢谢!

更新:我尝试过负 Z 轴,但没有成功。代码如下:

  position = glm::vec3(0, 0, 0);
  look_at = glm::vec3(0, 0, -1);

  
  glm::mat4 projectionMatrix = glm::perspective(45.0f, (float)800 / (float)600, 0.1f, 100.f); 
  glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -5.0f));
  viewMatrix = glm::lookAt(
    position,
    look_at, 
    glm::vec3(0, 1, 0)  // Tilt/rotation (unclear) set y to -1 for upside down view
  );

最佳答案

x 轴不会因为投影矩阵而反转,但会因为 View 矩阵而反转。

glm::vec3 position = glm::vec3(0, 0, 0);
glm::vec3 look_at = glm::vec3(0, 0, 1);
glm::mat4 viewMatrix = glm::lookAt(position, look_at, glm::vec3(0, 1, 0));

View 空间是 Right-handed系统,其中 X 轴指向右侧,Y 轴指向上方。 Z 轴指向 View 之外(请注意,在右手系统中,Z 轴是 X 轴和 Y 轴的叉积)。

因此,您从背面看三角形。

更改模型矩阵和 View 矩阵。沿负 Z 轴移动三角形。定义一条指向负 z 方向的视线:

glm::mat4 modelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -5.0f));

glm::vec3 position = glm::vec3(0, 0, 0);
glm::vec3 look_at = glm::vec3(0, 0, -1);
glm::mat4 viewMatrix = glm::lookAt(position, look_at, glm::vec3(0, 1, 0));

到近平面和远平面的距离必须为正值,并且 glm::perspective 的角度必须为正值。是 radiant :

0 < near < far

glm::mat4 投影矩阵 = glm::perspective(45.0f, (float)800/(float)600, -0.1f, -100.f);

glm::mat4 projectionMatrix = glm::perspective(
    glm::radians(45.0f), 800.0f/600.0f, 0.1f, 100.f); 

关于c++ - 反转 x 轴的透视投影 (glm::perspective),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65049297/

相关文章:

opengl - 为什么retina屏幕坐标值是像素值的两倍

opengl - 实时图形中的骨骼动画插值

c++ - 级联阴影贴图闪闪发光

c++ - 返回数组元素时非常量引用的无效初始化

c++ - 编译后可执行文件出错

c++ - 如何在exe中包含所有dll?

c++ - 光照没有出现在 OpenGL 中

java - openGL 中的 VBO

c++ - 将 NULL/0 传递给 dynamic_cast 的便携安全?

c++ - FFmpeg:为什么录制的视频质量远低于在 OpenGL 中渲染的质量