Итак, после нескольких месяцев поиска ответа и попытки использовать 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')
Три вершины, которые образуют треугольник в me sh go в качестве вектора, определяющего нормаль поверхности. Я просто собрал три таких вершины, которые образуют треугольник, и записал их в me sh. Поскольку у меня был обычный массив точек, было легко собирать треугольники:
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)
Правила выбора треугольников для создания me sh следующие:
- Вершины должны быть расположены в направлении против часовой стрелки.
- Каждый треугольник должен делить две вершины со смежными треугольниками.
- Нормаль направления должна указывать из поверхности.
Существовали еще два правила, которые я не соблюдал, но они все еще работали в моем случае: 1. Все координаты должны быть положительными (только в 1-м квадранте) 2. Все треугольники должны быть расположены в увеличение z-порядка.
Примечание. Существует два вида форматов файлов .STL: двоичный и ASCII. numpy -stl записывает в двоичном формате. Больше информации о файлах STL можно найти здесь .
Надеюсь, это поможет!