3D数学基础

2019-02-27  本文已影响0人  Codifier

3D数学基础

1.向量

1.1 定义

向量是有大小和方向的有向线段,向量没有位置,只有大小和方向

1.2 向量运算

1.2.1 向量的模

表示该向量距离原点的距离
\mid\mid{V}\mid\mid {=} \sqrt[]{\sum_{i=1}^n{v_i^2}}=\sqrt[]{v_1^2+v_2^2+\cdots+v_{n-1}^2+v_n^2}

1.2.2 单位向量

使该向量的方向不变,大小变为1
\hat{V} = \frac{V}{\mid\mid{V}\mid\mid}

1.2.3 向量的点乘

表示向量a的模与向量b在向量a上的投影的乘积,其结果是一个标量,可以用来判断向量a与向量b是否在同一侧,还能计算这两个向量之间的夹角
{a}\cdot{b} = \sum_{i=1}^{n}{a_ib_i}

{a}\cdot{b} = \mid\mid{a}\mid\mid\ast\mid\mid{b}\mid\mid\ast\cos\theta

如果a与b点乘的结果大于0,表示a与b之间的夹角在0到90度之间,a与b在同一方向

如果a与b点乘的结果等于0,表示a与b之间的夹角为90度,a与b垂直

如果a与b点乘的结果小于0,表示a与b之间的夹角在90到180度之间,a与b在相反方向

应用场景:把自己想象成一个剑士,你的周围都是怪物,如果你想去打与自己在同一侧而且距离最近的怪,这时就可以遍历自己周围所有的怪物,然后分别计算点乘和距离,找出点乘的结果大于0并且距离最小的怪物,再计算出你与该怪物的夹角,旋转过去,面向它,开始杀戮吧

1.2.4 向量的叉积

获取一个与向量a和向量b所在平面垂直的向量

向量a和向量b叉积的模:
\mid\mid{a}\times{b}\mid\mid = \mid\mid{a}\mid\mid\ast\mid\mid{b}\mid\mid\ast\sin\theta
表示以b的模为底、a的模乘以sinθ为高的平行四边形的面积

应用场景:我首先想到的是3D里面的法线,也不知道对不对,以后玩OpenGL的时候再说

2. 矩阵

2.1 线性变换

a为一个行向量,M为一个变换矩阵,那么行向量a可以经过矩阵M的变换以后得到一个新的行向量,在3D中,如果该变换矩阵为旋转矩阵,则意味着对原来的物体进行了旋转操作,如果该矩阵为缩放矩阵,则意味对原物体进行了缩放操作等等
aM = b

\begin{bmatrix} {x}&{y}&{z} \end{bmatrix} \begin{bmatrix} {p_{x}}&{p_{y}}&{p_z}\\ {q_{x}}&{q_{y}}&{q_z}\\ {r_{x}}&{r_{y}}&{r_z}\end{bmatrix} = \begin{bmatrix} {x{p_{x}}+y{q_{x}}+z{r_{x}}}&{x{p_{y}}+y{q_{y}}+z{r_{y}}}&{x{p_{z}}+y{q_{z}}+z{r_{z}}} \end{bmatrix}

2.2 变换矩阵

2.2.1 旋转矩阵

二维平面旋转矩阵:
R(\theta) = \begin{bmatrix} {\cos\theta}&{\sin\theta}\\ {-\sin\theta}&{\cos\theta} \end{bmatrix}
三维空间旋转矩阵(左手坐标系):

绕x轴旋转:
R_x(\theta) = \begin{bmatrix} {1}&{0}&{0}\\ {0}&{\cos\theta}&{\sin\theta}\\ {0}&{-\sin\theta}&{\cos\theta} \end{bmatrix}
绕y轴旋转:
R_y(\theta) = \begin{bmatrix} {\cos\theta}&{0}&{-\sin\theta}\\ {0}&{1}&{0}\\ {\sin\theta}&{0}&{\cos\theta} \end{bmatrix}
绕z轴旋转:
R_z(\theta) = \begin{bmatrix} {\cos\theta}&{\sin\theta}&{0}\\ {-\sin\theta}&{\cos\theta}&{0}\\ {0}&{0}&{1} \end{bmatrix}

