数学基础
1. 点、向量与方向
在笛卡尔坐标系中,三维的点、向量和方向都可以用三元数表示,如(x,y,z)。在显示引擎中,一般用Vector3表示点、向量和方向。但在几何造型引擎中,点、向量和方向代表不同的含义,故使用不同的类来表示。
三维空间定义:
类 | 含义 | 备注 | 内置常量 |
---|---|---|---|
GPnt | 点 | 三维空间位置 | 原点: GP.Origin() |
GVec | 向量 | 具有大小和方向的三维量 | - |
GDir | 方向 | 只代表三维方向,长度为1的向量 | X方向:GP.DX(); Y方向: GP.DY(); Z方向: GP.DZ() |
GXYZ | 三维的XYZ | 三元数 | - |
在二维空间中的定义:
类 | 含义 | 备注 | 内置常量 |
---|---|---|---|
GPnt2d | 点 | 二维空间位置 | 原点: GP.Origin2d() |
GVec2d | 向量 | 具有大小和方向的量 | - |
GDir2d | 方向 | 只代表方向,长度为1的向量 | X方向:GP.DX2d(); Y方向: GP.DY2d(); |
显示引擎中点、向量、方向的定义:
类 | 含义 | 内置常量 |
---|---|---|
Vector2 | 二维 | - |
Vector3 | 三维 | Vector3.Zero, Vector3.UNIT_X, Vector3.UNIT_Y, Vector3_UNIT_Z |
2. 坐标轴/坐标系
类 | 含义 | 备注 | 内置常量 |
---|---|---|---|
GAx1 | 三维空间的一个轴 | 由一个点和方向确定的坐标轴 | GP.OX(); GP.OY(); GP.OZ() |
GAx2 | 三维右手坐标系 | 只能是右手坐标系 | GP.XOY(); GP.YOZ(); GP.ZOX() |
GAx3 | 三维坐标系 | 可以是右手也可以是左手坐标系 | - |
GAx2d | 二维坐标系 | 二维空间中的点和方向确定的坐标系 | GP.OX2d(); GP.OY2d(); GP.OZ2d() |
3. 矩阵变换
图形学中常用的矩阵变换有平移矩阵(Translation)、旋转矩阵(Rotation)、缩放矩阵(Scale)、镜像矩阵(Mirror)等。组合使用基本的矩阵变换可以用来实现装配零件、模拟物体运动等功能。
3.1 几何变换
TopoShape的矩阵变换使用GTrsf来表达,构造方法有:
变换 | GTrsf方法 |
---|---|
平移 | SetTranslation |
旋转 | SetRotation |
缩放 | SetScale |
镜像 | SetMirror |
矩阵相乘 | Multiply |
也可以直接使用TransformTool对TopoShape进行矩阵变换:
变换 | TransformTool方法 |
---|---|
平移 | TopoShape Translate(TopoShape pShape, GVec vec) |
旋转 | TopoShape Rotation(TopoShape pShape, GAx1 axis, double angle) |
缩放 | TopoShape Scale(TopoShape pShape, GPnt center, double scale) |
镜像 | TopoShape Mirror(TopoShape shape, GAx1 axis) |
组合变换 | TopoShape Transform(TopoShape pShape, GTrsf trf) |
3.2 显示变换
几何变换是对TopoShape变换,显示变换时对场景节点SceneNode变换。
相比几何变换,显示变换更加轻量,即速度更快(快的不是一点点)。
Matrix4提供了静态方法用于构造基本的变换矩阵:
变换 | Matrix4方法 |
---|---|
平移 | Matrix4 makeTranslation(Vector3 v) |
缩放 | Matrix4 makeScale(float x, float y, float z) |
旋转 | Matrix4 makeRotationAxis(Vector3 axis, float angle) |
3.3 矩阵相乘
矩阵相乘不符合交换律,即M1和M2以下的相乘结果不一定相等:
M2 = M1 * M2
M3 = M2 * M1
在对物体进行组合变换的时候需要考虑变换的顺序,
M1 = T * S * R // 先旋转、再缩放、最后平移
M2 = R * S * T // 先平移、再缩放、最后旋转
例,对SceneNode平移后再旋转:
var matrixR = Matrix4.makeRotationAxis(new Vector3(0, 0, 1), Math.PI);
var matrixT = Matrix4.makeTranslation(-50, 0, 0);
ConeNode1.SetTransform(matrixR * matrixT);
ConeNode1.RequstUpdate();
4. 小结
矩阵变换是图形学里面基本的概念,对于几何对象和显示对象有着不同的应用场景。
在动画模拟的过程中,一般对显示对象进行变换即可;在需要进行几何对象操作的,比如布尔运算的情况下,则需要对几何对象进行矩阵变换。
矩阵变换是建模和显示最基本的技能,一定需要掌握
5. 思考问题
- 如何实现绕着某个点旋转?
- 如何使用矩阵变换实现自传和公转?
- 几何对象和显示对象进行矩阵变换的应用场景分别是什么?
- 对模型旋转何缩放的时候,模型的最终位置与模型的局部坐标系的原点有关系吗?