@SergeySerge11

Откуда происходит затухание при моделировании падения частицы?

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

public void ApplyGravitation(float dt)
        {
            int num = particleList.Count;
            float gravitatity=9.8f ;
            float fG = gravitatity * dt;
            for (int i = 0; i < num; i++)
            {
               particleList[i].Velocity.Y += fG; 
            }

        }
     public void UpdatePosition(float dt)
        { 
            int numParticles = NumParticles; 
            float maxH = h -(float)ParticleRadius;
            for (int i = 0; i < numParticles; i++)
            {
                Particle p = particleList[i]; 
                p.Pos += p.Velocity * dt;
                
                 if (p.Pos.Y >= maxH)
                {
                   // var dy = (p.Pos.Y-maxH);
                   // p.Velocity.Y -= dy / dt;
                   // p.Pos.Y -=dy;
                    p.Pos.Y = maxH;
                    p.Velocity.Y *= (-1);
                } 
            } 
        }

Происходит со временем затухание, высота все меньше и меньше, хотя я ожидаю Что частица будет вечно прыгать(какой-то класс проблем).
Затухание происходит при dt от 0.05.
Там есть всегда момент когда шарик чуть заходит под границу, то есть пробеливает лишнею работу, то есть долю времени выполняет запрещенную работу, а значит и имеет чуть большое ускорение. Сколько раз реализовывал такую задачу и видел кодов, решений, ни где не поднимали эту проблему. Либо я в моменте что-то упустил
Но мне кажется это какая-то проблема у которой есть какое-то определённое Google Key Word название, без знания которого ты ни когда не загугнишь.

Там еще есть момент, допустим шарик почти поднялся на макс высоту, текущая скорость допустим -0.2, Ускорение в этот момент добавляет +0.5 скорости, то есть следующая скорость будет +0.3, то есть шарик не долетит до максимума, а начнет падать на итерации чуть раньше, и эта дельта времени или расстояния Накапливается,
  • Вопрос задан
  • 116 просмотров
Решения вопроса 2
Ocelot
@Ocelot
Не важно, где имненно находится точка отскока, шарик должен подниматься на одну и ту же высоту. Можно сделать так: как только заметили, что шарик зашёл под границу, инвертируем его скорость, не меняя координаты.
if (p.Pos.Y >= maxH && p.Velocity.Y > 0)
{
    p.Velocity.Y *= (-1);
}
Ответ написан
@CBET_TbMbI
Код анализировать лень, но если хочешь копаться, то изучай проблемы численных методов (сходимость, устойчивость и т.п.).
Хитрость в том, что ты хочешь заменить плавно-изменяющуюся функцию на кусковую, якобы из прямых отрезков на твоём dt. Но на самом деле на этом dt ускорение тоже изменяется. В итоге есть риск накапливать ошибка с каждым шагом. И это не считая проблем граничных частей, которые ты сам описал.
Тут картинки есть: stratum.ac.ru/education/textbooks/modelir/lection1...
А вообще книг по этим вопросам хватает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы