从透视投影矩阵转换为正交投影矩阵

16

我有一个只有简单三角形的场景,并且正在使用透视投影。我已经使用GLM设置好了我的MVP矩阵,就像这样:

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
glm::mat4 View       = glm::lookAt(
    glm::vec3(0,0,5), // Camera is at (0,0,5), in World Space
    glm::vec3(0,0,0), // and looks at the origin
    glm::vec3(0,1,0)  // Head is up (set to 0,-1,0 to look upside-down)
);  
glm::mat4 Model      = glm::mat4(1.0f);
glm::mat4 MVP        = Projection * View * Model;

它的运行很正常,我可以更改相机的值,三角形仍能正确显示。

但我想使用正交投影。当我将投影矩阵更改为正交投影时,它表现得不可预测,我无法显示三角形,或者只能在屏幕角落看到一小部分。要使用正交投影,我这样做:

glm::mat4 Projection = glm::ortho( 0.0f, 800.0f, 600.0f, 0.0f,-5.0f, 5.0f);

虽然我没有更改视图和模型矩阵,但是它仍然无法正常工作。

我需要在正确的方向上进行调整,我是否做错了什么?我缺少什么,应该如何正确设置正交投影?

PS 我不知道是否需要,但这是三角形的坐标:

static const GLfloat g_triangle[] = {
    -1.0f, 0.0f, 0.0f, 
    1.0f, 0.0f, 0.0f,
    0.0f, 2.0f, 0.0f, 
};
1个回答

16

您的三角形大小约为1单位。如果使用800/600单位宽的正交投影矩阵,则三角形显得非常小。只需减少正交矩阵的范围,并确保三角形在此区域内(例如,第一个顶点位于视图之外,因为其x坐标小于0)。

此外,请确保您的三角形未被背面消隐或z-剪裁擦除。顺便说一下… zNear的负值有些不寻常,但对于正交投影应该是可行的。


@Nico_Schertler 谢谢,我真的很蠢:\ 这个方法有用!如果我可以再问你一个问题——我尝试完全删除模型和视图矩阵,但一切仍然正常显示!当我使用正交投影时,我只需要投影矩阵吗?对不起,如果问题有点混淆,我几天前才开始学习openGL。非常感谢! - IanDess
1
默认的未转换坐标系统是左上角(-1,1),右下角(1,-1)。z坐标取决于您使用的是RH还是LH坐标系统。如果此范围符合您的需求,则可以将投影矩阵保持为单位矩阵,并仅使用视图矩阵来浏览场景。否则,您可以使用投影矩阵来缩放场景等。 - Nico Schertler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接