@SergeySerge11

Как реализовать движение частиц в векторном поле или сплошной среде?

https://www.youtube.com/watch?v=VJ2ZDLQk3IQ
Вот пример, как это реализовать.
Я окончательно запутался в уравнениях.
Какой минимальный список уравнений нужен.

Исходные данные. максимально просто.
Есть массив xy значений Скалярного поля.

Далее есть массив изменения по x,y значений поля, в векторах, Это вообще что в терминах, Дивергенция ротор, Градиент, на всяк случай.
var dx=getField(x-1,y)-getField(x+1,y);
      var dy=getField(x,y-1)-getField(x,y+1);
      gradiendField[y[x]=(dx,dy); 
// правильно ли вообще

Далее есть частицы,
public class Ball
  {
      public Vector2 Velocity;
      public Vector2 Acceleration;
      public Vector2 Position;
      public float Change;
      public float Mass,Radius;
 
      public void Update(float dt)
      {
          Velocity += dt * Acceleration; 
          Position += Velocity * dt;
          Acellaction = Vector2.Zero;
      } 
  }

К примеру на это поле из картинки запускаются, вот как считать изменение их скорости на итерации.
float[] scalarField;
       Vector2[] gradiendField; 
       List<Ball>balls

Есть такие данные, достаточно ли этого нужны еще какие параметры.
Нерабочая модель, смешал все что можно,
for(){
            float angle = MathF.Atan2(b.Velocity.Y, b.Velocity.X); 
            // направляющие косинусы скорости частицы
            float cosA = MathF.Cos(angle);
            float cosB = MathF.Sin(angle);
            к=1.0;
            //рассчитываем ускорение
            // типа по производной по направлению,  хз может вообще не отсюда 
            b.Acceleration -= new Vector2(
                  cosA *(gradiendField[cellIndex].X * k),
                  cosB *(gradiendField[cellIndex].Y * k)
                );
         // вариант 2(вариантов штук 100 уже)
         // вот этот почему то более менее работает. Но частицы летают по дуге окружности, а не 
  по окружности(может там в параметре к дело)  
             b.Acceleration -= new Vector2(
                  (gradiendField[cellIndex].X * k),
                  (gradiendField[cellIndex].Y * k)
                );
            b.Update(1.0f);
                
}


Еще к примеру, если представить что значение поля в точке W(x,y)=h то есть высоте по z-координате, то есть представить что векторное поле поле высот холмов. а значение указывает на крутость подъемов, а частицы пускай будут шарами которые будут запускается, то как описать их движение. К примеру можно свести к школьной формуле движения груза a= g*(sin(a)-n*cos(a))

6594e462af50d363319663.png

6594de4de4d52094712195.png
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы