当我在 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 轴不会因为投影矩阵而反转,但会因为 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/