Что-то похожее на то, что вы видите в видео, на которое вы ссылаетесь, может быть достигнуто с помощью системы массовых пружин.Однако, если вы изменяете количество масс и пружин, сохраняя свои постоянные пружины одинаковыми, вы получите сильно отличающиеся результаты.Короче говоря, системы массовых пружин не являются хорошим приближением континуума материи.
Как правило, эти виды анимации создаются с использованием так называемого метода конечных элементов (FEM).FEM действительно сходится к континууму, что приятно.И хотя это требует немного больше ноу-хау, чем система массового пружинного, это действительно не так уж плохо.Основная идея, полученная из изучения механики континуума , может быть сформулирована следующим образом:
Разбейте объем вашего объекта на множество маленьких кусочков (элементов)обычно тетраэдр .Давайте назовем всю коллекцию этих элементов сеткой.Вы действительно хотите сделать две копии этой сетки.Пометьте одну «остальную» сетку, а другую - «мировую».Я расскажу вам почему.
Для каждого тетраэдра в вашей сетке мира, измерьте, насколько деформирован он по отношению к соответствующему покоящемуся тетраэдру.Мера того, насколько она деформирована, называется «деформация».Обычно это достигается путем первого измерения так называемого градиента деформации (часто обозначаемого F ).Есть несколько хороших документов , которые описывают, как это сделать.Если у вас есть F , один из наиболее типичных способов определения деформации ( e ): e = 1/2 ( F ^T * F ) - I .Это известно как штамм Грина.Он инвариантен к поворотам, что делает его очень удобным.
Используя свойства материала, который вы пытаетесь смоделировать (желатин, резина, сталь и т. Д.), И используя деформациюВы измерили на шаге выше, выведите « напряжение » каждого тетраэдра.
Для каждого тетраэдра, посетите каждый узел (вершину, угол, точку (все этиозначают одно и то же)) и усредняют взвешенные по площади нормальные векторы (в форме покоя) трех треугольных граней, которые разделяют этот узел.Умножьте напряжение тетраэдра на этот усредненный вектор, и на этот узел действует сила упругости из-за напряжения этого тетраэдра.Конечно, каждый узел может потенциально принадлежать нескольким тетраэдрам, поэтому вы захотите суммировать эти силы.
Интегрируйте !Есть простые способы сделать это, и сложные способы.В любом случае, вам нужно перебрать каждый узел в вашей сетке мира и разделить его силы на его массу, чтобы определить его ускорение.Самый простой способ перейти отсюда:
- Умножить его ускорение на некоторое небольшое значение времени dt .Это дает вам изменение скорости, DV .
- Добавьте DV к текущей скорости узла, чтобы получить новую общую скорость.
- Умножьте этоскорость на dt , чтобы получить изменение позиции, dx .
- Добавьте dx к текущей позиции узла, чтобы получить новую позицию.
Этот подход известен как явная прямая интеграция Эйлера .Вам нужно будет использовать очень маленькие значения dt , чтобы заставить его работать без взрыва, но его так легко реализовать, что он хорошо работает как отправная точка.
Повторяйте шаги со 2 по 5 столько раз, сколько вы хотите.
Я упустил много деталей и интересных дополнений, но, надеюсь, вы сможете вывести многое из того, что яупустил. Вот ссылка на некоторые инструкции, которые я использовал в первый раз, когда сделал это.Веб-страница содержит несколько полезных псевдокодов, а также ссылки на некоторые соответствующие материалы.
http://sealab.cs.utah.edu/Courses/CS6967-F08/Project-2/
Следующая ссылка также очень полезна:
http://sealab.cs.utah.edu/Courses/CS6967-F08/FE-notes.pdf
Это действительно веселая тема, и я желаю вам удачи!Если вы застряли, просто оставьте мне комментарий.