Как рассчитать положение движущегося объекта на линии

#c #game-physics #billiards

#c #игровая физика #бильярд

Вопрос:

Так что в основном я делаю игру в бильярд (вроде как) на c . Я все еще думаю о теории и о том, как именно это сделать, прежде чем я начну кодировать, и я немного застрял. Таким образом, задаются стартовые координаты мяча, а также вводится информация о том, сколько энергии уходит на выстрел, и направление выстрела с координатами.

Пример:

 gt; Ball: (280,70)  Input: gt; 2(power) 230(x) 110(y)  Output: gt; 180(x) 150(y)  

Мощность означает, что в основном она будет проходить X * расстояние по заданным координатам. Так что если это 1, то он просто увеличится до 230 110, но если больше, то он увеличится вдвое, втрое, вчетверо и т. Д. На это расстояние. (внешние факторы следует игнорировать — трение и т.д.)

К настоящему времени мне удалось создать алгоритм, позволяющий найти линию, по которой будет двигаться мяч. Но я не могу понять, в какой точке этой линии остановится мяч. Любая помощь будет очень признательна!

И еще одна вещь, мне также нужно рассчитать, куда он направится, если ударится о стену бильярдного стола(бильярдный стол представляет собой прямоугольник 2:1 с заданными координатами ребер), и мне также удалось найти линию, по которой он будет двигаться, но не точную точку, где он остановится.

TL;DR Мне нужно найти точку линии движения, в которой остановится бильярдный шар.

Комментарии:

1. В вашем мире без трения бильярдный шар (без вращения) будет двигаться до тех пор, пока не столкнется (не ударится) с другим объектом, таким как бампер, другой шар или луза. Сила (мощь), которую вы вкладываете в мяч, означает, что он попадет в цель за меньшее время. Трения нет, поэтому нет ничего, что могло бы замедлить мяч. Физика, мой друг, физика.

2. Да, это правда. Но в этом случае это похоже на то, что шар движется по заданным координатам, перемещаясь по линии, и если мощность равна 1, он останавливается, но если она больше, он продолжается на той же линии на том же расстоянии X(мощность) раз.

3. Если мы упростим это до 2D-представления, то Кий (отрезок линии) соприкасается с окружностью. Сигнал имеет величину и направление (физическое определение вектора). Поскольку вы просты, направление, в котором будет двигаться круг, — это направление, в котором отрезок линии «попадает» в круг. Величина будет применена к окружности. Больше Физики.

4. Два способа, которыми шар может потерять энергию (и, следовательно, замедлиться), — это трение и неупругие столкновения. Если вы не хотите явно моделировать трение, то вы можете подделать его, если скорость шара начнется с некоторого значения, пропорционального вашей «мощности», А затем уменьшится (линейно, квадратично и т. Д.) С пройденным расстоянием.

5. @CoryKramer Да, в значительной степени

Ответ №1:

Вероятно, вы хотите работать с точки зрения ортогональных компонентов, в основном думая о перемещении шара с точки зрения deltaX и deltaY вместо того, чтобы находить линию, по которой он будет двигаться. Удобно, что вы уже находитесь в прямоугольных координатах и можете вычислить свои изменения в x и y с последующим масштабированием их по вашему коэффициенту мощности. Например, здесь, deltaX = 2*(280-230) или -100 , таким образом , будет пункт назначения 280 -100 , который равен 180 .

Чтобы учесть края, вы привязали движение в любом направлении к 4 краям. У вас будет некоторое дополнительное смещение, если он ударится о край. Вы можете подумать о отскоке как об обратном движении части остатка, а затем рекурсивно вызвать свою moveBall функцию со степенью 1, когда задано положение на краю, в которое попадает мяч, плюс избыток deltaX и deltaY соответствующим образом изменен знак. Если moveBall его взяли std::pairlt;int, intgt; startingPosition, std::pairlt;int, intgt; displacement, int power , если он ударится о стену, вы вернетесь moveBall(locationOnEdge, predictedLocationBasedOnExcess, 1) . Эта настройка будет рекурсивно вызывать себя столько раз, сколько необходимо, пока шарик, наконец, не найдет свое конечное положение (шарик может несколько раз отскакивать от краев).

Например, если бы у вас было преимущество при x = 200 и y = 100 (это означает, что ваш заявленный желаемый результат был другим), у вас был бы оставшийся deltaX -20 и deltaY 50. Так как мяч двигался вверх и влево, он будет отскакивать вниз и влево. Вы бы назвали moveBall начальное местоположение (200, 100), смещение (-20, -50) и мощность 1.

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

Комментарии:

1. Значит, если он ударится о край, мне не нужно будет вычислять угол? И еще одна вещь — как изменится эта формула, если диаметр больше 0, так что это похоже на настоящий шар, а не просто ничего не двигается?

2. Все зависит от трения. Без этого не имеет значения, мяч это или точка, бампер не передает вращение , а угол отражения просто Pi - angle of incidence , если бампер эластичный (потеря энергии при отскоке), затем используйте простое сохранение импульса для упругих столкновений, чтобы установить состояние (импульс/энергия) шара после столкновения с бампером.

3. Большинство подобных проблем можно решить с помощью энергии ( 1/2 * m * v * v ) и импульса. ( m * v ). В неупругом случае вы знаете, что энергия и импульс сохраняются, поэтому вы можете написать уравнения для энергии и импульса до и после столкновения и установить их равными друг другу (например m0 = m1 , и E0 = E1 ) для решения большинства неизвестных. Позиции можно использовать для определения направления или пути. Как упоминалось другими ранее, всегда разбивайте все векторы на i , j , k компоненты и решайте с помощью методов прямых векторов. Гораздо проще, чем рисовать эквивалентные треугольники.