Войти
Box2DФорумОбщее

Импульс тела, зная высшую точку траектории

#0
18:03, 18 апр. 2014

Здравствуйте.
С каким импульсом бросить тело, зная угол запуска тела, и высшую точку траектории, которую мы указываем, к примеру, курсором?
Сильно не пинайте, понимаю что ответ где-то в физике за 7 класс, но из головы вылетело все начисто.
Заранее спасибо!


#1
20:31, 18 апр. 2014

смотри тут http://www.iforce2d.net/b2dtut/projected-trajectory

#2
21:21, 18 апр. 2014

Спасибо, как раз нашел и разбираю этот пример:

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). ((

#3
23:36, 18 апр. 2014
VOsinski
Ткну пальцем в небо: гравитация с правильным знаком?

На выходе у тебя время 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 - модуль нужной тебе скорости.
Если я ничего не напутал, то все должно быть именно так)

#4
23:51, 18 апр. 2014

Да, гравитацию получаю из бокс2д мира. Спасибо за Ваш пример. Попробую сделать с ним.
З.Ы,
Или, это был не пример?)) Я, что-то уже совсем запутался.

#5
5:12, 19 апр. 2014

Огромное спасибо за формулу! С вертикальной скоростью все хорошо. А вот со скоростью по х - не очень.
Если я правильно понял, то скорость по х можно разложить из общей вот так: Vx = V*cos(a)?
Но у меня получается, что чем дальше точка по х, в которой должна находится вершина траектории, то истинная ее вершина еще дальше.
В принципе, с помощью какой-то уличной магии, решил эту проблему, но интересно узнать, как это правильно сделать?
Красная точка - вершина нужной траектории. Голубые - реальная траектория
Снимок111 | Импульс тела, зная высшую точку траектории
Снимок222 | Импульс тела, зная высшую точку траектории
Снимок333 | Импульс тела, зная высшую точку траектории

#6
16:12, 19 апр. 2014

VOsinski

А аргумент косинуса у Вас в радианах?

#7
16:48, 19 апр. 2014

VOsinski
Дело в том, что с фиксированным углом не получится сделать так, чтобы вершина настоящей совпадала с заранее заданной. Придется выбирать что-то одно.
Мое решение подходит для задачи, сформулированной в первом посте: угол и наивысшая точка.

Если отказаться от фиксированного угла, то все просто:

Vx = dx/t  // где dx ресстояние между точкой запуска и красной точкой по оси Х, t получено в первой части

Скорость находим из двух компонент:
V = sqrt(Vx*Vx+Vy*Vy)

Если понадобится угол, то он
a = atan(Vy/Vx)

#8
18:43, 19 апр. 2014

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 тут надо брать положительное.

читайте физику ребята :)

#9
19:50, 19 апр. 2014

tegauss

VOsinski

А аргумент косинуса у Вас в радианах?

Да, конечно в радианах.

Snorkasnork
, спасибо! Попробую еще эти формулы!

putNik! И Вам спасибо огромное. Можно ли начальную скорость разложить так:

Vx=sqrt (2*g*Dx)
Vy=sqrt (2*g*Dy)???
Где Dx и Dy - расстояние между точкой запуска и верхней точкой траектории, по х и у, соответсвенно?

#10
20:45, 19 апр. 2014

VOsinski
то что я написал это Vy,
а Vx так как написал Snorkasnork в п.7
> Vx = dx/t // где dx ресстояние между точкой запуска и красной точкой по оси Х, t получено в первой части
время находишь так:
> t= Vy/g //именно в этот момент t скорость "закончится"

почти уверен, что должно получиться при таких скоростях попасть в красную точку на рисунке.

#11
21:00, 19 апр. 2014

Большущее спасибо!
Попробую - отпишусь о результате.

#12
14:48, 23 апр. 2014

Всех благодарю за ответы! Все работает!
Для тех, у кого будут подобные затруднения, собираю формулы вместе:

Vy = sqrt (2*g*h),
где h это расстояние между точкой запуска и вершиной траектории по у, а g - положительное.
Vx = dx/t,
где dx - это расстояние между точкой запуска и вершиной траектории по х, а
t = Vy/g
Угол:
a = atan(Vy/Vx)
Еще раз всех благодарю за помощь! Очень помогли!

Box2DФорумОбщее

Тема в архиве.