调整glViewport()和glFrustum()的大小时如何调整模型的大小?

时间:2014-06-09 12:48:04

标签: opengl

static void resize(int width, int height)
{
const float ar = (float) width / (float) height;

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;

}

我们知道当我们调整窗口大小时,会调用此resize()并调整视口大小。但是当我们改变窗口大小时如何调整模型大小?

2 个答案:

答案 0 :(得分:0)

当您更改投影矩阵或视口时,屏幕上会有什么变化,因为这是练习的重点。如果查看屏幕空间中的最终结果,如果更改投影或视口参数,模型当然会显得更大或更小。在数学上,涉及一个比例组件。由于投影矩阵和视口变换应用于每个绘图调用中的每个顶点,因此您可以将其视为模型,并调整大小"。但是人们通常不会那样看待事物。

这更多的是你如何看待事物。模型的对象空间顶点不会改变,世界空间位置和大小也不会改变(如果你想用这样的术语思考)。

答案 1 :(得分:0)

我们使用三种不同的#34;坐标"理解3D世界:

  1. 模型中包含顶点和诸如此类的位置,在模型空间中定义。这是最初使用的坐标系(例如在Blender中),用于创建模型并定义顶点位置。

  2. 世界上可能有很多模型,都有不同的位置。为了理解这一切,我们定义了世界空间。您必须设置一个矩阵,将每个模型从其模型空间转换为我们的全球世界空间。

  3. 接下来,有眼睛空间(或相机空间,或视图空间)。从世界空间转换到眼睛空间的矩阵使我们能够轻松移动我们的相机。最终,Eye Space就是我们实际上会看到"。

  4. 但是等等!还有更多!眼睛空间只是一堆顶点,没有透视概念。最后,所有OpenGL都会渲染单位立方体内的所有三角形。这称为标准化设备坐标空间。为了从Eye Space到Normalized Device Coordinate Space,我们再次应用一个矩阵,我们通常在这个阶段称之为投影矩阵。

  5. 旧的OpenGL曾经内置了所有功能:当你打电话时你自己使用它

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
    

    这基本上说:我们想调整投影矩阵。然后我们将它设置为等于单位矩阵。然后我们使用一个名为glFrustum的便利函数来设置正确的投影矩阵。对glFrustum的调用设置了一个透视投影矩阵,即距离更远的东西变得更小"