Функция C ++ для расчета и выборки траектории снаряда в трехмерном пространстве. Физика программирования

Мне нужно написать функцию на C ++, которая может моделировать и пробовать кривую траектории объекта, движущегося в трехмерном пространстве.

Постановка задачи:

Функция должна будет принимать 3 аргумента в качестве входных данных. Прототип функции может выглядеть примерно так:

void CalculateAndSampleTrajectory(Vec3 direction, float impulse, float mass)
{
//...
}

Направление Vec3 это структура. По сути, это 3 поплавка, которые ведут себя как единичный вектор, описывающий начальный угол импульса.

импульс плавания это величина того, насколько мощный импульс.

плавающая масса описывает массу проецируемого объекта.

Функция будет принимать эти 3 аргумента и затем предварительно вычислять траекторию объекта этой массы, учитывая этот мгновенный импульс, выстреленный вдоль этого вектора.

Это можно сделать, взяв образцы (скажем, 200) траектории в течение первых 4 секунд полета. Эти образцы будут Vec3s позиции снаряда и сохранены в массиве.

Все единицы даны как СИ, ускорение силы тяжести составляет 9,81. Мы не будем учитывать какое-либо сопротивление воздуха.

Что я уже выучил:

Эта проблема имеет дело со многими физиками, особенно с классической механикой. Эта область не моя сила, но у меня есть базовое понимание того, что происходит.

Я знаю, что мне понадобится скорость объекта, которую, я думаю, можно рассчитать как:

Vec3 velocity = (direction * impulse)/mass;

Я думаю, что это работает, потому что мой импульс будет применен мгновенно, и поэтому это будет е = та перестроен, чтобы найти но как трехмерный вектор. Если честно, я даже не уверен, что это правильно, но я думаю, что это так.

Как только у меня появится скорость, я знаю, что смогу воспользоваться многочисленными уравнениями, которые доступны онлайн, такими как Статья в Википедии о траектории

Я не очень хорош в интерпретации этих уравнений в C ++.

После настройки соответствующего уравнения мне нужно будет взять 200 выборок за 4 секунды. Это можно сделать в цикле:

for(int i = 0; i < 200; i++)
{
int t = 0;
//sample equation with t
//store resulting vec3 pos in array
t = t + 0.02;
}

Решение моего уравнения в T будет дан как координаты положения объекта в это время и должен иметь 3 параметра (x, y, z), чтобы он был сохранен в Vec3.

Где мне нужна помощь:

Я не знаю, как выполнить необходимое физическое программирование, чтобы правильно настроить уравнение, чтобы можно было его сэмплировать. Я не могу интерпретировать теоретическое обсуждение физики в Википедии и других источниках в функцию C ++.

Спасибо за любую помощь, которую вы можете предоставить.

4

Решение

По сути, есть только одно уравнение, относящееся к вашей проблеме:

введите описание изображения здесь

который дает вам позицию во время t (из t0).

Теперь у вас уже есть s0 и у тебя есть v0, которая является начальной скоростью, уже рассчитанной по импульсу. Что вам нужно, это ускорение.

В вашем случае у вас просто есть сила тяжести, которая постоянна во времени, и это в основном vec3, указывающий вниз с префиксом (9,8 м / с ^ 2).

Вам не нужно вычислять значения на каждом шаге, так как вы можете интегрировать значение напрямую, результат следующего шага не зависит от предыдущего.

Это не учитывает какую-либо форму силы сопротивления, в противном случае вы должны включить ее.

2

Другие решения


По вопросам рекламы [email protected]