Здравствуйте.
С каким импульсом бросить тело, зная угол запуска тела, и высшую точку траектории, которую мы указываем, к примеру, курсором?
Сильно не пинайте, понимаю что ответ где-то в физике за 7 класс, но из головы вылетело все начисто.
Заранее спасибо!
Спасибо, как раз нашел и разбираю этот пример:
float calculateVerticalVelocityForHeight( float desiredHeight ) { if ( desiredHeight <= 0 ) return 0; //wanna go down? just let it drop //gravity is given per second but we want time step values here float t = 1 / 60.0f; b2Vec2 stepGravity = t * t * m_world->GetGravity(); // m/s/s //quadratic equation setup (ax² + bx + c = 0) float a = 0.5f / stepGravity.y; float b = 0.5f; float c = desiredHeight; //check both possible solutions float quadraticSolution1 = ( -b - b2Sqrt( b*b - 4*a*c ) ) / (2*a); float quadraticSolution2 = ( -b + b2Sqrt( b*b - 4*a*c ) ) / (2*a); //use the one which is positive float v = quadraticSolution1; if ( v < 0 ) v = quadraticSolution2; //convert answer back to seconds return v * 60.0f; }
a = 0.5 /( (1/35)*(1/35)*10) = 12.82
b * b = 0.5 * 0.5 = 0.25
c = 9
в итоге корень, для квадратного уравнения, получается из отрицательного числа (0.25 - 4*9*12,85). ((
На выходе у тебя время t, а не скорость.
Решается уравнение g(t^2)/2+v*t=h
Скорость ты задал в b. Отрицательное число под корнем говорит о том, что решения не существует. Значит с такой скоростью до такой высоты не долететь.
Ты в своем условии говорил про углы. тут кидают вертикально вверх.
Тебе нужно, чтобы ускорение загасило начальную скорость на нужной высоте.
v+gt=0 // гравитация (ускорение свободного падения) должна быть направленна вниз, быть отрицательной
t= -v/g //именно в этот момент t скорость "закончится"
g(t^2)/2+v*t = h // уже знакомое уравнение движения
(g(v/g)^2)/2 - v*(v/g) - h = 0 // подставляем новое t
(v*v) / (2g) - v*v / g - h = 0 // немного математической магии
(v*v) (-1/2)/g = h
v = sqrt (-2*g*h) // напомню, что g отрицательная, а h, надеюсь, положительная, так что корень будет не комплексный
Далее чудеса с углами. Обращаемся к тригонометрии.
Полученная нами v есть скорость по оси Y (обзовём Vy), допустим твой угол a.
Слава математике, есть такая вещь, которая связывает противолежащий катет и гипотенузу, называется синусом.
sin(a) = Vy/V
V= Vy/sin(a)
где V - модуль нужной тебе скорости.
Если я ничего не напутал, то все должно быть именно так)
Да, гравитацию получаю из бокс2д мира. Спасибо за Ваш пример. Попробую сделать с ним.
З.Ы,
Или, это был не пример?)) Я, что-то уже совсем запутался.
Огромное спасибо за формулу! С вертикальной скоростью все хорошо. А вот со скоростью по х - не очень.
Если я правильно понял, то скорость по х можно разложить из общей вот так: Vx = V*cos(a)?
Но у меня получается, что чем дальше точка по х, в которой должна находится вершина траектории, то истинная ее вершина еще дальше.
В принципе, с помощью какой-то уличной магии, решил эту проблему, но интересно узнать, как это правильно сделать?
Красная точка - вершина нужной траектории. Голубые - реальная траектория
VOsinski
А аргумент косинуса у Вас в радианах?
VOsinski
Дело в том, что с фиксированным углом не получится сделать так, чтобы вершина настоящей совпадала с заранее заданной. Придется выбирать что-то одно.
Мое решение подходит для задачи, сформулированной в первом посте: угол и наивысшая точка.
Если отказаться от фиксированного угла, то все просто:
Vx = dx/t // где dx ресстояние между точкой запуска и красной точкой по оси Х, t получено в первой части
Скорость находим из двух компонент:
V = sqrt(Vx*Vx+Vy*Vy)
Если понадобится угол, то он
a = atan(Vy/Vx)
Snorkasnork
> v = sqrt (-2*g*h) // напомню, что g отрицательная, а h, надеюсь, положительная,
формула правильная, но выводится проще:
1) потенциальная энергия тела на высоте h равна - Ep=m*g*h;
2) кинетическая энергия движущегося тела равна - Ek=m*V^2/2;
3) что-бы тело достигло высоты h, на высоте 0 оно должно иметь кинетическую энергию
равную потенциальной в высшей точке - Ek=Ep -> m*g*h=m*V^2/2;
отсюда сразу находим V=sqrt (2*g*h); - только g тут надо брать положительное.
читайте физику ребята :)
tegauss
А аргумент косинуса у Вас в радианах?
Да, конечно в радианах.
Snorkasnork
, спасибо! Попробую еще эти формулы!
putNik! И Вам спасибо огромное. Можно ли начальную скорость разложить так:
Vx=sqrt (2*g*Dx)
Vy=sqrt (2*g*Dy)???
Где Dx и Dy - расстояние между точкой запуска и верхней точкой траектории, по х и у, соответсвенно?
VOsinski
то что я написал это Vy,
а Vx так как написал Snorkasnork в п.7
> Vx = dx/t // где dx ресстояние между точкой запуска и красной точкой по оси Х, t получено в первой части
время находишь так:
> t= Vy/g //именно в этот момент t скорость "закончится"
почти уверен, что должно получиться при таких скоростях попасть в красную точку на рисунке.
Большущее спасибо!
Попробую - отпишусь о результате.
Всех благодарю за ответы! Все работает!
Для тех, у кого будут подобные затруднения, собираю формулы вместе:
Vy = sqrt (2*g*h),
Vx = dx/t,
t = Vy/g
a = atan(Vy/Vx)
Тема в архиве.