#python #graphics #3d #simulation #raytracing
#python #графика #3D #Симуляция #трассировка лучей
Вопрос:
Я провожу технические исследования для своего следующего проекта и пока не нашел ничего подходящего, поэтому я даю SO попробовать.
Проблема, которую я пытаюсь решить, заключается в следующем:
- У меня много (сотни / тысячи) процедурно сгенерированных сцен, каждая из которых состоит из ~ 10 тыс. кубов.
- В каждом из них я хотел бы проверить 1k-10k лучей и получить статистику по расстоянию попадания.
- Это не проблема рендеринга — не все лучи исходят из одной и той же позиции. (Таким образом, трассировка лучей на основе глубины менее подходит)
- Производительность имеет значение. Я бы хотел, чтобы базовый код был либо на основе GPU, либо с возможностью параллелизации C.
Есть ли фреймворк, который позволяет мне делать такие вещи? Я смотрел на игровые движки, но в основном не отслеживал. Я предпочитаю найти фреймворк python framework, который делает это, но также остановится на других языках (C # / C ).
Каков наилучший способ решения такой проблемы?
Комментарии:
1. Вы можете легко сделать это в Unity. Мы поддерживаем трассировку лучей. Вы также можете реализовать это самостоятельно в сцене. В Интернете есть несколько примеров, показывающих, как заполнить текстуру из вычислительного шейдера.
2. Спасибо! Ближайший случай, который я нашел, был таким: github.com/superdump/unity-compute-shader-ray-tracer Однако он отслеживает лучи, тестируя их на каждом объекте (предупреждает о сценах с более чем несколькими сотнями следов), и я не уверен, что он распараллеливается (запускает 10000 лучей, ждет результатов, обрабатывает). Я бы ожидал, что будет какой-то алгоритм, который предварительно обрабатывает сцену для создания более эффективного решения для трассировки лучей, а затем использует это… Может быть, я слишком оптимистичен.
Ответ №1:
Какие игровые движки вы искали? Потому что Unreal и Unity, два самых популярных движка на рынке, уже имеют поддержку. В Python найти хорошую библиотеку или фреймворк может быть сложнее, потому что в Python нет отличной экосистемы для игровых движков.
https://docs.unrealengine.com/en-US/Engine/Rendering/RayTracing/index.html
https://docs.unrealengine.com/en-US/Engine/Rendering/RayTracing/RayTracingSettings/index.html
https://developer.nvidia.com/blog/introducing-ray-tracing-in-unreal-engine-4/
Обновить:
В Python есть движок PyGame с открытым исходным кодом, который может иметь некоторую поддержку, но я не уверен, что он стабилен.
https://www.pygame.org/project/4743/6980
После некоторых исследований я также нашел пакет на Python, который может работать без игрового движка, вы могли бы попробовать
Комментарии:
1. Спасибо за ресурсы! Я хорошо осведомлен о трассировке лучей в играх. Разница между моим вариантом использования и тем, что популярно в играх, заключается в том, что трассировка лучей игрового движка всегда используется для использования с одним источником (камерой). На этом основана вся стратегия выборки. В моем случае я буду запускать 30-50 лучей из ~ 100 исходных точек на сцену, что делает эти подходы неэффективными.
Ответ №2:
Отвечая на мой собственный вопрос. После довольно продолжительных исследований мы остановились на Trimesh ( https://trimsh.org/trimesh.html ).
Он включает в себя
- Совместимость с популярными форматами геометрии (gltf, obj, dae)
- Поддержка быстрой трассировки лучей с помощью pyembree (на основе проекта Intel embree)
- Поддерживает пакетные запросы (отправка рентгеновских запросов, получение рентгеновских ответов обратно), чтобы избежать узкого места связи python <-> C.