学习资料:《3D游戏编程大师技巧 上册》
学习计划: 1-2天完成一章,预计使用半个月时间[下个月七号左右]。下册的学习会更深,更难。珍惜这段学习的时间,加油!
第一章 3D游戏编程入门
- memset单字节填充并不是最快,四元数QUAD可以一次写入4字节
- 思考:四元数是 1,i,j,k 的线性组合。即超复数
- 单指令多数据流(SIMD):一个控制器控制多个处理器,表现为对一组数据中的每一个执行相同的操作,从而实现并行
- 精简指令集(RISC)的原则进行编程,有利于CPU对指令处理更加简单
- 把一条符号语句合理地拆开,一方便了调试,二方便CPU处理指令
- 优化Tips
- 对2的乘除采用移位实现
- 代码优化等项目完成之后。因为越优化,扩展性越差
- 在编程时若发现采取的路线很困难,应先停止,备份,思考是否删除后重新写
第二章,第三章的内容不太好理解,暂时先跳过
第四章 三角学,向量,矩阵,四元数
- [4.7 逆矩阵和方程组求解]
- 两个变量用逆矩阵
- 三个变量用克拉默法则求解
- [4.7.4 应用矩阵变化]:第四个分量w取1表示点,0表示向量
- 平移
- 矩阵
- 逆矩阵
- 缩放
- 矩阵
- 逆矩阵
- 旋转(绕z轴旋转)
- 矩阵
- 逆矩阵 θ -> -θ
- 正交矩阵:每一行都与前一行向量垂直,每一列向量都与前一列向量垂直
- 通过半角公式融合得到
// 旋转矩阵 void matrix_set_rotate(matrix_t *m, float x, float y, float z, float theta) { float qsin = (float)sin(theta * 0.5f); float qcos = (float)cos(theta * 0.5f); vector_t vec = { x, y, z, 1.0f }; float w = qcos; vector_normalize(&vec); x = vec.x * qsin; y = vec.y * qsin; z = vec.z * qsin; m->m[0][0] = 1 - 2 * y * y - 2 * z * z; m->m[1][0] = 2 * x * y - 2 * w * z; m->m[2][0] = 2 * x * z + 2 * w * y; m->m[0][1] = 2 * x * y + 2 * w * z; m->m[1][1] = 1 - 2 * x * x - 2 * z * z; m->m[2][1] = 2 * y * z - 2 * w * x; m->m[0][2] = 2 * x * z - 2 * w * y; m->m[1][2] = 2 * y * z + 2 * w * x; m->m[2][2] = 1 - 2 * x * x - 2 * y * y; m->m[0][3] = m->m[1][3] = m->m[2][3] = 0.0f; m->m[3][0] = m->m[3][1] = m->m[3][2] = 0.0f; m->m[3][3] = 1.0f; }
- 平移
- [4.8 基本几何实体]
- [4.8.2 直线] 空间直线的方程使用参数方程来表达更容易理解
- [4.8.3 平面] 平面通用方程为 ,求两个面的交线也非常方便
- 如果F(x,y,z)>0则方向和(x0,y0,z0)相同;<0则相反;=0则在平面上
- 求线面交
- [4.9 使用参数化方程]
- 参数化直线
- 求两直线交点,求线面交点\
- [4.10 四元数简介]
- 四元数:一个实部 + 三个虚部
- 四元数进行向量旋转可以避免发生欧拉旋转造成的万向节锁[x=90,y,z再怎么转都只有一个方向。没理解,http://shequ.dimianzhan.com/articles/395/gang-ti-yun-dong-xue-zui-tong-su-yi-dong-de-li-jie-wan-xiang-jie-si-suo
- https://www.bbsmax.com/A/gVdnRr21dW/
- https://blog.csdn.net/yangxun983323204/article/details/53113929]
第六章 3D图形学简介
- [6.1 3D引擎原理]
- 3D引擎:从数据表示到最后的光栅化。3D引擎只负责渲染
- [6.2 3D游戏引擎的结构]
- [6.2.4] 动画系统的三种实现方式
- 各个系统之间都是存在联系,比如AI和碰撞系统
- 简单运动:整个模型的平移旋转
- 复杂运动:一个模型由多个关节连成,比如坦克身体和炮台。有两种实现方案:①预处理出所有角度的数据,再导入网格;②使用运动数据,BioVision(.BVH),该数据告诉引擎,链杆需要做什么移动
- 基于物理学的动画:例如PVP游戏,击飞击退要做到逼真,符合现实生活的客观规律
- [6.2.6] 物理引擎
- 物理引擎负责控制游戏中物体可做出的动作和响应,例如碰撞,加速度,击飞等等
- 包含的功能:计算摩擦力和加速度,弹性碰撞检测,线性动量传递
- [6.2.4] 动画系统的三种实现方式
- [6.3 3D坐标系]
- 模型坐标→世界坐标
- 平移:
- 世界坐标→相机坐标
- 平移:
- 旋转:每个顶点都绕轴逆旋转
- [6.3.5 隐藏物体(面)和裁剪] :判断物体对相机是否可见
- 背面消除:如果,则可见;否则不可见。但是这对于双面多边形这种测试不管用??
- 包围球测试:中心,求最远距离,在根据几何知识判断包围球是否在视锥体中
- p347注意不理解
- [6.3.6 透视投影]:将物体顶点投影到视平面上来
- 根据相三角形求解,求视距d有两种方法
- 透视投影可以利用到裁剪空间上来
- [6.3.6 裁剪]
- 对于直线裁剪有两种方式,第一种是在2D空间里裁剪(性能开销),第二种是在3D空间中裁剪(直接操作麻烦,但可以通过透视投影来用立方体进行裁剪,但还要裁剪纹理坐标和光照坐标,这里已经省略了)
- [6.3.7 投影坐标→屏幕坐标]
- 视距d=1,求出来的都是归一化坐标
- 模型坐标→世界坐标