Verlet Integration - решение проблем с коллизией

Программирование на Юнити.

Verlet Integration - решение проблем с коллизией

Сообщение alexwithalice 10 июл 2021, 14:08

Всем привет, пытаюсь написать свою реализацию Verlet Integration для использования в качестве верёвки в своих проектах. Нашел хорошую статью зарубежную по реализации этого дела в Unity и начал писать сам, изучать, подсматривать в статье. В итоге все вышло, все работает. Но дошло дело потом до расчета коллизий. В той статье человек рассматривал вариант коллизии частиц(верёвки) без учета радиуса самих частиц. Иначе говоря, он сравнивал их как точки с другими объектами(окружность, квадрат, он делал в 2Д, я же перенес в 3Д). В итоге я решил изменить расчета с учетом радиуса самих частиц. Все заработало, НО, теперь в состоянии покоя, когда веревкаперестала двигаться, после коллизии с объектом, она дергается постоянно. Не могу найти причину этому.
Попробую перенести сюда с stackoverflow свой код, но если что вот ссылка на вопрос там же, только на англ.языке:https://stackoverflow.com/questions/68313100/verlet-integration-problem-with-distance-constraint-and-collision-detection-jitt
Так же сама статья, по которой писал:http://toqoz.fyi/game-rope.html

Буду благодарен за ответы, советы и любую помощь) Не прошу за меня писать ничего, просто хотелось бы понять, где допустил ошибку или чего не хватает. Заранее спасибо)

Гифка того, как дергается:

Скрытый текст:
Изображение


Вариант столкновения со сферой:
Синтаксис:
Используется csharp

float radius = collision.Size.x * Mathf.Max(
Mathf.Max(collision.Transform.localScale.x, collision.Transform.localScale.y),
collision.Transform.localScale.z);

for (int j = 0; j < collision.CollisionAmount; j++)
{
    Particle particle = particles[collision.CollidingNodes[j]];
    float distance = (collision.Transform.position - particle.current).magnitude;

    if (distance > radius + collisionRadius)
    {
        continue;
    }


    Vector3 direction = (particle.current -
       collision.Transform.position).normalized;

    Vector3 newPosition = collision.Transform.position +
        direction * (radius + collisionRadius);
    particle.current = newPosition;

    particles[collision.CollidingNodes[j]] = particle;
}
break;
 


То как выглядит Fixed Update():
Синтаксис:
Используется csharp
void FixedUpdate()
    {
        UpdatePinned();

        CollectCollisionInfo();
        UpdatePositions();
        for (int i = 0; i < solveIterations; i++)
        {
            AdjustDistances();
            AdjustCollisions();
        }

        UpdateVisual();
    }
 
alexwithalice
UNец
 
Сообщения: 3
Зарегистрирован: 10 июл 2021, 13:51

Re: Verlet Integration - решение проблем с коллизией

Сообщение 1max1 10 июл 2021, 14:14

Как-то трудно что-то сказать по коду. У тебя движение происходит через физику или через ручное задание позиции в трансформ?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Verlet Integration - решение проблем с коллизией

Сообщение alexwithalice 10 июл 2021, 15:40

Кастомная обработка коллизиий, поэтому да, у меня двигается все через трансформ, я не хочу привязываться к физике Unity. Выше есть ссылка, там есть код и показано как двигается объект. Я могу скинуть более подробный кусок кода, только скажите какой необходим
alexwithalice
UNец
 
Сообщения: 3
Зарегистрирован: 10 июл 2021, 13:51

Re: Verlet Integration - решение проблем с коллизией

Сообщение alexwithalice 12 июл 2021, 22:25

Есть кто может поучаствовать в дискуссии?)
alexwithalice
UNец
 
Сообщения: 3
Зарегистрирован: 10 июл 2021, 13:51

Re: Verlet Integration - решение проблем с коллизией

Сообщение Alkos26Rus 12 июл 2021, 22:58

Что приводит звенья в дефолтное состояние по позиции? Проверка столкновения срабатывает и там вроде все нормально, но эти звенья наверно ты как то приводишь в обычное состояние когда нет припятствий. Или они остаются на своем месте если убрать сферу после столкновения, я к тому что может у тебя работает одновременно код?
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Verlet Integration - решение проблем с коллизией

Сообщение 1max1 12 июл 2021, 23:26

Похоже, это та проблема, которую тебе придется решить самому)
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13