Мне нужно написать функцию на 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 ++.
Спасибо за любую помощь, которую вы можете предоставить.
По сути, есть только одно уравнение, относящееся к вашей проблеме:
который дает вам позицию во время t
(из t0
).
Теперь у вас уже есть s0
и у тебя есть v0
, которая является начальной скоростью, уже рассчитанной по импульсу. Что вам нужно, это ускорение.
В вашем случае у вас просто есть сила тяжести, которая постоянна во времени, и это в основном vec3, указывающий вниз с префиксом (9,8 м / с ^ 2).
Вам не нужно вычислять значения на каждом шаге, так как вы можете интегрировать значение напрямую, результат следующего шага не зависит от предыдущего.
Это не учитывает какую-либо форму силы сопротивления, в противном случае вы должны включить ее.