#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
компоненты и решайте с помощью методов прямых векторов. Гораздо проще, чем рисовать эквивалентные треугольники.