# 模型显示

模型显示主要关注模型的形状、外观、位置三大要素。其中形状通过Gometry、Shape等相关类来描述,外观使用Material来描述,位置使用Matrix、Transform来描述。三大要素组成了场景节点(SceneNode):

模型显示三要素

# 1 基本显示图元

实时渲染引擎能够处理的基本图元(Primitive)只有点、直线、三角形三种类型。任何物体,无论复杂的还是简单的,都是这三种基本图元的组合, 其中一条线段由两个点组成,一个三角形由三个点三条边组成。

基本图元

任何的对象的显示数据在ARS中均使用BufferGeometry来表达。

# 2. BufferGeometry

namespace AnyCAD.Foundation
{
    public class GeometryBuilder
    {
        // 在原点位置创建一个盒子
        public static BufferGeometry CreateBox(float widthX, float widthY, float heightZ);
        // 在原点位置创建一个圆柱、圆台或者圆锥
        public static BufferGeometry CreateCylinder(float radiusTop, float radiusBottom, float height);
        // 创建一个平面
        public static BufferGeometry CreatePlane(float width, float height);
        // 在原点位置创建一个球
        public static BufferGeometry CreateSphere(float radius);
        // 创建一个任意形状
        // @param vb: 顶点位置
        // @param nb: 顶点法向(可选)
        // @param uv: 顶点纹理坐标(可选)
        // @param ib: 索引
        public static BufferGeometry CreateGeometry(Float32Buffer vb, Float32Buffer nb, Float32Buffer uv, Uint32Buffer ib);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

BufferGeometry可以是点,可以是线,也可以是三角形网格,EnumPrimitiveType用来告诉显示引擎到底该如何绘制BufferGeometry:

namespace AnyCAD.Foundation
{
    public enum EnumPrimitiveType
    {
        POINTS = 0,  // 点
        LINES = 1,   // 线段
        LINE_LOOP = 2, 
        LINE_STRIP = 3, // 连续线段
        TRIANGLES = 4, // 三角形
        TRIANGLE_STRIP = 5, 
        TRIANGLE_FAN = 6 
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 3. 显示材质

Geometry用于描述物体的形状,Material用于描述外观材质,比如颜色、透明度、纹理等。

在ARS中,MaterialTemplate用于描述材质模板,MaterialInstance是材质的具体实例。

# 4. 简单显示对象

# 4.1 PrimitiveShape

PrimitiveShape = BufferGeometry + EnumPrimitiveType + MaterialInstance
1
namespace AnyCAD.Foundation
{
    public class PrimitiveShape : GfxObject
    {
        public PrimitiveShape(BufferGeometry geometry, EnumPrimitiveType type, MaterialInstance material);
        ...
    }
}
1
2
3
4
5
6
7
8

# 4.2. PrimitiveSceneNode

PrimitiveShape描述了物体的形状、材质,放在空间的位置由矩阵来描述,可以简单的得到下面的公式:

  PrimitiveShape + Matrix4 + ... = PrimitiveSceneNode
1

# 5. 复杂显示对象

# 5.1. CompoundShape

复杂的物体一般有多个面、多条边,CompoundShape可以把多个PrimitiveShape组合在一起,方便数据管理。

# 5.2. ShapeSceneNode

与PrimitiveSceneNode类似,有如下简单的关系:

 CompoundShape +  Matrix4 + ... = ShapeSceneNode
1

# 6. 拓扑显示对象

# 6.1. BufferShape

TopoShape是物体的拓扑和数学表达,显示的时候需要借助BufferShape把数学表达转换成显示的基本图元。 BufferShape可以理解为几何世界与显示世界的桥梁。

# 6.2. BrepSceneNode

与PrimitiveSceneNode类似,有如下简单的关系:

 BufferShape +  Matrix4 + ... = BrepSceneNode
1

TIP

BrepSceneNode上增加的矩阵不会影响TopoShape已有的矩阵。

# 7. 小结

本节介绍了组成SceneNode的三大要素,以及三种类型的SceneNode。在应用中需要根据需求选用适合的数据来表示模型。 整体的类UML图如下所示:

模型显示UML图

Last Updated: 8/14/2020, 9:00:07 PM