第四章主要是关于学习游戏引擎时所需的一些数学的基础知识。
游戏所需的三维数学
· 在二维中解决三维问题
· 点和矢量
· 点和坐标
· 笛卡尔坐标系
· 圆柱坐标系
· 球坐标系
· 左手坐标系与右手坐标系
· 矢量
· 笛卡儿基矢量:三个正交单位矢量i,j,k
· 矢量运算
· 矢量和标量的乘法:缩放
· 非统一缩放:阿达马积
· 加法和减法
· 点和方向的加减
· 模
· 矢量运算的实际应用
· 避免计算平方根
· 归一化和单位矢量
· 法矢量
· 点积和投影
· 矢量投影
· 模作为点积
· 点积判定
· 其他点积的应用
· 测试敌人在玩家的前面或后面
· 计算任一点距平面的高度
· 叉积
· 叉积的模
· 叉积的方向
· 叉积的特性
· 反交换律
· 分配律
· 叉积的实际应用
· 求垂直于两个矢量的矢量
· 求平面法矢量
· 物理模拟:计算力矩
· 点和矢量的线性插值
· 计算两个点之间的中间点
· 矩阵
· 矩阵乘法
· 以矩阵表示点和矢量
· 采用1*n行矢量乘以n*n矩阵时,矢量必须置于矩阵的左方
· 把n*n矩阵乘以n*1列矢量时,矢量必须置于矩阵的右方
· 单位矩阵
· 逆矩阵
· 矩阵A的逆矩阵能还原矩阵A的变换
· 矩阵串接后求逆,相当于反向串接各个矩阵的逆矩阵
· 转置矩阵
· 计算转置矩阵比计算一般矩阵快
· 对于基于行矢量和列矢量的库,两者的矩阵是转置关系
· 矩阵串接的转置为反向串接各个矩阵的转置
· 齐次坐标
· 变换方向矢量
· 把方向矢量的w设为0
· 基础变换矩阵
· 平移
· 旋转
· 缩放
· 4x3矩阵
· 省略第四列,节省内存
· 坐标空间
· 模型空间
· 世界空间
· 观察空间
· 基的变更
· 坐标空间的层次结构
· 建构改变基的矩阵
· 从矩阵中获取单位基矢量
· 变换坐标系还是矢量
· 变换法矢量
· 法矢量可以使用变换矩阵的逆转置矩阵做变换
· 变换矩阵只含同一缩放无切变时,矩阵可施于任何矢量
· 内存中存储矩阵
· 把矢量连续置于内存
· 分散对齐
· 四元数
· 把单位四元数视为三维旋转
· 矢量qv,标量qs
· q=[qv,qs]
· q=[qx,qy,qz,qw]
· qx=ax*sin(theta/2)
· qy=ay*sin(theta/2)
· qz=az*sin(theta/2)
· qw=cos(theta/2)
· 向量a=[ax,ay,az]是旋转轴方向的单位矢量,theta为旋转角度
· 四元数运算
· 四元数乘法
· pq=[(ps·qv+qs·pv+pv X qv) (ps·qs-pv·qv)]
· 共轭及逆四元数
· 四元数求逆:逆四元数和原四元数的乘积会变成标量1 [0 0 0 1]
· 共轭量 q* = [-qv qs]
· 积的共轭及逆四元数
· (pq)*=q*p*
· (pq)-1=q-1p-1
· 以四元数旋转矢量
· v'=rotate(q,v)=qvq-1=qvq*
· 四元数的串接
· 等价的四元数和矩阵
· 旋转性的线性插值
· 球面线性插值
· SLERP还是不SLERP
· 比较各种旋转表达式
· 欧拉角
· 由三个标量组成:偏航角、俯仰角、滚动角
· 简单,会遭遇万向节死锁
· 3x3矩阵
· 旋转可通过矩阵乘法直接施于点和矢量
· 求逆矩阵来求反转方向的旋转
· 纯旋转的转置矩阵即为逆矩阵
· 不直观,不容易插值
· 轴角
· 以一个矢量定义旋转轴,再加上一个标量定义的旋转角
· 直观,紧凑
· 不能简单插值,旋转不能直接施于点或矢量
· 四元数
· 能串接旋转,并把旋转直接施于点和矢量
· 可以轻易用LERP SLERP进行插值
· 只需存储4个浮点数
· SQT变换
· 包含缩放因子,表示旋转的四元数和平移矢量
· 对偶四元数
· 旋转和自由度
· 其他数学对象
· 直线、光线和线段
· 球体
· 平面
· 轴对齐包围盒
· 定向包围盒
· 平截头体
· 凸多面体区域
· 硬件加速的SIMD运算
· SIMD:单指令多数据
· SSE寄存器
· 每个SSE寄存器包含4个32位float
· 尽量把数据保存在SSE,降低SSE与FPU(浮点运算器)的数据传送
· __m128数据类型
· __m128变量的对齐
· 确保16字节对齐
· 当编译器要动态分配数据结构时,程序员须负责对齐
· 用SSE内部函数编码
· 用SSE实现矢量对矩阵相乘
· 产生随机数
· 线性同余产生器
· 梅森旋转算法
· 所有之母及Xorshift