美文网首页
3D数学基础

3D数学基础

作者: Codifier | 来源:发表于2019-02-27 11:59 被阅读0次

    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}

    相关文章

      网友评论

          本文标题:3D数学基础

          本文链接:https://www.haomeiwen.com/subject/jfixuqtx.html