因此,我正在使用的软件接受轮廓或.stl文件形式的3D对象。我的轮廓沿着z平面(每个平面都有一个唯一的z)。我必须为实验修改轮廓,现在轮廓在每个平面上都没有唯一的z(它们现在在z = 0平面上略有倾斜)。
这些点代表3D对象的边缘。收集这些点并创建一个.stl文件的最佳方法是什么?
我对使用python和3D对象还比较陌生,所以任何帮助,指针或建议都将不胜感激。
编辑:我有使用Delaunay()的单纯形和顶点,但是接下来我该如何继续?
因此,在寻找答案几个月并尝试使用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.所有三角形必须以递增的z顺序排列。
注意:.STL文件格式可以有两种:二进制和ASCII。 numpy-stl以二进制格式写出。有关STL文件的更多信息,请参见here。
希望这会有所帮助!