Оптимизация пересечения лучей с mesh моделью
Есть ли оптимизированный метод, позволяющий получить все треугольники mesh видимые с заданной точки?
есть mesh модель огромного размера и некая точка вблизи этой модели. С точки разлетаются лучи условно на все 360 градусов. Надо вычислить индексы всех треугольников, на которые попадают лучи из этой точки. Аналогия видеокамеры...
Понятно, что методы пересечения лучей с сеткой, реализованные в таких библиотеках как trimesh или pymesh неэффективны на больших моделях. Большая модель в моём случае, это миллиарды вершин...
На картинке изображена относительно маленькая модель здания, на углу внутреннего двора размещен источник лучей с ограниченной дальностью. Я пытаюсь вычислить те треугольники, на которые луч попадет первым. То есть, если источник лучей считать за источник света, то он будет освещать внутренний двор, а не всю модель.
Результат на картинке получен с помощью trimesh.ray.intersects_first.
Ответы (1 шт):
Я нашел оптимизированное решение с помощью embree в trimesh.
import trimesh
import numpy as np
mesh = trimesh.creation.icosphere(use_embree=True)
cam = np.array([[0, 0, -3]])
ray_origins = np.tile(cam, (len(mesh.vertices), 1))
ray_directions = mesh.vertices-np.tile(cam, (len(mesh.vertices), 1))
index_tri, index_ray = mesh.ray.intersects_id(
ray_origins=ray_origins,
ray_directions=ray_directions, multiple_hits=False)
ray_visualize = trimesh.load_path(np.hstack((ray_origins,
ray_origins + ray_directions*1.0)).reshape(-1, 2, 3))
mesh.visual.face_colors = [255,255,255,255]
mesh.visual.face_colors[index_tri] = [255, 0, 0, 255]
scene = trimesh.Scene([mesh, ray_visualize])
scene.show()
Однако оно выдает результаты с некоторыми ошибками. На эту тему открыл другой вопрос.