使用坐标和索引的 .ifc 文件格式的三角剖分模式

Triangulation patterns in .ifc file format using coordinates and indexes

由于问题的数学性质,我也在另一个论坛中 post编辑了它: forum post

我有一个 .ifc 文件,其中导出的原始数据根据 link 解释:

通过一组坐标及其相应索引描述了 xy 平面中的墙

Explanation

我有一个 txt,其中数据分为 xyz space 中的坐标,然后是索引和一些其他数据。

我希望有人能帮助我了解如何将索引 link 到它们相应的坐标。有 164 个坐标对和 324 个索引对,所以我认为每个索引仅与 1 个坐标对相关是没有意义的。

目标是建立索引和坐标之间的关系,以便此类数据可以输出壁厚,在本例中为“10”。我在想(根据上面的 link)通过采用所描述的第一个三角形,它应该在 3D 中描述墙的边缘,因此给我们它的一条边作为墙中最短的部分厚度.

我在提到的论坛 post 中收到了一个答案,我应该 "...根据 X、Y 和 Z 展开每个坐标 [而不是 (X,Y,Z) 三元组),然后使用每个索引三元组来获取单个坐标的实际坐标一个三倍。 例如,你有 X[]、Y[] 和 Z[],你有一个索引 (a,b,c) 然后你会发现 X[a]、Y[b] 和 Z[c] 而不是 Point(a ,b,c)... "

我不太理解这个解释,如果有任何帮助或进一步解释以实现我的目标,我将不胜感激。

谢谢

在三角剖分中大约是 num of triangles = 2 * num of vertices

一面墙(例如矩形)可以用共享一条边的两个三角形和这条边的两个顶点来描述。

而不是一个三角形一个三角形的描述整个模型,每个三角形都有它的三个顶点,或者一个边一个边,它更便宜,避免重复顶点数据,为每个顶点设置一个索引并设置一个三角形通过其顶点的三个索引。这通常称为"indexed rendering"。

让我们从坐标 (IfcCartesianPointList3D) 开始:每一个都是三元组,得到一个具有 (x,y,z) 坐标的点。

然后IfcTriangulatedFaceSet 使用索引构造三角形。它有 2 种索引模式:直接和间接通过 PnIndex。索引模式由 PnIndex 数组(属性编号 5)的存在决定。请注意,我将这些变体称为直接和间接 - IFC 文档中并未这样提及它们。

直接索引

未设置 PnIndex。让我们看一个(简单且构造好的)示例:

#100=IFCCARTESIANPOINTLIST(((0,0,0),(1,0,0),(1,1,0),(0,1,0)));
#101=IFCTRIANGULATEDFACESET(
    /*reference to the points*/         #100,
    /*no normals*/                      $,
    /*no indication if closed or open*/ $,
    /*coordinate indices*/              ((1,2,3),(1,3,4)),
    /*no PnIndex*/                      ());

这描述了一个位于 x-y 平面上的正方形。属性 CoordIndex 中的每个条目都是一个三元组,为 IfcCartesianPointList 中的一个点提供基于一的索引。这意味着有两个由以下点构成的三角形:

  1. (0,0,0) (1,0,0) (1,1,0)
  2. (0,0,0) (1,1,0) (0,1,0)

间接索引

让我们在前面的示例的基础上进一步构建:

#100=IFCCARTESIANPOINTLIST(((0,0,0),(1,0,0),(1,1,0),(0,1,0)));
#101=IFCTRIANGULATEDFACESET(
    /*reference to the points*/         #100,
    /*no normals*/                      $,
    /*no indication if closed or open*/ $,
    /*coordinate indices*/              ((1,2,3),(1,3,4)),
    /*PnIndex*/                         (2,3,4,1));

这次设置了PnIndex。它增加了一个间接级别来访问这些点。 CoordIndex 中的三元组指向 PnIndex(基于 1)。然后使用在 PnIndex 中找到的值访问 IfcCartesianPointList。

所以对于第一个三角形,我们在 CoordIndex 中有:(1,2,3)。这些指向 PnIndex 中的 2、3 和 4。这些导致点列表中的以下点:(1,0,0) (1,1,0) (0,1,0)

对第二个三角形 (1,3,4) 重复上述过程,我们从 PnIndex 得到值 2、4、1 和以下点:(1,0,0) (0,1,0) (0 ,0,0)

它又是一个正方形,但这次使用了不同的三角剖分。

现在,如果您想知道壁厚,则需要根据生成的几何图形计算范围。如果您的墙与坐标系轴对齐,这很容易(获得最小和最大 X、Y 和 Z 之间的差异)。如果不是,您可能需要转换点或进一步研究 3D 范围计算(我的知识到此为止)。