游戏引擎架构----数学基础

来源:互联网 发布:淘宝摄影棚用什镜头 编辑:程序博客网 时间:2024/05/18 12:44
1. 点和矢量
坐标:笛卡尔坐标:多个相互垂直的轴构成的,笛卡尔基矢量
          圆柱坐标系
          球坐标系
左右手坐标系:大拇指、食指、中指分别是x,y,z轴
矢量和点的区别:矢量相对于某个已知点的便宜,一个矢量可以移到三维空间中的任何位置,都是同一个矢量。点是绝对的,矢量是相对的
矢量运算:和标量的乘法
          加法(应用:显示欧拉法求位置)、减法
          矢量的分量积(component-wise product)/阿达马积(Hadamard product):非统一缩放
          模
          点积:符合交换律,分配率,投影。判定是否共线、反向、垂直,计算点距离平面的距离(点+平面点 * 平面ss法线)
          叉积:模:平行四边形的面积。反交换律,分配率。笛卡尔轴的正旋方向,绕z轴从x到y,绕x轴从y到z,绕y轴从z到x(注意按照y轴是倒转的),求法矢量
线性插值:LERP(linear interpolation),加权平均,权重分别为1-x和x

2. 矩阵
标准正交矩阵:行和列都为单位矢量
仿射矩阵:4*4的变换矩阵,能维持之前变换前后的平行以及相对距离比
          最接近矢量的矩阵会最先进行变换
单位矩阵(identity matrix)
逆矩阵(inverse matrix)所有仿射矩阵都有逆矩阵
转置矩阵(transpose matrix)标准正交矩阵的逆矩阵和转置矩阵一样
齐次坐标(homogeneous coordinates):为了让矩阵能表示平移等等,在原先的维度上增加一维,通常称为w。如4*4的矩阵能表示平移,旋转,缩放。表示为[ U 0 \ t 1 ],U是3*3的旋转矩阵,t是3*1的平移矩阵
          由于矢量没有位移,因此矩阵变换方向矢量时,要忽略平移效果,所以w分量为0
           点有位移,因此w分量为1
           [v w][U 0 \ t 1] = [vU + wt w]    
          四维齐次坐标变成三维坐标的方法是把x y z 分量除以w分量。矢量的w为0,所以三维空间上的纯方向矢量在四维中是位于无穷远的点
平移矩阵:[I 0 \ t 1],逆矩阵:对t求反
旋转矩阵:[R 0 \ 0 1],逆矩阵:转置。因为把角度求反就是两个正弦求反,余弦不变
缩放矩阵:[S 0 \ 0 1],S是对角阵。逆矩阵:求倒数
坐标空间:
     一组坐标轴代表一个参考系
     模型空间:局部空间
     世界空间
     观察空间:摄像机空间。原点在摄像机的焦点处
     基的变更:Mc->p:子空间到父空间的转换矩阵,[子空间x轴的单位基矢量在父空间的坐标 \ 子空间y轴的单位基矢量在父空间的坐标 \ 子空间z轴的单位基矢量在父空间的坐标 \ 子坐标系相对于父坐标系的平移],若子轴有缩放,则基矢量的单位长度也会有相应的缩放系数。
     基变更矩阵也能抽取出子空间的x,y,z朝向
     通过基变更矩阵变换坐标,也可反过来认为是反方向的变换坐标系
     法矢量是使用Mc->p的逆转置矩阵变换的

3. 四元数
q = [qx qy qz qw], 可看做三维矢量加上第四维的标量坐标。矢量部分是旋转单位轴乘以旋转半角的正弦,标量部分是旋转半角的余弦
乘法:
          pq:先旋转Q再旋转P
          四元数[0 0 0 1]是零旋转
          代表三维旋转的四元数是单位长度的,四元数的逆也符合矩阵积的逆的特性,即(pq)-1 = q-1 p-1
旋转矢量:v = [v 0]
               v’ = qvq-1
四元数和旋转矩阵是可以相互转换的
线性插值:
          LERP:normalize((1-x)a + xb),问题:旋转并非以恒定的角速度进行,两端较慢中间较快
          SLERP(spherical linear interpolation):球面线性插值normalize(sin((1-x)theta) / sin(theta) * a + sin((x*theta) / sin(theta) * b)。theta来自两个四元数的夹角,可以用四维点积求得cos(theta) = p.q

4. 各种旋转的表示
欧拉角:按照三个主轴旋转。偏航角(yaw),俯仰角(pitch),滚动角(roll)
          问题:不能轻易插值,万向节死锁(旋转90度是,一个主轴会与另一个完全对其,这样两个旋转以及完全等效),先绕那根轴后绕那根轴结果不同
3*3矩阵:问题:不直观,不易插值,需要大量存储空间
轴角:旋转轴和按轴旋转的角度[a theta]
          问题:不能简单的插值
四元数
旋转自由度:
          自由度DOF(degree of freedom):自由物体在平移上有三个自由度(x,y,z),在旋转上也有三个自由度(绕x,y,z轴)
          Ndof = N参数 - N约束

5. 仿射矩阵的表示
SQT变换:缩放scale,四元数quaternion,平移translation。体积小,易插值
对偶四元数:四个分量不是实数,是对偶数。

6. 线
     直线:点+方向。
     射线:约束(t>=0)
     线段:约束(t>=0, t<=L)
7. 球:中点+半径
8. 平面:点+法线。Ax+By+Cz+D = 0。[A B C]归一化后是法线。d = D/length([A B C])是平面到原点的距离。原点位于平面正面的时候d是正数,否则d是负数。也可用四元数表示[a b c d],法线是a b c, d的定义如上。使用逆转置矩阵施于这个四元数上,可得到新的空间的平面。
9. 轴对齐包围盒AABB(axis aligned bounding box)
10. 定向包围盒OBB(oriented bounding box)将点变换成OBB的对齐坐标空间,再用AABB的相交测试法
11. 平截头体(frustum):将点通过透视投影变换至齐次裁剪空间后,使用AABB相交测试法测试是否在内部

12. SIMD:单指令多数据single instruction multiple data。现代微处理器能用一个指令并行的对多个数据执行数学运算。
     SSE:单指令多数据流扩展streaming SIMD extensions。最常用的为32为浮点数打包模式
     SSE寄存器可存4个32位float,可以将两个SSE寄存器的内容做运算,一次可以运行四个数的结果。
     __m128就是C中的这种格式。需要保证是16字节对其的,动态分配的结构需要由程序员负责对齐。
     __asm内联汇编
     应用:矢量*矩阵:矢量的每个分量分别和矩阵的行相乘,最后相加

13. 随机数
线性同余法
梅森旋转阀
Xor shift(伪随机数产生器之母)


原创粉丝点击