Какую библиотеку или технологию лучше использовать для задачи учета теней?
Всем здравствуйте!
Пытаюсь решить следующую задачи в области 3D моделирования.
Есть некоторая заданная в пространстве плоскость, источник света, двигающийся по заданному уравнению и некий заданный объект между источником света и плоскостью, который отбрасывает тень на плоскость. Тень, по мере движения источника света, изменяет свою форму и положение на плоскости.
Задача состоит в том, чтобы разделить исследуемую плоскость сеткой с шагом h и в определённый момент времени проанализировать каждую ячейку на предмет наличия в ней тени.
Пытаюсь решить этот вопрос с использованием библиотеки three.js. Все условия задачи сформировать удалось, не получается получить доступ к математике плоскости и тени на ней, чтобы анализировать ячейки. Есть минус - медленно формируется тень и решение задачи через данную библиотеку затратно в плане вычислительных мощностей. Хотя если кто подскажет как сделать через three.js - буду рад.
Для решения задачи смотрел более низкоуровневые библиотеки WebGL и OpenGL. Там, в принципе, можно решить задачу через шейдеры, но достаточно высокий порог вхождения, если уж совсем ничего не останется, то буду изучать их.
Какие технологии и библиотеки для решения данной задачи можете подсказать Вы?
Моё предпочтительное поле работы - JavaScript. Готов рассмотреть варианты с C++ и C#.
Смотри в сторону THREE.Raycaster(). Бери источник света. От него кидаешь "лучи" по граням модели, на плоскости проецируешь по кастам точки, по точкам модель, это будет тенью. Саму плоскость с сеткой h немного проще будет поделить на отдельные объекты в сцене(каждая клетка отдельный объект) и тогда будет очень легко отловить на какой клетке тень есть а на какой нет.
Пока не смог решить проблему, Raycaster() не получается использовать, т.к. тип источника света DirectionalLight(). У данного источника все лучи параллельны. Думаю применить к поверхности тип материала shader и если получится немного изменить библиотеку THREE, чтобы получить доступ к математике теней. То, что я делаю
UPD. Решение через сравнивание светов оказалос затратным. Таки решил проблему с использованием Raycaster(). Брал множество точек плоскости и нормализованный вектор позиции источника света. Из каждой точки плоскости бросал луч и искал пересечение с затеняющими объектами. Множество точек плоскости определbk через .vertices