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



由于问题的数学性质,我也在另一个论坛上发布了这个: 论坛帖子

我有一个 .ifc 文件,其中导出的原始数据根据链接解释通过一组坐标及其相应的索引描述了 xy 平面中的一堵墙:

解释

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

我希望有人可以帮助我了解如何将索引链接到相应的坐标。有 164 个坐标对和 324 个索引对,所以每个索引只与 1 个坐标对相关对我来说是没有意义的。

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

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

我不太明白这个解释,并希望得到任何帮助或进一步的解释,以实现我的目标。

谢谢

让我们从cordinates(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 中的一个点。这意味着有两个三角形由以下点构成:

(0,0,0) (1,0,0)
  1. (1,1,0)
  2. (0,0,0) (1,1,0)
  3. (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。

所以对于第一个三角形,我们有:(1,2,3)在CoordIndex中。这些指向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 范围计算(我的知识到此为止)。

在三角测量中,它大致是num of triangles = 2 * num of vertices.

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

与其逐个三角形描述整个模型三角形,

每个三角形都有其三个顶点,或者逐边描述,它更便宜,避免重复顶点数据,为每个顶点设置一个索引,并通过其顶点的三个索引设置三角形。这通常称为"索引渲染"。

相关内容

  • 没有找到相关文章

最新更新