游戏数学

作者: 龙遁流 | 来源:发表于2020-04-20 11:49 被阅读0次
    点与矢量

    简书不识别公式,有道云支持,后续修改

    • 点(2维或3维)
    • 坐标系
      • 类型

        根据实际情况选择合适坐标系

        • 笛卡尔坐标系 (x, y, z)
        • 圆柱坐标系 (h, r, $\theta$
        • 球坐标系 (r, $\phi$, $\theta$
      • 方向

        反转任意轴即可相互转换,一般使用左手坐标系

        • 左手坐标系 (使用左手判定)
        • 右手坐标系 (使用右手判定)
    • 矢量
      • 基矢量
      • 矢量运算
        • 矢量和标量乘法
          • 单标量
          • 分量乘法(阿达马积 Hadamard product)
        • 加法和减法
          • 矢量之间
          • 点和方向之间
        • 归一化和单位矢量
        • 法矢量
        • 点积和投影
          • 点积判定
            • 共线
            • 共线但反方向
            • 垂直
            • 相同方向
            • 相反方向
        • 叉积
          • 方向 (随着坐标系的选择而改变)
          • 反交换律
          • 绕笛卡儿积的正旋方向
      \vec{i}\times\vec{j} = -(\vec{j}\times\vec{i}) = \vec{k}
      
      \vec{j}\times\vec{k} = -(\vec{k}\times\vec{j}) = \vec{i}
      
      \vec{k}\times\vec{i} = -(\vec{i}\times\vec{k}) = \vec{j}
      
      • 点和矢量的线性插值
      \vec{L}=LERP(\vec{A},\vec{B},\beta)
      
      =(1-\beta)\vec{A}+\beta\vec{B}
      
      =[(1-\beta)A_x+\beta B_x,
      (1-\beta)A_y+\beta B_y,
      (1-\beta)A_z+\beta B_z]
      
    • 矩阵
      • 乘法

      • 列矢量和行矢量(影响其与矩阵乘法的形式)

      • 单位矩阵

      • 逆矩阵

        • 高斯消去法
        • LU分解法
      • 转置矩阵

      • 齐次坐标

        • 点或矢量从三维延伸到四维
        • 表示点的平移
        • 点的w的分量为1,方向矢量的w分量为0
        • 四维齐次坐标转换为三维非齐次坐标,将各分量除以w
      • 基础变换矩阵

        • 特点
          • 主行矢量
          • U代表旋转及或旋转
          • t 代表平移矢量
        \begin{bmatrix} U_{3\times3} & 0_{3\times1} \\ t_{1\times3} & 1\end{bmatrix}
        
        • 平移
        • 旋转
          • 纯旋转矩阵的逆矩阵,即其转置矩阵
        rotate_x(\vec{r},\phi)=[r_x,r_y,r_z,1]\begin{bmatrix}
        1&0&0&0\\
        0&\cos\phi&\sin\phi&0\\
        0&-\sin\phi&\cos\phi&0\\
        0&0&0&1\end{bmatrix}
        
        rotate_y(\vec{r},\theta)=[r_x,r_y,r_z,1]\begin{bmatrix}
        \cos\theta&0&-\sin\theta&0\\
        0&1&0&0\\
        \sin\theta&0&\cos\theta&0\\
        0&0&0&1\end{bmatrix}
        
        rotate_z(\vec{r},\gamma)=[r_x,r_y,r_z,1]\begin{bmatrix}
        \cos\gamma&\sin\gamma&0&0\\
        -\sin\gamma&\cos\gamma&0&0\\
        0&0&1&0\\
        0&0&0&1\end{bmatrix}
        
        • 缩放
          • 统一缩放
          • 非统一缩放
        \vec{r}S=[r_x,r_y,r_z,1]\begin{bmatrix}
        s_x&0&0&0\\
        0&s_y&0&0\\
        0&0&s_z&0\\
        0&0&0&1\end{bmatrix}
        
        • 4x3矩阵
          • 4x4仿射矩阵必然有一列基矢量,可省去以节省内存
      • 坐标空间

        • 模型空间
          • 前,上,左右(F,U,L/F)
          • 欧拉角
            • 俯仰角$\phi$ 绕L/F pitch
            • 偏航角$\theta$ 绕U yaw
            • 滚动角$\psi$ 绕F roll
        • 世界空间
          • 固定坐标空间
          • 联系其他单个物体
        • 观察空间
          • 固定于摄像机的坐标系
          • 原点在摄像机的焦点
          • OpenGL的摄像机坐标系为右手坐标系
      • 基的变更

        • 坐标系是相对的
        • 其他坐标空间直接或间接地相对于世界空间
        • 坐标变换
          • $\vec{w}_c$是子空间轴相对于父空间的位置
          • $\vec{i}_c$, $\vec{j}_c$, $\vec{k}_c$ 都是子空间的轴在父空间的坐标表示
        P_p=P_cM_{c->p}
        
        M_{c->p}=\begin{bmatrix}
        \vec{i}_c&0\\
        \vec{j}_c&0\\
        \vec{k}_c&0\\
        \vec{w}_c&0\end{bmatrix}
        
        • 缩放子轴
        • 从矩阵中获取单位基矢量
        • 变换坐标系vs变换矢量
          • 某矩阵把矢量从子空间变换至父空间,则该矩阵同时也把坐标轴从父空间变换至子空间
        • 约定
          • 变换施于矢量而非坐标轴
          • 把矢量写成行而非列
          • 但也需要具体问题具体分析
      • 变换法矢量

        • 注意确保维持其长度和垂直性
        • $M_{A->B}$表示将点或矢量(非法矢)从空间A变换到B,若$M_{A->B}$只含统一缩放而无切变,则其可变换法矢量,否则不可。若$M_{A->B}$含非统一缩放或切变(非正交),则可用$(M^{-1}_{A->B})^T$逆转置矩阵变换法矢量。
      • 内存中存储矩阵

        • 行存储
        • 列存储
    • 四元数
      • 矩阵变换的缺点
        • 矩阵使用9个浮点值表示旋转,有冗余,因为旋转只有三个自由度
        • 矩阵乘法旋转矢量,乘法加法运算次数多
        • 矩阵难以插值
      • 把单位四元数视为三维旋转
        • $\vec{a}$为单位旋转轴,右手法则旋转
        • $\theta$为旋转角度
        q=[\vec{q}_v\quad q_s]=[\vec{a}\sin{\frac{\theta}{2}}\quad\cos{\frac{\theta}{2}}]
        
        q_x^2+q_y^2+q_z^2+q_w^2=1
        
      • 四元数运算
        • 乘法 (格拉斯曼积 Grassmann product)
        pq=\left[(p_s\vec{q}_v+q_s\vec{p}_v+\vec{p}_v\times\vec{q}_v)\quad(p_sq_s-\vec{p}_v\cdot\vec{q}_v)\right]
        
        \text{p,q为旋转,先旋转q,再旋转p}
        
        • 共轭及逆四元数
        \text{逆四元数满足}\quad
        qq^{-1}=1\quad\text{则}\quad
        q^{-1}=\frac{q^*}{{\begin{vmatrix}q\end{vmatrix}}^2}
        
        \text{共轭}\quad
        q^{*}=[-\vec{q}_v\quad q_s]
        
        \text{逆}\quad
        q^{-1}=q^*\quad\text{当}{\begin{vmatrix}q\end{vmatrix}}=1
        
        • 积的共轭及逆四元数
        (pq)^*=q^*p^*
        
        (pq)^{-1}=q^{-1}p^{-1}
        
      • 以四元数旋转矢量
        • 将矢量写作四元数形式
        v=[\vec{v}\quad0]
        
        • 旋转
        v^{\prime}=rotate(q,\vec{v})=qvq^{-1}=qvq^*
        
        \text{或}\quad
        \vec{v}^{\prime}=rotate(q,\vec{v})=\vec{v}+2\vec{q}_v\times(\vec{q}_v\times\vec{v}+q_s\vec{v})
        
        • 四元数的串接
          • 矩阵的串接
          \vec{v}^{\prime}=\vec{v}R_1R_2R_3=\vec{v}R_{net}
          
          • 四元数的串接
          v^{\prime}=q_3q_2q_1vq_1^{-1}q_2^{-1}q_3^{-1}=q_{net}vq_{net}^{-1}
          
      • 等价的四元数和矩阵
      \text{设}
      q=[x\quad y\quad z\quad w]\text{, 则}
      
      R=\begin{bmatrix}
      1-2y^2-2z^2&2xy+2zw&2xy-2yw\\
      2xy-2zw&1-2x^2-2z^2&2yz+2xw\\
      2xz+zyw&2yz-2xw&1-2x^2-2y^2
      \end{bmatrix}    
      
      • 旋转性的线性插值

        • 线性插值
        q_{lerp}=LERP(q_A,q_B,\beta)
        
        =\frac{(1-\beta)q_A+\beta q_B}{\begin{vmatrix}(1-\beta)q_A+\beta q_B\end{vmatrix}}
        
        =normalize\left({\begin{bmatrix}
        (1-\beta)q_{A_x}+\beta q_{B_x}\\
        (1-\beta)q_{A_y}+\beta q_{B_y}\\
        (1-\beta)q_{A_z}+\beta q_{B_z}\\
        (1-\beta)q_{A_w}+\beta q_{B_w}
        \end{bmatrix}}^T \right)
        

        缺点:四元数其实是四维超球上的点。LERP实际上是沿超球的弦上进行插值,而不是在超球面上插值。这样导致----当$\beta$以恒定速度改变时,旋转动画并非以恒定角速度进行,两端慢,中间快。

        • 球面线性插值
        q_{slerp}=SLERP(p,q,\beta)
        
        =\frac{\sin{((1-\beta)\theta)}}{\sin\theta}p+\frac{\sin{(\beta \theta)}}{\sin\theta}q
        
        \cos\theta=p\cdot q
        
    • 比较各种旋转表达方式
      • 欧拉角
        • 简单直观

        • 围绕单轴的旋转容易插值,但注意任意方向轴的插值

        • 万向节锁

          当旋转$90^{\degree}$时,三主轴中的一个会与另一个主轴完全对齐。

        • 旋转顺序对结果产生影响

      • $3\times3$矩阵
        • 独一无二的表达任意旋转
        • 方便但不直观
        • 不容易插值,存储空间大
      • 轴角
        • 直观,存储少 $[\vec{a}\quad \theta]$
        • 不方便插值
        • 必须转换为矩阵或四元数使用
      • 四元数
        • 可串接旋转
        • 可直接作用于点和矢量
        • 插值方便
        • 存储少,利用旋转时$q$等效为$-q$且为单位四元数可以少存储一个元素
      • $SQT$变换
        • 四元数结合平移矢量和缩放因子
        SQT=[\vec{s}\quad q\quad \vec{t}]
        
        • 容易插值,平移矢量和缩放因子采用$LREP$,四元数采用$SLREP$
      • 对偶四元数
        • 可完整表时涉及旋转、平移、缩放的变换
        \hat a=a_0+\varepsilon a_{\varepsilon}
        
      • 旋转和自由度
        • 指物体有多少个互相独立的可变状态(位置和定向)。
        • 自由度$DOF$
          N_{DOF}=N_{\text{参数}}-N_{\text{约束}}
          
          类别 参数个数 约束个数 约束
          欧拉角 3 0
          轴角 4 1 轴矢量为单位长度
          四元数 4 1 四元数为单位长度
          矩阵 9 6 每个行和列矢量为单位长度
    • 其他数学对象
      • 直线、光线及线段
        • 参数式方程
      • 球体
        • 存储为$[C_x\quad C_y\quad C_z\quad r]$
      • 平面
        • 一般式及点法式
          Ax+By+Cz+D=0
          
          \vec{n}\cdot\vec{P}=-d
          
        • 存储为$\vec{L}=[\vec{n}\quad d]$
        • 使用逆转置矩阵可以把$\vec{L}$从一空间转换为另一空间
      • 轴对齐包围盒(AABB)
        • 三维长方体,6个面都与某坐标系的正交轴对齐
        • $[x_{min}\quad x_{max}\quad y_{min}\quad y_{max}\quad z_{min}\quad z_{max}]$
        • 检测一点P是否在AABB盒内
        x_{min} \leq P_x \leq x_{max} ,
        
        y_{min} \leq P_y \leq y_{max} ,
        
        z_{min} \leq P_z \leq z_{max}
        
        • 用作碰撞检测的早期淘汰测试
          • AABB盒相交
      • 定向包围盒(OBB)
        • 三维长方体,其定向与其包围的物体按照某逻辑方式对齐,通常与物体的局部空间轴对齐
        • 可将点变换到与OBB对齐的坐标空间,在使用AABB相交测试
      • 平截头体
        • 观察空间中
        • 用点积测出某点是在每个平面的前面还是后面,可以判断点是否在平截头体内。
        • 或,把要测试的世界空间点,通过透视变换到齐次裁剪空间。则世界空间的平截头体在此空间变为AABB
      • 凸多面体区域
        • 由任意数量的平面集合定义,平面的法线全部向内或向外。
        • 适合作为任何形状的出发区域
    • 硬件加速的SIMD运算
      • SSE寄存器
        • 在32位浮点包裹模式中,每个SSE寄存器含4个32位float
        • Visual Studio 编译器提供内建数据类型__m128
        • __m128变量需要16字节对齐
    • 产生随机数
      • 线性同余产生器LGG
      • 梅森旋转算法MT(SFMT实现)
      • 所有伪随机数产生器之母及Xorshift
    OpenGL
    • View Matrix

    • Perspective Projection Matrix

    P=\begin{bmatrix}
    \frac{1}{aspect\,\tan{\frac{\theta}{2}}}&0&0&0\\0&\frac{1}{\tan{\frac{\theta}{2}}}&0&0\\
    0&0&-\frac{f+n}{f-n}&-\frac{2fn}{f-n}\\
    0&0&-1&0
    \end{bmatrix}
    
    \text{[r,l]   [t,b]}
    
    P=\begin{bmatrix}
    \frac{2n}{r-l}&0&\frac{r+l}{r-l}&0\\
    0&\frac{2n}{t-b}&\frac{t+b}{t-b}&0\\
    0&0&-\frac{f+n}{f-n}&-\frac{2fn}{f-n}\\
    0&0&-1&0
    \end{bmatrix}
    
    \text{if r=-l, t=-b}
    
    P=\begin{bmatrix}
    \frac{n}{r}&0&\frac{r+l}{r-l}&0\\
    0&\frac{2n}{t-b}&\frac{t+b}{t-b}&0\\
    0&0&-\frac{f+n}{f-n}&-\frac{2fn}{f-n}\\
    0&0&-1&0
    \end{bmatrix}
    
    • Orthographic Projection Matrix
    O=\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}
    
    \text{if r=-l, t=-b}
    
    O=\begin{bmatrix}
    \frac{1}{r}&0&0&0\\
    0&\frac{1}{t}&0&0\\
    0&0&-\frac{2}{f-n}&-\frac{f+n}{f-n}\\
    0&0&0&1
    \end{bmatrix}
    
    DirectX

    相关文章

      网友评论

        本文标题:游戏数学

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