Как мне отразить точку от линии? - PullRequest
3 голосов
/ 14 мая 2009

Я работаю над написанием игры в понг и столкнулся с проблемой.

Я пытаюсь выяснить, как отразить точку на линии.

Лучший метод, с помощью которого я могу это сделать, это

  • Рассчитать текущую и будущую позицию мяча.
    • Сегмент линии: {Ball.location, Ball.location + Ball.direction} (Ball.location и Ball.direction используют пользовательский вектор / класс координат)
  • Вычислить, пересекается ли сгенерированный отрезок с какой-либо из стен или лопастей.
    • ??? Пока не знаю, как это сделать (задам в отдельном вопросе)
  • На первом перекрестке найдено
    • Отскок мяча от линии
      • Создайте треугольник, образованный
        • a = текущее положение мяча
        • b = точка пересечения линии.
        • c = Ближайшая точка к текущей позиции шара на линии.
      • Найдите угол, под которым мяч попадает в линию
        • угол = cos (расстояние (b, c) / расстояние (a, b))
      • Найдите угол поворота мяча
        • (90 - угол) * 2
      • Поверните направление мяча и переместите его в новое положение
        • игнорируя пройденное расстояние, чтобы достичь линии на данный момент, не обязательно должно быть точно на линии
  • Иначе, если пересечения нет
    • Переместите мяч в новое положение.

Это приемлемый метод или я что-то упустил?

Ответы [ 6 ]

5 голосов
/ 14 мая 2009

Вам просто нужно проверить, находится ли центр шара в пределах его радиуса от лопасти, чтобы определить, нужно ли его время отскочить. Был задан более старый вопрос с несколькими ответами на расчет угла отскока .

2 голосов
/ 14 мая 2009

Если вам нужно подлинное чувство понга, то вычисление нового вектора намного проще, чем создание реальных отражений. Понг просто меняет знак dx или dy. Если мяч попадает в горизонтальный барьер, то отрицайте dy. Вертикальный, затем отрицание dx.

1 голос
/ 14 мая 2009

В вашем игровом цикле вычислите новую позицию мяча, как если бы не было никаких шаров.
Затем проверьте, не пересекается ли новая позиция с или не является ли она ПРОСТИЧЕСКИМ краем. Если какое-либо условие выполнено, рассчитайте новую позицию мяча, отразив его от абстикального элемента.

Подойдет метод, который вычисляет точку с учетом начальной точки, угла и расстояния:

Public Function TranslatePoint(ByVal tStartPoint As Point, _
ByVal tAngle as Decimal, ByVal tDistance As Decimal) As Point
0 голосов
/ 14 мая 2009

Отскок - это проблема из области физики, а не из области графики. Поэтому OpenGL не предлагает никакой реальной поддержки. Если вы посмотрите на оборудование, вы заметите, что существуют отдельные физические карты, похожие на видеокарты, хотя самые последние тенденции заключаются в их интеграции.

0 голосов
/ 14 мая 2009

Вас могут заинтересовать N Tutorials , в которых обсуждаются обнаружение столкновений и реакция на них (включая отскок и трение), используемые в игре "N".

Учебные пособия могут идти глубже, чем вам особенно нужно, но они хорошо написаны и содержат интерактивные примеры - и простой отскок - одна из первых тем.

0 голосов
/ 14 мая 2009

Вот что я бы сделал:

1) предположим, что стороны вашего понга находятся на линиях x = a и x = b

2) пусть позиция ваших шаров будет (x0, y0) и перемещаться по линии Ax + By = C

3) из этого вы можете легко вычислить (x1, y1) точку, где эта линия пересекается стена

4) вы можете получить уравнение линии после отскока, зная, что (x0, y1 + y0) - отражение после отскока. (Мяч у1-у0 ниже точка пересечения и, следовательно, будет y1 + y0 выше точки пересечения.)

5) учитывая 2 уравнения, вы можете построить свои точки (при условии, что вы знаете скорость).

...