Другие языки программирования и технологии

Третий день ипусь над воздушным сопротивлением в Unity на C#. Кто силен? Помогите пожалуйста! (МНОГОБУКВ >>)

dragForce = (0.4f * curPressure * sq * curVelSq) / rb.mass;
Это сила воздушного сопротивления.
0.4 - это просто аэродинамический коэффициент.
curPressure - плотность воздуха на данной высоте (меняется с высотой). На уровне моря = 1.22
sq - площадь поперечного среза снаряда. Квадрат его диаметра умножил на число Пи. К примеру для 305 мм снаряда: 0.305^2*3.14 = 0,2920985 кв. метров.
curVelSq - квадрат текущей скорости. Меняется в процессе полета. Начальная скорость для примера = 720 м/с.
А потому curVelSq будет = 518400

И все это делю на массу снаряда, потому что 1 кг. снаряд летящий с начальной скорость 720 м/с и 1 тонный снаряд вылетевший с такой же скорость - будут рассекать воздух совсем иначе и тяжелый должен улететь дальше. Для примера возьмем, что масса снаряда = 650 кг. Хотя в оригинальной формуле, которую я взял из википедии, на массу ничего не делалось и она вообще никак не учитывалась.

ru.wikipedia.org/wiki/%D0%9B%D0%BE%D0%B1%D0%BE%D0%B2%D0%BE%D0%B5_%D1%81%D0%BE%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5

Другие формулы даже не пробовал, т. к. они слишком сложные для моего понимания.

Вот сам скрипт полета снаряда в безвоздушном пространстве:

rb.velocity = (startingAngle * speed * Mathf.Cos(angle)) - (this.transform.up * Mathf.Sin(angle)) + (Physics.gravity * (t * t) / 2);

startingAngle - вектор начала движения снаряда. speed - начальная скорость снаряда (не меняется в процессе).
Mathf.Cos(angle) - косинус угла снаряда.

this.transform.up - вектор текущего направления полета снаряда.
Mathf.Sin(angle) - синус угла снаряда.

и прибавляем векторную скорость гравитации, чтобы снаряд падал. (Physics.gravity * (t * t) / 2);
Ускорение свободного падения как и везде, равно 9.81 м/с.
t - прошедшее время полета снаряда с момента выстрела.

В чем вопрос...
Скрипт полета снаряда работает прекрасно! Но только в безвоздушном пространстве. Т. е. снаряд описывает симметричную траекторию. Я хочу реализовать сопротивление воздуха, но понятия не имею как ее сюда применить. Мой скрипт воздушного сопротивления, которые я выложил выше, работает черт знает как. Я уже второй день пытаюсь методом тыка его куда-нить вставить, но куда бы я его не вставил, снаряд летит не правильно. Уже просто заипался с этим воздушным торможением. В гугле материала по этой теме много, но с математикой у меня очень плохо. Можно и забить вообще на это чертово сопротивление, но не хочу так быстро сдаваться.

Я хочу в итоге получить такую несимметричную траекторию:
это, имхо, дифур решать векторный придется.
короче, пусть есть скорость точки:
V = (Vx, Vy)
и на эту точку действуют:
1) сила тяжести:
Fт = (0, -mg)
2) сила сопротивления среды, пропорциональная квадрату скорости, направленная противоположно вектору скорости:
Fс = - V / |V| * (a*|V|^2)

из второго закона Ньютона получаем уравнение:
ma = mV' = Fт + Fc

расписываем покоординатно:
m V'x = - a * sqrt(Vx^2 + Vy^2) * Vx
m V'y = - a * sqrt(Vx^2 + Vy^2) * Vy - mg

разделим на m и получим:
V'x = - a/m * sqrt(Vx^2 + Vy^2) * Vx
V'y = - a/m * sqrt(Vx^2 + Vy^2) * Vy - g

решить это тяжело, да и незачем: есть метод Эйлера.
рассмотрим промежуток времени t, t+h
на нем производные заменяем конечными разностями и получаем:
[ Vx(t+h) - Vx(t) ] / h = - a/m * sqrt(Vx^2(t) + Vy^2(t)) * Vx(t)
[ Vy(t+h) - Vy(t) ] / h = - a/m * sqrt(Vx^2(t) + Vy^2(t)) * Vy(t) - g
отсюда можно выразить V(t+h) через V(t):
Vx(t+h) = - h * a/m * sqrt(Vx^2(t) + Vy^2(t)) * Vx(t) + Vx(t)
Vy(t+h) = - h * a/m * sqrt(Vx^2(t) + Vy^2(t)) * Vy(t) - h*g + Vy(t)

ну и всё, этим можно пользоваться для построения траектории:
если есть x, y, Vx, Vy, то через малый промежуток времени h их можно пересчитать по формуле:
Vx = Vx * (1 - h * a/m * sqrt(Vx^2 + Vy^2) )
Vy = Vy * (1 - h * a/m * sqrt(Vx^2 + Vy^2) ) - h*g
x = x + h*Vx
y = y + h*Vy
Миша .
Миша .
85 909
Лучший ответ
Андрей Рожнев Спасибо огромное за такой развернутый ответ! Специально что-ли для моего вопроса писали программу на скриншоте?) Если и после вашего ответа я не смогу это реализовать, тогда грош цена мне как программисту...)