Создание точек поверхности с нормалями на сетке в python - PullRequest
1 голос
/ 08 мая 2019

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

Заглянул в open3d и trimesh, но все еще есть некоторые проблемы.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

это довольно просто с триместой:

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]])

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

0 голосов
/ 08 мая 2019

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

...