Каков правильный способ добавления ограничения сферы на ткань?Частица (ткань) в сферное столкновение
Я пытаюсь добавить сферу (или капсулу), ограничивающую 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'
это разрешенная позиция):
Но проблема возникает, если частицы двигаются очень быстро, потому что тогда частица в основном переходит на другую сторону сферы (P1
является предыдущим положением, P2
является текущим положением, P'
как я думает, что он должен быть решен), вместо того, чтобы вернуться обратно в предыдущее положение:
Поскольку это моделирование ткани, ткань в основном перепрыгивает сферы в этом са вместо того, чтобы «остановить» сферу.
Теперь я мог бы попытаться вернуться в направлении предыдущей точки, но так как сфера также может двигаться, я не уверен, что P1 - даже действительная позиция (и если это будет иметь смысл). Кроме того, это кажется более дорогостоящим вычислительным - это то, как я должен это делать, или нет?
Извините, не можете найти код в ссылке, не могли бы вы предоставить ссылку на исходный код? – Yola