📜  计算机图形学投影(1)

📅  最后修改于: 2023-12-03 15:28:02.783000             🧑  作者: Mango

计算机图形学投影

计算机图形学中,投影是将三维场景投影到二维平面或者其他低维空间的过程。通常我们需要进行投影来将三维场景展现在屏幕上,以进行可视化、交互等操作。

投影类型

在计算机图形学中,我们常用的投影类型有以下几种:

正射投影

正射投影是将三维场景投影到平行于某个坐标轴的平面上的过程。它可以保持物体在所有轴上的大小比例不变,因此常用于工程制图和建筑设计等领域。

透视投影

透视投影是将三维场景投影到一个斜切视锥体上的过程。它具有透视效果,能够提供更加逼真的场景呈现,因此在游戏、电影等领域广泛应用。

投影矩阵

在计算机图形学中,投影矩阵是将三维场景转换为二维平面或其他低维空间的核心工具。两种常用的投影矩阵为正射投影矩阵和透视投影矩阵。

正射投影矩阵

正射投影矩阵可以通过以下公式构造:

\begin{bmatrix}
\frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\
0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\
0 & 0 & \frac{2}{f-n} & -\frac{f+n}{f-n} \\
0 & 0 & 0 & 1
\end{bmatrix}

其中,$l, r$ 分别是平面左右边界的坐标值,$b, t$ 分别是平面上下边界的坐标值,$f, n$ 分别是平面远近边界的坐标值。

透视投影矩阵

透视投影矩阵可以通过以下公式构造:

\begin{bmatrix}
\frac{n}{r} & 0 & 0 & 0 \\
0 & \frac{n}{t} & 0 & 0 \\
0 & 0 & \frac{-(f+n)}{f-n} & \frac{-2fn}{f-n} \\
0 & 0 & -1 & 0
\end{bmatrix}

其中,$r$ 是视锥体侧面在视觉平面上的宽度,$t$ 是视锥体顶面在视觉平面上的高度,$f, n$ 分别是视锥体前后面的距离。

实现投影

在计算机图形学中,我们通常利用图形库或者图形引擎实现投影。下面是利用OpenGL实现透视投影的代码片段:

// 设置透视投影
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double aspect_ratio = static_cast<double>(width) / static_cast<double>(height);
double near = 0.1;
double far = 1000.0;
double fov = 45.0;
double top = near * std::tan(fov * M_PI / 360.0);
double right = top * aspect_ratio;
glFrustum(-right, right, -top, top, near, far);