返回

OpenGL 入门:导航坐标系统

见解分享

深入了解 OpenGL 的坐标系统:构建逼真的 3D 世界

引言

OpenGL 是一种强大的图形 API,用于创建令人惊叹的 2D 和 3D 图形。在 OpenGL 的世界中,理解坐标系统至关重要,因为它为场景中的对象提供了位置和方向。本文将深入探讨 OpenGL 的坐标系统,帮助您掌握构建逼真的 3D 环境所需的知识。

标准化设备坐标 (NDC)

想象一下一个立方体,它的每一面都与一个屏幕像素坐标系对齐。OpenGL 中的每个顶点都会转换为标准化设备坐标 (NDC) 空间,这是一个[-1.0, 1.0]的立方体。NDC 坐标有助于将对象从 3D 场景映射到 2D 屏幕。

视口

视口定义了 NDC 坐标与屏幕像素坐标之间的关系。它指定了 OpenGL 场景在屏幕上显示的位置和大小。您可以调整视口以控制场景在窗口中的布局和比例。

投影矩阵

投影矩阵将 3D 场景转换为 NDC 空间。有两种主要的投影类型:

  • 正交投影: 将场景投影到一个平行于观察方向的立方体上,用于创建 2D 场景或具有平行线透视的 3D 场景。
  • 透视投影: 模拟人眼观察场景时产生的透视效果,用于创建具有逼真深度的 3D 场景。

模型视图矩阵

模型视图矩阵是用于将场景中的对象移动、旋转和缩放的矩阵。它使您能够创建复杂的场景并控制对象的相对位置和方向。您可以使用多个模型视图矩阵来创建分层场景。

变换

变换是改变顶点在坐标系中位置或方向的操作。OpenGL 支持以下变换:

  • 平移: 沿 x、y 或 z 轴移动顶点。
  • 旋转: 围绕 x、y 或 z 轴旋转顶点。
  • 缩放: 按 x、y 或 z 轴缩放顶点。

代码示例:绘制三角形

// 设置视口
glViewport(0, 0, windowWidth, windowHeight);

// 创建正交投影矩阵
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

// 设置模型视图矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -1.0);

// 启用顶点数组
glEnableClientState(GL_VERTEX_ARRAY);

// 定义顶点数组
GLfloat vertices[] = {-0.5, -0.5, 0.0, 0.5, -0.5, 0.0, 0.0, 0.5, 0.0};

// 设置顶点数据
glVertexPointer(3, GL_FLOAT, 0, vertices);

// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);

这段代码演示了如何在 OpenGL 中使用 NDC、视口、投影和模型视图矩阵绘制一个简单的三角形。它将顶点转换为 NDC 空间,设置视口,定义投影矩阵,移动场景,并绘制三角形。

结论

掌握 OpenGL 的坐标系统是创建逼真的 3D 场景的关键。通过了解 NDC、视口、投影矩阵、模型视图矩阵和变换,您可以控制对象的位置、方向和透视,从而构建出令人惊叹的图形世界。

常见问题解答

  1. NDC 坐标系的中心在哪里?
    • NDC 坐标系的中心位于原点 (0.0, 0.0, 0.0)。
  2. 视口的原点在哪里?
    • 视口的原点位于屏幕的左下角,坐标为 (0, 0)。
  3. 如何创建透视效果?
    • 使用透视投影矩阵并设置 zNear 和 zFar 参数。
  4. 如何旋转对象?
    • 使用 glRotatef() 函数并指定旋转角度和轴。
  5. 如何缩放对象?
    • 使用 glScalef() 函数并指定缩放因子。