Создание точек поверхности с нормалями на сетке в python

Я в основном хотел бы генерировать случайные точки поверхности на сетке трехмерного объекта, включая нормали поверхности в Python. У меня нет большого опыта в этой области. Так может ли кто-нибудь порекомендовать мне несколько пакетов, подходов, методов для решения задачи?

Посмотрел в open3d и trimesh, но все же есть некоторые проблемы.

Спасибо!

1 ответ

Это довольно просто с тримешом:

In [1]: import trimesh

In [2]: m = trimesh.creation.icosphere()

In [3]: m
Out[3]: <trimesh.base.Trimesh at 0x7f99bec7d550>

In [4]: m.sample?
Signature: m.sample(count, return_index=False)
Docstring:
Return random samples distributed normally across the
surface of the mesh

Parameters
---------
count : int
  Number of points to sample
return_index : bool
  If True will also return the index of which face each
  sample was taken from.

Returns
---------
samples : (count, 3) float
  Points on surface of mesh
face_index : (count, ) int
  Index of self.faces
File:      /media/psf/Dropbox/robotics/trimesh/trimesh/base.py
Type:      method

In [5]: points, index = m.sample(1000, return_index=True)

In [6]: points
Out[6]: 
array([[ 0.79934465,  0.58103816,  0.1308479 ],
       [-0.07373243,  0.08338232,  0.99055759],
       [ 0.71660325,  0.21369974,  0.65889903],
       ...,
       [-0.08330094,  0.98915598,  0.10205582],
       [ 0.2558548 , -0.68523377, -0.6770221 ],
       [-0.11483521,  0.97023335,  0.19696663]])


In [8]: normals = m.face_normals[index]

In [9]: normals
Out[9]: 
array([[ 0.79167915,  0.58957859,  0.16012871],
       [-0.04950537,  0.06905681,  0.99638365],
       [ 0.73810358,  0.21732806,  0.63872656],
       ...,
       [-0.06905681,  0.99638365,  0.04950537],
       [ 0.23921922, -0.7022584 , -0.67052763],
       [-0.08142553,  0.97123096,  0.22378629]])

Вы можете получить более красивые нормали, найдя барицентрические координаты каждой точки и затем интерполировав нормали вершин, но просто использовать нормали граней очень просто.

Я хотел бы использовать matplotlib, Может быть, "Tri-Surface Plots" это то, что вам нужно на этой странице здесь? Вы можете CTRL+FTri-Surface plots буквально быстро найти его и посмотреть на изображение, которое он генерирует, чтобы увидеть, если это то, что вы ищете.

Другие вопросы по тегам