Оптимизация пересечения лучей с 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()

введите сюда описание изображения

Однако оно выдает результаты с некоторыми ошибками. На эту тему открыл другой вопрос.

→ Ссылка