数学基础

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
1
2

在对物体进行组合变换的时候需要考虑变换的顺序,

M1 = T * S * R   // 先旋转、再缩放、最后平移
M2 = R * S * T   // 先平移、再缩放、最后旋转
1
2

例,对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();
1
2
3
4

4. 小结

矩阵变换是图形学里面基本的概念,对于几何对象和显示对象有着不同的应用场景。

在动画模拟的过程中,一般对显示对象进行变换即可;在需要进行几何对象操作的,比如布尔运算的情况下,则需要对几何对象进行矩阵变换。

矩阵变换是建模和显示最基本的技能,一定需要掌握

5. 思考问题

  • 如何实现绕着某个点旋转?
  • 如何使用矩阵变换实现自传和公转?
  • 几何对象和显示对象进行矩阵变换的应用场景分别是什么?
  • 对模型旋转何缩放的时候,模型的最终位置与模型的局部坐标系的原点有关系吗?

6. 深入阅读