2015-07-10 2 views
0

Каков правильный способ добавления ограничения сферы на ткань?Частица (ткань) в сферное столкновение

Я пытаюсь добавить сферу (или капсулу), ограничивающую Skeel Lee's cloth simulation source code, но я не уверен, как это сделать правильно.

Я создал довольно простое ограничение, какой «кайф» частица назад из области в противоположном направлении (противоположном от вектора по направлению к центру):

void SatisfySphereConstraints() 
{ 
    foreach (var simObj in this.simObjects) 
     simObj.CurrPosition += SphereConstraint(simObj.CurrPosition, _center, _radius); 
} 

Vector3 SphereConstraint(Vector3 position, Vector3 center, float radius) 
{ 
    var delta = position - center; 
    var distance = delta.Length(); 
    if (distance < radius) 
     return (radius - distance) * delta/distance; 

    return Vector3.Zero; 
} 

И затем я вставил метод в существующий код:

ApplyForces(); 
Integrate(); 

for (var i = 0; i < constraintIterations; i++) 
{ 
    foreach (Constraint constraint in constraints) 
     constraint.SatisfyConstraint(); 

    SatisfySphereConstraints(); // <-- I added it here 
} 

код столкновение работает довольно хорошо для таких ситуаций (C является центром сферы, P является текущим положением частицы, P' это разрешенная позиция):

Satisfying sphere constraints for slow particles

Но проблема возникает, если частицы двигаются очень быстро, потому что тогда частица в основном переходит на другую сторону сферы (P1 является предыдущим положением, P2 является текущим положением, P' как я думает, что он должен быть решен), вместо того, чтобы вернуться обратно в предыдущее положение:

Satisfying sphere constraints for fast particles

Поскольку это моделирование ткани, ткань в основном перепрыгивает сферы в этом са вместо того, чтобы «остановить» сферу.

Теперь я мог бы попытаться вернуться в направлении предыдущей точки, но так как сфера также может двигаться, я не уверен, что P1 - даже действительная позиция (и если это будет иметь смысл). Кроме того, это кажется более дорогостоящим вычислительным - это то, как я должен это делать, или нет?

+0

Извините, не можете найти код в ссылке, не могли бы вы предоставить ссылку на исходный код? – Yola

ответ

0

Ткань как вещи, привязанные к неправильной стороне препятствия, и застревание там не слишком необычно. Еще более распространенными являются быстро перемещающиеся объекты, перекрывающиеся слишком сильно, когда обнаружено столкновение.

Общим решением является то, что при обнаружении столкновения подразделение подразделяет предыдущий шаг до тех пор, пока столкновение не станет менее серьезным, а затем разрешит его. Я думаю, вы обнаружите, что пытаетесь определить, насколько глубокое столкновение будет сложным в вашем случае, но если бы вы могли ограничить максимальную скорость сфер в вашей системе, вы могли бы бинарно разделить кадры, в которых столкновения происходят фиксированное количество раз и предполагают это будет достаточно хорошо?

if (it collides at time T and didn't at T-1) 
    if (it collides at T-0.5) 
     try T-0.75 
    else 
     try T-0.25 

и т.д ...

Вы готовы признать, что иногда неправильно, или же он должен быть всегда хороший результат?

Смежные вопросы