Доброго времени суток.
Пытаюсь смоделировать полет пули в 3D пространстве.
Принцип следующий:
[*]-точка, (*)-вектор.- имеется точка вылета пули [P0], вектор (S) направления полета, длинна которого равна скорости вылета (м/с).
- через каждые t секунд находится ускорение сопротивления воздуха на основе плотности и температуры воздуха и скорости пули - F (м/с2) и определяется новая позиция пули по формуле
[Pn] = [P(n-1)] +
((S) - ((S).Normal * F * t)
) * t
- в коде это выглядит так:
Vector3 Windage = -b.direction.normalized * F * t;
b.direction = b.direction + Windage;
Vector3 r = b.position + b.direction * t;
Для тестов беру характеристики реальных оружий и сверяю с баллистическими таблицами. Расхождение моих итоговых данных и реальных (полное время полёта пули, окончательная скорость пули) почти не ощутимое (+-0,1с, +- 15м/с)
Однако камнем преткновения стала гравитация. Из школы мало что помню, так что освежил память кучей статей. Т.к. позиция пули всегда пересчитывается, то просто к вектору (S) прибавляю вектор направленный вниз с длинной -9.80665 * t
- в итоге выглядит так
Vector3 Windage = -b.direction.normalized * F * t;
b.direction = b.direction + Windage + new Vector3(0, -9.80665f * t);
Vector3 r = b.position + b.direction * t;
И тут уже использовать баллистическую таблицу невозможно, требуется слишком сильно задирать ствол.
Например, для стрельбы c СВД на 500м требуется угол вылета пули 0,3градуса. А для моей формулы 0,9градуса.
Что я не учел? Подскажите, пожалуйста)