c++ - 透视投影反转 x 轴 (glm::perspective)
问题描述
当我在 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;
}
如果您需要完整的代码,或者如果您希望我提供原始版本,请告诉我。谢谢!
更新:我试过负 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 轴不会因为投影矩阵而倒置,但会因为视图矩阵而倒置。
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));
视图空间是一个右手系统,其中 X 轴指向右侧,Y 轴指向上方。Z 轴指向视图外(注意在右手系统中,Z 轴是 X 轴和 Y 轴的叉积)。
因此,您从后面看三角形。
改变模型矩阵和视图矩阵。沿负 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
是辐射:
0 < near < far
glm::mat4 projectionMatrix = 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);
推荐阅读
- reactjs - 单击父组件从子组件获取数据
- c++ - 如何加载 PE 文件以进行 Process Hollowing?
- python - 提取数据框并更改列值
- r - 如何编写具有多个分隔符 [R] 的 txt 文件?
- javascript - 每次div达到最大高度时如何调用函数?
- javascript - 仪表板中未启用重定向到 Checkout 的域 (C:/../index.html) [Stripe API]
- javascript - 在表单上填写密码时,我的注册按钮消失了
- java - 我在哪里添加一个 main 方法以便我可以正确运行这个程序?
- flutter - 如果颤动,如何将大文本(大小不同)呈现为具有水平滚动的多个页面?
- sql - 与 group by (Sum) 的多个联接