Многочлен, исправивший ошибки 30-летней симуляции ткани.
Как японская компания электронной коммерции опубликовала одну из самых тщательно разработанных работ по моделированию ткани за последние годы, почему логарифмический барьер не работает при жестких ограничениях по деформации и как воспроизвести основную идею на языке Python.
Делиться

В коде практически каждого конвейера 3D-анимации скрыта ошибка. Она проявляется, когда рукав персонажа проходит сквозь его собственный торс, когда юбка проваливается сквозь ногу во время ходьбы, когда смоделированная скатерть проходит сквозь край стола, словно сделана из света. Высококлассные студии тратят тысячи часов художников на поиск этой ошибки кадр за кадром, прежде чем фильм выйдет в прокат. В видеоиграх и графике реального времени это происходит само собой.
Жук-обрезчик. Ткань, которая не знает, что она сплошная.
В конце 2024 года компания ZOZO (крупнейшая в Японии платформа электронной коммерции в сфере моды) опубликовала в ACM Transactions on Graphics, ведущем журнале в этой области, решатель физических задач под сухим названием «Кубический барьер с динамической жесткостью, включающей упругость». В то время это едва ли привлекло внимание СМИ. Затем сообщество начало публиковать сравнительные тесты со всеми другими решателями, которыми они владели, и демоверсии ZOZO продолжали побеждать.
Демонстрации показали ткань, которая вела себя как ткань. Не резина, не желе, не призрак: а именно ткань. Пять слоев сетки, наложенных на сферу, каждый слой соприкасался со следующим, при этом ни один треугольник не вторгался в пространство другого. В ходе масштабных стресс-тестов решатель обрабатывал более 184 миллионов одновременно контактирующих пар без единого взаимного проникновения.
Чтобы понять, почему замена полиномов является таким значительным прорывом, необходимо взглянуть на десятилетия математических компромиссов, предшествовавших этому, и на то, как можно воспроизвести основную логику ZOZO в нескольких сотнях строк кода на Python.
Проблема, которую никто не смог полностью решить.
Ткань, на уровне, интересном инженеру-физику, представляет собой сетку вершин, соединенных треугольниками. Каждая вершина получает массу и скорость, и на каждом шаге по времени движок интегрирует второй закон Ньютона (F = ma) по всем вершинам одновременно. Силы возникают от гравитации, от упругого сопротивления ткани и от любых поверхностей, с которыми соприкасается ткань. Упругий аспект решен относительно хорошо: каждый треугольник моделируется как небольшой участок упругого материала, определяется его сопротивление растяжению и сдвигу, а силы выводятся из градиента деформации. Это стандартный метод конечных элементов, и он работает достаточно хорошо, чтобы не являться узким местом.
Именно на этапе столкновения любая умная идея в конечном итоге терпит крах.

Наивный подход основан на штрафных силах : когда две поверхности перекрываются, их раздвигают с силой, пропорциональной глубине проникновения. Просто и быстро, но принципиально реактивно: отталкивание активируется только после того, как проникновение уже произошло. При большом шаге по времени поверхности могут пройти насквозь друг друга до того, как начнет действовать сила, и если сделать штрафную силу достаточно жесткой, чтобы зацепить быстро движущиеся поверхности, возникнут численные нестабильности, которые разрушат моделирование.
Другой классический подход — проекция ограничений : в конце каждого шага обнаруживаются пересечения, и вершины явно раздвигаются, чтобы их разрешить. На практике он более стабилен, но не обеспечивает надлежащего сохранения энергии, вызывает дрейф при длительных симуляциях, а в сценах с тысячами контактов его становится действительно сложно сделать устойчивым: он разрешает одно пересечение и создает еще два.
На протяжении десятилетий существовал такой выбор: смириться с искажениями, смириться с неестественным растяжением или смириться с тем, что ваша симуляция время от времени будет взрываться, обычно это сочетание всех трех вариантов.
Постепенное увеличение потенциального контакта: золотой академический стандарт
В 2020 году исследовательская группа из американских академических кругов и промышленности опубликовала работу «Инкрементальный потенциальный контакт» (IPC) , в которой проблема столкновения была полностью переосмыслена. Ключевая идея: не моделируйте контакт как силу или ограничение. Моделируйте его как энергию.
В частности, добавьте к полной энергии член, который становится бесконечно большим по мере приближения двух поверхностей к нулевому расстоянию. Поскольку моделирование — это всего лишь минимизация энергии, решатель, естественно, будет избегать конфигураций, где поверхности находятся близко друг к другу — не потому, что вы ему это указали, а потому, что перемещение в них потребует бесконечной энергии. Проникновение становится математически недостижимым, а не просто штрафуемым.
На каждом шаге вы решаете следующую задачу:
[
x_{t+1} = text{argmin}(E_{kinetic}(x) + E_{elastic}(x) + B(x))
[
где B(x) — энергия барьера : функция, которая резко возрастает, когда любая пара поверхностей оказывается в пределах порогового расстояния d̂ . Барьер IPC является логарифмическим:
$$
B_{log}(d)=
begin{cases}
-(d-hat{d})^{2}log!left(frac{d}{hat{d}}right), & d
Источник: towardsdatascience.com
