Как сделать столкновение интеграции верлетов более стабильным?
Я не использую какой-либо движок, но вместо этого пытаюсь создать собственную динамику мягких тел для забавы, используя интеграцию верлетов. Я создал куб размером 4х4 с сегментами, сохраняющими свою форму следующим образом:
У меня есть точки сталкиваются с краями сцены, и, кажется, работает нормально. Хотя я получаю некоторые случаи, когда точки разрушаются сами по себе, и это создает вмятину вместо сохранения формы коробки. Например, если это достаточно высокая скорость и он приземляется на своем углу, он имеет тенденцию крошиться:
Я должен делать что-то не так или не в порядке при решении столкновения. Вот как я с этим справляюсь. Это в Javascript, хотя язык не имеет значения, не стесняйтесь отвечать на любом языке:
sim = function() {
// Sim all points.
for (let i = 0; i < this.points.length; i++) {
this.points[i].sim();
}
// Keep in bounds.
let border = 100;
for (let i = 0; i < this.points.length; i++) {
let p = this.points[i];
let vx = p.pos.x - p.oldPos.x;
let vy = p.pos.y - p.oldPos.y;
if (p.pos.y > height - border) {
// Bottom screen
p.pos.y = height - border;
p.oldPos.y = p.pos.y + vy;
} else if (p.pos.y < 0 + border) {
// Top screen
p.pos.y = 0 + border;
p.oldPos.y = p.pos.y + vy;
}
if (p.pos.x < 0 + border) {
// Left screen
p.pos.x = 0 + border;
p.oldPos.x = p.pos.x + vx;
} else if (p.pos.x > width - border) {
// Right screen
p.pos.x = width - border;
p.oldPos.x = p.pos.x + vx;
}
}
// Sim its segments.
let timesteps = 20;
for (let ts = 0; ts < timesteps; ts++) {
for (let i = 0; i < this.segments.length; i++) {
this.segments[i].sim();
}
}
}
Пожалуйста, дайте мне знать, если мне нужно опубликовать какие-либо другие детали.
1 ответ
На этот вопрос лучше ответить при обмене физикой или разработчиками игр (и, вероятно, это уже было сделано), но я дам ему пару слов, потому что приятно вернуться к этому материалу...
Интеграция Verlet является фантастически стабильным, если не физически точным методом, но проблема здесь не в методе интеграции, или в том, что вы сделали неправильно, насколько я вижу; это тип симуляции: физика массовых агрегатов (построение геометрии из динамических ограничений), которая действительно хороша и проста:), но имеет некоторые недостатки и ограничения, и эта конкретная проблема присуща типу симуляции.
Во-первых, внимательно посмотрите на расположение ограничений в свернутом блоке - они так же действительны, как и исходные. Хотя отдельные ограничения могут быть не такими удовлетворительными, в сочетании они все еще находятся в локальном равновесии друг с другом - ничто не заставляет их формировать свое первоначальное расположение.
Во-вторых, внешняя сила (столкновение с неподвижной плоскостью) - это то, что первоначально преодолело силы ограничения. Даже если ограничения реагируют пропорционально на бесконечность при сжатии - симуляция никогда не сможет соответствовать реальности, потому что она работает кадр за раз, а не непрерывно, и чем длиннее кадр, тем больше ошибок.
Для более надежного сохранения формы требуется более явное угловое ограничение, которое обычно включает кватернионы - их реализовать немного сложнее, чем ограничения по расстоянию, и, как только вы их получите, вы все равно будете довольно далеко продвигаться к реализации физики твердого тела., Но есть способы смягчения:
1. Используйте меньший интервал
Все апостериорное моделирование и численное интегрирование в целом имеют некоторую внутреннюю нестабильность. Хотя различные методы интеграции (например, verlet) могут смягчить это, обычно чем меньше интервал, тем лучше стабильность. Одно это даст ограничениям больше возможностей для отталкивания от внешних сил, но также увеличит максимальную устойчивую жесткость ограничения.
Это, вероятно, потребует от вас оптимизации вашего двигателя. Кроме того, убедитесь, что вы не связываете свой шаг рендеринга с симуляцией, вы хотите иметь возможность рендеринга с кратными интервалами симуляции, что позволяет вам запустить симуляцию быстрее для стабильности без ненужного рендеринга большего количества кадров, чем полезно, так как это будет просто замедлите симуляцию.
2. Попробуйте более устойчивые формы
Для вашей формы box-of-of-box, посмотрите, что произойдет, если вы добавите больше ограничений между дальними вершинами, это добавит большей глобальной стабильности к форме.
Распространенным типом фигуры, которую люди создают с помощью физики массовых агрегатов, являются полигоны, потому что очень просто сделать их сильно взаимосвязанными (немного похоже на велосипедное колесо, но где каждая точка спицы соединяется с любой другой точкой спицы). На самом деле спицевидные конструкции являются одними из самых стабильных, но обычно вы можете применять те же принципы к более неправильным формам, как только получите интуицию.
3. Другой тип ограничения
Кватернионы - не единственное возможное ограничение, которое поможет сохранить конфигурацию, главная проблема не столько в том, что явный угол не поддерживается; скорее, когда точки вынуждены проходить определенную позицию относительно своих братьев и сестер, их ограничения по расстоянию переворачиваются и начинают работать в обратном направлении - удерживая их на той стороне.
Может быть много разных способов решить эту проблему без чего-то столь же сложного, как четвертики - на самом деле, я подумаю над этим и отредактирую этот пост, если я что-нибудь придумаю, у меня будет немного больше боеприпасов с тех пор, как я в последний раз изучал физику массового скопления...