学习资料:《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 四元数简介]

第六章  3D图形学简介

  • [6.1 3D引擎原理]
    • 3D引擎:从数据表示到最后的光栅化。3D引擎只负责渲染
  • [6.2 3D游戏引擎的结构]
    • [6.2.4] 动画系统的三种实现方式
      • 各个系统之间都是存在联系,比如AI和碰撞系统
      • 简单运动:整个模型的平移旋转
      • 复杂运动:一个模型由多个关节连成,比如坦克身体和炮台。有两种实现方案:①预处理出所有角度的数据,再导入网格;②使用运动数据,BioVision(.BVH),该数据告诉引擎,链杆需要做什么移动
      • 基于物理学的动画:例如PVP游戏,击飞击退要做到逼真,符合现实生活的客观规律
    • [6.2.6] 物理引擎
      • 物理引擎负责控制游戏中物体可做出的动作和响应,例如碰撞,加速度,击飞等等
      • 包含的功能:计算摩擦力和加速度,弹性碰撞检测,线性动量传递
  • [6.3 3D坐标系]
    • 模型坐标→世界坐标
      • 平移:
    • 世界坐标→相机坐标
      • 平移:
      • 旋转:每个顶点都绕轴逆旋转
    • [6.3.5 隐藏物体(面)和裁剪] :判断物体对相机是否可见
      • 背面消除:如果,则可见;否则不可见。但是这对于双面多边形这种测试不管用??
      • 包围球测试:中心,求最远距离,在根据几何知识判断包围球是否在视锥体中
      • p347注意不理解
    • [6.3.6 透视投影]:将物体顶点投影到视平面上来
      • 根据相三角形求解,求视距d有两种方法
      • 透视投影可以利用到裁剪空间上来
    • [6.3.6 裁剪]
      • 对于直线裁剪有两种方式,第一种是在2D空间里裁剪(性能开销),第二种是在3D空间中裁剪(直接操作麻烦,但可以通过透视投影来用立方体进行裁剪,但还要裁剪纹理坐标和光照坐标,这里已经省略了)
    • [6.3.7 投影坐标→屏幕坐标]
      • 视距d=1,求出来的都是归一化坐标