1 三角函数

1.1 圆周率

\pi \approx 3.14159265f

实际上\pi有无穷个小数。

1.2 余弦与正弦

计算机图形学 – 常用的3D数学知识备忘,如三角函数、向量运算、矩阵运算、图形学常用的平移缩放旋转矩阵,视图矩阵,投影矩阵-StubbornHuang Blog

1.3 单位圆

计算机图形学 – 常用的3D数学知识备忘,如三角函数、向量运算、矩阵运算、图形学常用的平移缩放旋转矩阵,视图矩阵,投影矩阵-StubbornHuang Blog

t 是以弧度为单位的角度。

1.4 弧度与角度的转换

角度转弧度:

angleRad = angleDeg * Math.PI / 180;

弧度转角度:

angleDeg = angleRad * 180 / Math.PI;

2 向量

2.1 向量加法

两个向量的和组成一个三角形。

计算机图形学 – 常用的3D数学知识备忘,如三角函数、向量运算、矩阵运算、图形学常用的平移缩放旋转矩阵,视图矩阵,投影矩阵-StubbornHuang Blog

同时:

a = c - b \\
b = c - a

2.2 单位向量 - 归一化向量

单位向量用于表示方向或者法向,长度为1。

\hat{A} = \frac{\vec{A} }{\left \|\vec{A} \right \| }

其中 {\left |\vec{A} \right | }\hat{A} 的长度。

2.3 向量点乘

向量点乘可用于获取两个向量之间的夹角。

\vec{A} \cdot \vec{B}=\sum_{i=1}^{n} A_{i} B_{i}=A_{1} B_{1}+A_{2} B_{2}+\cdots+A_{n} B_{n}

向量点乘的结果为标量值。

那么两个向量的夹角等于:

\theta = \arccos (\hat{A}\cdot\hat{B} ) \\
\theta = \arccos (\frac{\hat{A} \cdot \hat{B} }{\left \| \hat{A} \right \| \left \| \hat{B} \right \| } )

当两个向量之间的夹角为90度时,这两个向量的点积为0;当两个向量的夹角为0度时,这两个向量的点积为1。

2.4 向量叉乘

向量叉乘生成一个垂直于向量A和向量B共有平面的新向量。

计算机图形学 – 常用的3D数学知识备忘,如三角函数、向量运算、矩阵运算、图形学常用的平移缩放旋转矩阵,视图矩阵,投影矩阵-StubbornHuang Blog

向量叉乘形式如下:

\left[\begin{array}{l}
a_{1} \\
a_{2} \\
a_{3}
\end{array}\right] \times\left[\begin{array}{l}
b_{1} \\
b_{2} \\
b_{3}
\end{array}\right]=\left[\begin{array}{l}
a_{2} b_{3}-a_{3} b_{2} \\
a_{3} b_{1}-a_{1} b_{3} \\
a_{1} b_{2}-a_{2} b_{1}
\end{array}\right]

向量叉乘可用于计算平面的法向:

N = normalize(cross(A,B))

3 矩阵

3.1 单位矩阵

在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵。它是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。除此以外全都为0。

I_{3}=\left[\begin{array}{lll}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{array}\right]

如果 AB=I,那么矩阵 A 为 矩阵 B 的逆。

3.2 矩阵与向量相乘

\left[\begin{array}{ccc}
a & b & c \\
d & e & f \\
g & h & i
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z
\end{array}\right]=\left[\begin{array}{c}
a x+b y+c z \\
d x+e y+f z \\
g x+h y+i z
\end{array}\right]

3.3 矩阵与矩阵相乘

A B=\left[\begin{array}{ll}
a & b \\
c & d
\end{array}\right]\left[\begin{array}{ll}
e & f \\
g & h
\end{array}\right]=\left[\begin{array}{ll}
a e+b g & a f+b h \\
c e+d g & c f+d h
\end{array}\right]

3.4 矩阵行列式

假如矩阵M为:

M=\left[\begin{array}{lll}
a & b & c \\
d & e & f \\
g & h & i
\end{array}\right]

则其行列式 \left | M \right | 为:

|M|=a e i+b f g+c d h-c e g-b d i-a f h

3.5 矩阵转置

假如矩阵M为:

M=\left[\begin{array}{lll}
a & b & c \\
d & e & f \\
g & h & i
\end{array}\right]

在上述矩阵在主对角线上翻转矩阵元素得到矩阵的转置。

则其转置矩阵M^{T}为:

M^{T}=\left[\begin{array}{lll}
a & d & g \\
b & e & h \\
c & f & i
\end{array}\right]

当矩阵为正交矩阵时,矩阵的转置矩阵就为矩阵的逆。

3.6 矩阵的逆

通常使用逆矩阵翻转矩阵变换或者相对于另一个对象进行变换。

MM^{-1} = I

其中I为单位矩阵,M^{-1}为逆矩阵。

如果矩阵的行列式为 0,则没有逆矩阵。

4 齐次矩阵

4.1 行主序齐次矩阵

行主序齐次矩阵在Direct3D中使用,

v^{\prime}=\left[\begin{array}{llll}
V_{x} & V_{y} & V_{z} & 1
\end{array}\right]\left[\begin{array}{cccc}
X_{x} & X_{y} & X_{z} & 0 \\
Y_{x} & Y_{y} & Y_{z} & 0 \\
Z_{x} & Z_{y} & Z_{z} & 0 \\
T_{x} & T_{y} & T_{z} & 1
\end{array}\right]

4.2 列主序齐次矩阵

列主序齐次矩阵在OpenGL中使用,

v^{\prime}=\left[\begin{array}{cccc}
X_{x} & Y_{x} & Z_{x} & T_{x} \\
X_{y} & Y_{y} & Z_{y} & T_{y} \\
X_{z} & Y_{z} & Z_{z} & T_{z} \\
0 & 0 & 0 & 1
\end{array}\right]\left[\begin{array}{c}
V_{x} \\
V_{y} \\
V_{z} \\
1
\end{array}\right]

4.3 平移、缩放、旋转

列主序下的平移矩阵

T=\left[\begin{array}{cccc}
1 & 0 & 0 & T_{x} \\
0 & 1 & 0 & T_{y} \\
0 & 0 & 1 & T_{z} \\
0 & 0 & 0 & 1
\end{array}\right]

列主序下的缩放矩阵

S=\left[\begin{array}{cccc}
S_{x} & 0 & 0 & 0 \\
0 & S_{y} & 0 & 0 \\
0 & 0 & S_{z} & 0 \\
0 & 0 & 0 & 1
\end{array}\right]

列主序下的旋转矩阵

R_{x}=\left[\begin{array}{cccc}
1 & 0 & 0 & 0 \\
0 & \cos (\theta) & -\sin (\theta) & 0 \\
0 & \sin (\theta) & \cos (\theta) & 0 \\
0 & 0 & 0 & 1
\end{array}\right]
R_{y}=\left[\begin{array}{cccc}
\cos (\theta) & 0 & \sin (\theta) & 0 \\
0 & 1 & 0 & 0 \\
-\sin (\theta) & 0 & \cos (\theta) & 0 \\
0 & 0 & 0 & 1
\end{array}\right]
R_{z}=\left[\begin{array}{cccc}
\cos (\theta) & -\sin (\theta) & 0 & 0 \\
\sin (\theta) & \cos (\theta) & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{array}\right]

4.4 视图矩阵

列主序下的视图矩阵,

V=\left[\begin{array}{cccc}
R_{x} & R_{y} & R_{z} & -P_{x} \\
U_{x} & U_{y} & U_{z} & -P_{y} \\
-F_{x} & -F_{y} & -F_{z} & -P_{z} \\
0 & 0 & 0 & 1
\end{array}\right]

其中U为视点的向上向量,F为视点的向前向量,P为摄像机的世界坐标。

鸟瞰图的视图矩阵为:

V=\left[\begin{array}{cccc}
1 & 0 & 0 & 0 \\
0 & 0 & -1 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1
\end{array}\right]

4.5 投影矩阵

列主序下的投影矩阵,

P=\left[\begin{array}{cccc}
S_{x} & 0 & 0 & 0 \\
0 & S_{y} & 0 & 0 \\
0 & 0 & S_{z} & P_{z} \\
0 & 0 & -1 & 0
\end{array}\right]

其中:

\begin{array}{l}
S_{x}=(2 * \text { near }) /(\text { range } * \text { aspect }+\text { range } * \text { aspect }) \\
S_{y}=\text { near/range } \\
S_{z}=-(\text { far }+\text { near }) /(\text { far }-\text { near }) \\
P_{z}=-(2 * \text { far } * \text { near }) /(\text { far }-\text { near }) \\
\text { range }=\tan (\text { fov } / 2) * \text { near }
\end{array}

4.6 常用的矩阵变换

计算机图形学 – 常用的3D数学知识备忘,如三角函数、向量运算、矩阵运算、图形学常用的平移缩放旋转矩阵,视图矩阵,投影矩阵-StubbornHuang Blog

Model Matrix:模型矩阵,即4.3节中所述的平移、缩放、旋转变换;
View Matrix:视图矩阵,即4.4节中所述的视图矩阵;
Projection Matrix:投影矩阵,即4.5节中所述的投影矩阵;

模型坐标通过模型矩阵(即平移、缩放、旋转变换)转化为世界空间坐标,再通过视图矩阵变为相机坐标,最后通过投影矩阵变为齐次坐标。

参考链接

  1. https://antongerdelan.net/teaching/3dprog1/maths_cheat_sheet.pdf
  2. http://www.opengl-tutorial.org/miscellaneous/math-cheatsheet/
  3. https://gist.github.com/xem/99930986c5333125a13b0ea50600391f