tg-me.com/hw_code/544
Last Update:
Finally, differentiable programming!
Здесь бы картинку прикрепить, где чувак пробирку держит, но к сожалению я уже прикрепил другую снизу... Недавно наткнулся на еще один классный пример компьютерной графики, использующий дифференцируемое программирование.
Дифференцируемое программирование, это такая парадигма, в рамках которой любая программа может быть продифференцирована. И здесь мой дружок пирожок, тебе безусловно потребуется знание calculus. Хотя, конечно в рамках этой парадигмы язык обычно содержит т.н. автоматическое дифференцирование (это когда достаточно бахнуть gradient(of: ...)
). Но всегда приятно примерно представлять о чем вообще речь то идет.
А речь пойдет о такой прекрасной численной схеме, позволяющей симулировать упругие тела... ммм... Сама по себе идея Material Point Method не нова, например вот тут есть прекрасная реализация данного метода в 2D на c++. Подобный метод, к слову, использовала студия Дисней в создании своих мультиков. Да и в принципе в компьютерной графике это всё очень часто используется.
Заметили ведь что примеры в ссылке выше слегка всратые? Отметим этот немаловажный пункт, чтобы вернуться к нему немного позже.
Так вот, данный метод позволяет оперировать частицами с некоторыми заданными положениями и скоростями, и отслеживать их эволюцию во времени. Из этих частиц можно создавать различные "материалы", например песок или воду, задав некоторые констреинты (например коэффициенты жесткости или связи между двумя соседними частицами).
Но китайцы в своей статье пошли еще дальше и запилили Moving Least Squares Material Point Method, принцип работы которого вы и можете наблюдать на гифке ниже. Кроме того, они еще и умудрились уместить данную симуляцию в 88 строк кода (спрятав под ковер еще 10к строк в хедере в инклудах).
Здесь внимательный читатель спросит, собсна, а причем тут дифференциальное че то там? Теперь вспомним пример выше. Изначальный метод содержал некоторые неприятные особенности, например тела в таких симуляциях нельзя было разрезать, да и сам метод плохо работал, если поле скоростей частиц содержало разрывы.
А дифференцируемость моделей позволила задействовать процедуры оптимизации вроде градиентного спуска, так что все начало сходиться к нормальному результату уже спустя всего лишь десяток итераций. Китайцы к слову бахнули свой собственный "язык" DiffTaichi (на самом деле считай "бэкенд" на с++ а "фронтэнд" на вашем любимом языке 🐍). А в Swift for TensorFlow, который я использую для работы, так и вообще автодифференцирование встроено по умолчанию.
Данный пример (ниже на гифке) кстати не требует установки всего языка, достаточно скачать их пример и собрать его с помощью g++.
by @hw_code
BY Hello World
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/hw_code/544