附录G:世界坐标系和本地坐标系
使用专用三维建模工具构建模型的优势
之前只要绘制模型就需要在 initVertexBuffers 里手动写入大量的数据:
比如MultiJoinModel程序的模型数据全都写在程序里
1 | var vertices = new Float32Array([ |
- 组合
- 形变
- 顶点数量调整
- 顶点间隔优化
- 等等
本地坐标系
本地坐标系(local coordinate system)
创建三维模型需要知道模型原点 (0.0, 0.0, 0.0)在哪,比如:
- 立方体的原点就在 中心
- 太阳或月亮等球体的原点在 球心
游戏角色模型的原点
大部分都位于 脚部,
Y轴 垂直向上 穿过身体的中线。
这样就可以方便的操纵游戏角色在世界中的位置和动作:
- y=0 时,游戏角色就站立在地面上
- 模型沿y轴旋转,即是角色在 转向
- 沿Z轴或X轴移动角色,即是角色在地面上跑动或滑动
世界坐标系
世界坐标系(world coordinate system)
也称 全局坐标系 (global coordinate system)
当空间中的物体移动和变化时,不能将世界坐标系或本体坐标系分开考虑,
需要将两个坐标系结合起来考虑,即 世界变换
世界变换(world transformation)
即物体本身仍然是基于 本地坐标系,
但物体相对世界的变换需要将 本地坐标系 转换到 世界坐标系,
这就是世界变换。
LocalAndWorldCoordinate案例主要介绍的是简单的世界变换
LocalAndWorldCoordinate Code
沿本体坐标系旋转基本原理
实际上就是将物体先平移回原点,然后旋转,然后再平移回来,
这本书作者也在书里吐槽:
”为了企鹅像在跳芭蕾舞一样自旋,你需要先把企鹅移到场景原点,旋转,再移回来,真够麻烦的。“
Local && World
vertex shader
1 | // u_MvpMatrix 为视图模型矩阵,其中模型部分直接进行绕Y轴旋转变换 |
vertex shader
1 | // u_vpmatrix 视图矩阵 |
1 | let verticesColors = new Float32Array([ |
1 | let vpMatrix = new Matrix4() |