3D图形计算以坐标系与变换矩阵为基础,涵盖平移、旋转、缩放的齐次坐标运算,及透视/正交投影核心公式,高阶实践则聚焦抗锯齿、光线追踪等渲染技术,结合GPU并行计算提升效率,同时需处理数值稳定性问题,从基础MVP矩阵到高精度全局光照,其方法体系支撑着影视特效、游戏引擎等场景的实时渲染与视觉呈现,实现从几何描述到逼真图像的转化。
在计算机图形学、3D建模、游戏开发、工业设计等领域,3D计算的准确性直接决定了最终视觉效果、物理模拟精度与交互体验,无论是模型的位置变换、光影效果的真实感,还是碰撞检测的可靠性,都离不开一套严谨的数学公式与方法体系,本文将系统梳理3D计算中最核心的基础公式、高精度算法及其实际应用,帮助读者理解“最准”背后的数学逻辑与实践要点。
3D坐标系统与向量运算:一切计算的基石
3D计算的起点是坐标系统与向量运算,它们描述了空间中点、线、面的位置与关系,后续所有变换、投影、光照等公式都建立在此基础之上。
1 坐标系与点的表示
在3D空间中,一个点通常用三维坐标表示,最常见的坐标系是右手笛卡尔坐标系(x轴向右、y轴向上、z轴向前),点的位置可表示为向量形式:
$$ P = (x, y, z) $$
$x, y, z$ 分别是点在三个坐标轴上的分量。
2 向量运算核心公式
向量既有大小(模)又有方向,是3D计算的核心工具,关键运算公式如下:
-
向量加减法:若 $\vec{a} = (a_x, a_y, a_z)$,$\vec{b} = (b_x, b_y, b_z)$,则
$$ \vec{a} \pm \vec{b} = (a_x \pm b_x, a_y \pm b_y, a_z \pm b_z) $$
用于计算点的相对位移或向量的合成。 -
点积(内积):
$$ \vec{a} \cdot \vec{b} = a_x b_x + a_y b_y + a_z b_z = |\vec{a}| |\vec{b}| \cos\theta $$
$\theta$ 为两向量夹角,点积的核心作用是计算夹角和判断方向(如点积为正表示夹角小于90°,为负表示大于90°),是光照模型、法线计算的基础。 -
叉积(外积):
$$ \vec{a} \times \vec{b} = \begin{vmatrix} \vec{i} & \vec{j} & \vec{k} \ a_x & a_y & a_z \ b_x & b_y & b_z \end{vmatrix} = (a_y b_z - a_z b_y, a_z b_x - a_x b_z, a_x b_y - a_y b_x) $$
叉积结果是一个垂直于 $\vec{a}$ 和 $\vec{b}$ 的新向量,其模等于 $|\vec{a}| |\vec{b}| \sin\theta$,叉积常用于计算表面法线(如三角面的法向量)、判断向量左右关系,是碰撞检测、光照方向计算的关键。
3D变换矩阵:模型定位与视角控制的核心
3D模型从局部空间到屏幕空间的显示,需要经历一系列坐标变换(平移、旋转、缩放),这些变换通过矩阵运算高效实现,变换矩阵的准确性直接决定模型在场景中的位置、朝向和大小是否正确。
1 基本变换矩阵(齐次坐标)
为统一平移、旋转、缩放运算,3D图形学通常使用齐次坐标(将3D点表示为4D向量 $(x, y, z, 1)$),通过4×4矩阵进行变换。
-
平移矩阵:将点沿 $(t_x, t_y, t_z)$ 方向移动,
$$ T = \begin{bmatrix} 1 & 0 & 0 & t_x \ 0 & 1 & 0 & t_y \ 0 & 0 & 1 & t_z \ 0 & 0 & 0 & 1 \end{bmatrix} $$
变换后:$P' = T \cdot P = (x + t_x, y + t_y, z + t_z, 1)$。 -
缩放矩阵:沿各轴缩放 $(s_x, s_y, s_z)$ 倍,
$$ S = \begin{bmatrix} s_x & 0 & 0 & 0 \ 0 & s_y & 0 & 0 \ 0 & 0 & s_z & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$
变换后:$P' = S \cdot P = (s_x x, s_y y, s_z z, 1)$。 -
旋转矩阵:绕坐标轴旋转 $\theta$ 角(右手定则,旋转方向与轴方向满足右手螺旋),
- 绕x轴旋转:
$$ R_x(\theta) = \begin{bmatrix} 1 & 0 & 0 & 0 \ 0 & \cos\theta & -\sin\theta & 0 \ 0 & \sin\theta & \cos\theta & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$ - 绕y轴旋转:
$$ R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta & 0 \ 0 & 1 & 0 & 0 \ -\sin\theta & 0 & \cos\theta & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$ - 绕z轴旋转:
$$ R_z(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 & 0 \ \sin
- 绕x轴旋转: