# 数学基础

# 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. 思考问题

    1. 如何使用矩阵变换实现自传和公转
  • 2)几何对象和显示对象进行矩阵变换的应用场景分别是什么?
Last Updated: 8/11/2020, 8:55:21 PM