根据点集创建一个.stl文件

问题描述 投票:0回答:1

因此,我正在使用的软件接受轮廓或.stl文件形式的3D对象。我的轮廓沿着z平面(每个平面都有一个唯一的z)。我必须为实验修改轮廓,现在轮廓在每个平面上都没有唯一的z(它们现在在z = 0平面上略有倾斜)。

这些点代表3D对象的边缘。收集这些点并创建一个.stl文件的最佳方法是什么?

我对使用python和3D对象还比较陌生,所以任何帮助,指针或建议都将不胜感激。

编辑:我有使用Delaunay()的单纯形和顶点,但是接下来我该如何继续?

  1. 所有点的坐标都在此text file中,格式为“ x y z”。
python-3.x 3d
1个回答
0
投票

因此,在寻找答案几个月并尝试使用Meshlab和Blender之后,我终于偶然发现使用numpy-stl的答案。希望它可以帮助处于类似情况的其他人。

这里是生成.STL文件的代码:

from stl import mesh
num_triangles=len(fin_list)
data = np.zeros(num_triangles, dtype=mesh.Mesh.dtype)
for i in range(num_triangles):
    #I did not know how to use numpy-arrays in this case. This was the major roadblock
    # assign vertex co-ordinates to variables to write into mesh
    data["vectors"][i] = np.array([[v1x, v1y, v1z],[v2x, v2y, v2z],[v3x, v3y, v3z]])
m=mesh.Mesh(data)
m.save('filename.stl')

在网格中形成三角形的三个顶点作为定义表面法线的向量进入。我刚刚收集了三个形成三角形的顶点并将它们写入网格。因为我有规则的点数组,所以很容易收集三角形:

for i in range(len(point_list)-1):
        plane_a=[]
        plane_b=[]
        for j in range(len(point_list[i])-1):
            tri_a=[]
            tri_b=[]
            #series a triangles
            tri_a.append(point_list[i+1][j])
            tri_a.append(point_list[i][j+1])
            tri_a.append(point_list[i][j])
            #series b triangles
            tri_b.append(point_list[i+1][j])
            tri_b.append(point_list[i+1][j+1])
            tri_b.append(point_list[i][j+1])
            #load to plane
            plane_a.append(tri_a)
            plane_b.append(tri_b)
        group_a.append(plane_a)
        group_b.append(plane_b)

选择用于创建网格的三角形的规则如下:

  1. 顶点必须沿逆时针方向排列。
  2. 每个三角形必须与相邻的三角形共享两个顶点。
  3. 法线必须指向曲面的方向。

还有另外两个我没有遵循的规则,但在我的情况下仍然有效:1.所有坐标必须为正(仅在第一象限中)2.所有三角形必须以递增的z顺序排列。

注意:.STL文件格式可以有两种:二进制和ASCII。 numpy-stl以二进制格式写出。有关STL文件的更多信息,请参见here

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.