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))