2.2.2 缩放矩阵

二维平面缩放矩阵:
S(k_x,k_y) = \begin{bmatrix} {k_x}&{0}\\ {0}&{k_y}\\ \end{bmatrix}
三维空间缩放矩阵:
S(k_x,k_y,k_z) = \begin{bmatrix} {k_x}&{0}&{0}\\ {0}&{k_y}&{0}\\ {0}&{0}&{k_z}\end{bmatrix}

\begin{bmatrix} {x}&{y}&{z} \end{bmatrix} \begin{bmatrix} {k_x}&{0}&{0}\\ {0}&{k_y}&{0}\\ {0}&{0}&{k_z} \end{bmatrix}= \begin{bmatrix} {k_xx}&{k_yy}&{k_zz} \end{bmatrix}

2.2.3 正交投影矩阵

二维平面正交投影矩阵:

投影到x轴:
P(x) = \begin{bmatrix} {1}&{0}\\ {0}&{0} \end{bmatrix}
投影到y轴:
P(y) = \begin{bmatrix} {0}&{0}\\ {0}&{1}\\ \end{bmatrix}
三维空间正交投影矩阵:

投影到xy平面:
P(x,y) = \begin{bmatrix} {1}&{0}&{0}\\ {0}&{1}&{0}\\ {0}&{0}&{0} \end{bmatrix}
投影到xz平面:
P(x,z) = \begin{bmatrix} {1}&{0}&{0}\\ {0}&{0}&{0}\\ {0}&{0}&{1} \end{bmatrix}
投影到yz平面:
P(y,z) = \begin{bmatrix} {0}&{0}&{0}\\ {0}&{1}&{0}\\ {0}&{0}&{1} \end{bmatrix}

2.2.4 镜像矩阵

二维平面镜像矩阵(任意轴):
M(n_x,n_y) = \begin{bmatrix} {1-2{n_x}^2}&{-2n_xn_y}\\ {-2n_xn_y}&{1-2{n_y}^2} \end{bmatrix} ,其中(n_x,n_y)为垂直于镜像轴的单位向量
三维空间镜像矩阵(任意平面):
M(n_x,n_y,n_z) = \begin{bmatrix} {1-2{n_x}^2}&{-2n_xn_y}&{-2n_xn_z}\\ {-2n_xn_y}&{1-2{n_y}^2}&{-2n_yn_z}\\ {-2n_xn_z}&{-2n_yn_z}&{1-2{n_z}^2} \end{bmatrix} ,其中(n_x,n_y,n_z)为垂直于镜像平面的单位向量

2.2.5 切变矩阵

二维平面切变矩阵:

x轴方向发生切变(y值不变,影响x的值),s为切变量:
H_x(s) = \begin{bmatrix} {1}&{0}\\ {s}&{1} \end{bmatrix}

y轴方向发生切变(x值不变,影响y的值),s为切变量:
H_y(s) = \begin{bmatrix} {1}&{s}\\ {0}&{1} \end{bmatrix}
三维空间切变矩阵:

xy平面发生切变(z值不变,影响x和y的值),s和t分别为不同轴向上的切变量:
H_{xy}(s,t) = \begin{bmatrix} {1}&{0}&{0}\\ {0}&{1}&{0}\\ {s}&{t}&{1}\\ \end{bmatrix}
xz平面发生切变(y值不变,影响x和z的值),s和t分别为不同轴向上的切变量:
H_{xz}(s,t) = \begin{bmatrix} {1}&{0}&{0}\\ {s}&{1}&{t}\\ {0}&{0}&{1} \end{bmatrix}
yz平面发生切变(x值不变,影响y和z的值),s和t分别为不同轴向上的切变量:
H_{yz}(s,t) = \begin{bmatrix} {1}&{s}&{t}\\ {0}&{1}&{0}\\ {0}&{0}&{1}\\ \end{bmatrix}

2.3 行列式的几何意义

二阶方阵行列式:表示这两个二维向量(水平方向)所围成的平行四边形的面积

三阶方阵行列式:表示这三个三维向量(水平方向)所围成的立方体的体积

2.4 矩阵的逆的几何意义

某个矩阵进行旋转、缩放等线性变换之后,如果对变换结果不满意,此时可以使用矩阵的逆进行撤销操作,使其回到最初的状态

2.5 齐次矩阵

如果我们给行向量增加一列,给变换矩阵增加一行和一列,然后再相乘,如下所示:
\begin{bmatrix} {x}&{y}&{z}&{1} \end{bmatrix} \begin{bmatrix} {p_{x}}&{p_{y}}&{p_z}&{0}\\ {q_{x}}&{q_{y}}&{q_z}&{0}\\ {r_{x}}&{r_{y}}&{r_z}&{0}\\ {0}&{0}&{0}&{1} \end{bmatrix} = \begin{bmatrix} {x{p_{x}}+y{q_{x}}+z{r_{x}}}&{x{p_{y}}+y{q_{y}}+z{r_{y}}}&{x{p_{z}}+y{q_{z}}+z{r_{z}}}&{1} \end{bmatrix}
由结果可以看出,尽管我们把行向量和变换矩阵都给扩大了一维,但是对最终的变换结果没有任何影响,利用这一性质,我们只需稍作修改就能在进行变换的同时进行平移,如下所示:
\begin{bmatrix} {x}&{y}&{z}&{1} \end{bmatrix} \begin{bmatrix} {p_x}&{p_y}&{p_z}&{0}\\ {q_x}&{q_y}&{q_z}&{0}\\ {r_x}&{r_y}&{r_z}&{0}\\ {\Delta{x}}&{\Delta{y}}&{\Delta{z}}&{1}\\ \end{bmatrix} = \begin{bmatrix} {x{p_{x}}+y{q_{x}}+z{r_{x}}+\Delta{x}}&{x{p_{y}}+y{q_{y}}+z{r_{y}}+\Delta{y}}&{x{p_{z}}+y{q_{z}}+z{r_{z}}+\Delta{z}}&{1} \end{bmatrix}
平移矩阵:
\begin{bmatrix} {x}&{y}&{z}&{1} \end{bmatrix} \begin{bmatrix} {1}&{0}&{0}&{0}\\ {0}&{1}&{0}&{0}\\ {0}&{0}&{1}&{0}\\ {\Delta{x}}&{\Delta{y}}&{\Delta{z}}&{1} \end{bmatrix} = \begin{bmatrix} {x+\Delta{x}}&{y+\Delta{y}}&{z+\Delta{z}}&{1} \end{bmatrix}

3. 欧拉角

3.1 欧拉角的组成

heading角(yaw角):绕y轴旋转的旋转角(左手坐标系)

pitch角:绕x轴旋转的旋转角(左手坐标系)

bank角(roll角):绕z轴旋转的旋转角(左手坐标系)

3.2 万向锁

一旦选择pitch角为正负90度,就被限制在只能绕垂直轴旋转

4. 四元数

绕任意轴旋转的四元数表示方法:
q = \begin{bmatrix} {cos({\theta/2})}&{sin({\theta/2})*\vec{n}} \end{bmatrix}\\ = \begin{bmatrix} {cos({\theta/2})}&{sin({\theta/2})*n_x}&{sin({\theta/2})*n_y}&{sin({\theta/2})*n_z} \end{bmatrix}

上一篇下一篇

猜你喜欢

热点阅读