Создание трехмерной триангулированной сетки с нуля

Я пытаюсь создать трехмерную триангулированную сетку, которую можно преобразовать в файл .vtk или .stl для использования в приложении для 3D-печати. Прямо сейчас я застрял в создании треугольной сетки. Геометрия, которую я хочу создать, представляет собой трехмерные синусоидальные волны, которые имеют определенную толщину и пересекаются друг с другом. Пока у меня есть одна синусоида. Вот МВЕ:

import matplotlib.pyplot as plt
import numpy as np
from scipy import ndimage
import scipy.spatial

# create empty 3d array
array = np.zeros((100, 100, 100))

# create 3D sine wave in empty array
strut = np.sin(np.linspace(1, 10, 100))*12
for k in enumerate(strut):
    y_shift = int(np.round(strut[k[0]]))
    array[k, 50 + y_shift, 50] = 1

pattern = np.ones((4, 4, 4))

# convolve the array with the pattern / apply thickness
conv_array = ndimage.convolve(array, pattern)

# create list with data coordinates from convolved array
data = list()
for j in range(conv_array.shape[0]):
    for k in range(conv_array.shape[1]):
        for l in range(conv_array.shape[2]):
            if conv_array[j, k, l] != 0:
                data.append([j, k, l])

data = np.asarray(data)

tri = scipy.spatial.Delaunay(data)

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
ax.hold(True)
ax.plot_trisurf(data[:, 0], data[:, 1], data[:, 2], triangles=tri.simplices)
plt.show()

Что он делает: я создаю пустой массив, который я заполняю синусоидой, представленной единицами. Я сворачиваю этот массив с прямоугольным массивом определенного размера, что дает мне более толстую синусоиду в пространстве. Затем массив преобразуется в координатную форму, чтобы его можно было триангулировать с помощью триангуляции Делоне. Я получаю следующее:

Сюжет

Как видите, триангуляция вроде бы сработала, но она заполняет пространство между амплитудами синусоиды. Есть ли способ удалить заполненный пробел? Или предотвратить это от их выполнения в первую очередь? Синусоида также выглядит неправильно на концах, и я не уверен, почему. Является ли это лучшим методом для достижения того, что я пытаюсь сделать?

Разбор файла .vtk не должен представлять проблем, но сначала мне нужна чистая структура. Заранее спасибо за любую помощь!


person Ian    schedule 01.03.2016    source источник


Ответы (2)


Я бы не стал изобретать велосипед и делать все это самостоятельно. Вместо этого используйте python-vtk и paraview (приложение для постобработки 3D-данных), чтобы выполнить триангуляцию за вас. «Просто» создайте точки и сделайте все остальное в этом приложении.

Я мало что знаю о 3D-печати, но знаю свою долю в STL и VTK. Это сложно делать вручную, а в библиотеке VTK есть несколько хороших примеров Python. и специальный STLWriter. Вам просто нужно разобраться в рабочем процессе VTK и в том, как он управляет внутренними процессами. Вот здесь и пригодится paraview. Это позволяет вам записывать ваши действия, которые вы делаете в графическом интерфейсе, и отображать их и отображать их в Python. Это здорово, чтобы узнать, как это работает внутри.

person jhoepken    schedule 01.03.2016
comment
Спасибо за ваше понимание! Я думал об использовании VTK раньше, но не мог понять, как создать нужную мне геометрию. Но вы в основном говорите, что мой способ создания облака точек в порядке, но с триангуляцией лучше справляется VTK? - person Ian; 01.03.2016
comment
Я не изучал ваш метод глубоко, если честно. Но я точно знаю, что в научном компьютерном сообществе есть люди, которые используют VTK и paraview (который полностью основан на VTK) для визуализации облаков точек на несколько порядков больше, чем у вас, и для выполнения с их помощью гораздо более сложных задач, чем триангуляция. Я бы просто попробовал, так как все уже готово к использованию, и вам не нужно переделывать колесо. Если это не сработает, вы можете отступить в любом случае. Триангуляция прекрасно работает в VTK. Возможно, вам нужно разделить облака точек на разные входы. - person jhoepken; 01.03.2016
comment
Ладно, попробую ВТК. Если я добьюсь какого-либо прогресса, я обновлю свой пост и отмечу ваш пост как ответ. - person Ian; 01.03.2016

Наконец-то я получил что-то очень близкое к тому, что я хочу. Если кого-то заинтересует ответ:

Вместо того, чтобы использовать подход с облаком точек, я углубился в VTK (что сложно освоить, но имеет много функций) с помощью Python.

Мой алгоритм в основном таков:

  1. Сначала аппроксимируйте синусоиду простой треугольной волной.
  2. Подайте координаты x, y и z волны в объект vtkPoints
  3. Используйте vtkParametricSpline, чтобы получить плавную волну
  4. vtkSplineFilter для управления плавностью волны
  5. vtkTubeFilter для создания тома из строки
  6. vtkTriangleFilter для построения сетки
  7. vtkSTLWriter
person Ian    schedule 09.03.2016