Ландшафт и столкновение в игре - PullRequest
1 голос
/ 15 апреля 2011

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

Я относительно новичок в программировании игр, но я довольно хорош в программировании на Java, C, C ++ и т. Д., Поэтому я не думаю, что это должно быть проблемой (хотя первая итерация игры вДжава).Моя проблема в том, что я начинаю с нуля и не могу придумать, каким образом местность становится барьером, чтобы машины не падали прямо сквозь нее.И как я могу сделать так, чтобы они могли получить урон от падения?

В прошлом люди направляли меня к источнику Реплики, так как он уже есть в нем, и я вижу всю Систему столкновений, но пока у меня естьЯ не мог понять это, и я надеялся, что кто-нибудь захочет мне помочь.

Спасибо

-Roflha

Ответы [ 2 ]

5 голосов
/ 16 апреля 2011

Что вы используете для разработки игры?Движок или графическая библиотека?В основном есть три уровня (как мне нравится думать о них): графические библиотеки, графические движки и игровые движки.

  • Графические библиотеки довольно низки, как вы можете получить:OpenGL или DirectX.Когда вы захотите нарисовать свою местность, вы будете рисовать в виде сетки треугольников и определять вершины этих треугольников и т. Д.

  • Графические движки - это один слой поверх этого,Примерами таких (по крайней мере для C ++) являются Ogre3D, Horde3D и Irrlicht.Они позаботятся о множестве команд более низкого уровня и позволят вам сосредоточиться на графике с точки зрения более высокого уровня.

  • Движки игры в значительной степени позаботятся обо всем, что связано с графикой,Примерами таких (опять же C ++) являются Unity и UDK.Как правило, они могут сделать большую часть игрового программирования для вас.Вы, вероятно, нарисовали бы свою местность в программе моделирования (3dsmax и т. Д.), Экспортировали бы ее в какой-то формат, а затем движок выкачал ее и точно знал, как с ней справиться.

Iпоиграл со всеми тремя, и нашел графические библиотеки наиболее интересными.Тем не менее, они, вероятно, потребуют больше времени, чтобы сделать игру.Они также включают в себя гораздо больше математики (линейная алгебра).

Что касается обнаружения столкновений с местностью.Вы должны знать о треугольниках, составляющих эту местность.Если вы используете игровой движок, вы должны иметь возможность хранить сетку для вашей местности и сетку для вашего персонажа в каком-то «Узле сцены», и он будет автоматически обрабатывать обнаружение столкновений.Однако, если вы имеете дело со всем самим, есть много популярных алгоритмов для этого:

  • Bounding Box: даже если ваш персонаж имеет форму человека (или животное и т. Д.), Вы относитесь к немуотметьте их как коробку и отметьте, когда эта клетка пересекается с треугольниками меша, из которого состоит ваш ландшафт.
  • Ограничивающая сфера: рассматривайте своего персонажа как сферу, потому что сферы намного легче увидеть, если они столкнулись.Вы просто проверяете «радиус сферы» с «расстоянием от центра сферы до другой сетки».Затем, если эта сфера сталкивается, вы разбиваете ее на более мелкие сферы, которые более точно представляют вашего персонажа.Оттуда вы выполняете 3 или 4 итерации, или так точно, как вы хотели бы представлять своего персонажа.Помните, что все в играх должно быть быстрым, быстрым, быстрым, поэтому вы ограничиваете рекурсии.

Отличная статья об обнаружении столкновений ограничивающей сферы

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

Вы можете справиться с уроном от падения несколькими способами:

  1. Если персонаж не летит, вы можете использоватьпростой конечный автомат.Как только они выйдут в эфир, измените состояние на «В ВОЗДУХЕ», и пока игра выглядит, установите таймер и отслеживайте, как долго они находятся в воздухе.Если они слишком долго находятся в воздухе, то рассчитайте различное количество урона в зависимости от того, как долго они там находятся.
  2. Более точный способ - отслеживать скорость y персонажа.Это точно в реальной жизни.Если вы падаете медленно, не имеет смысла иметь урон от падения.Если вы падаете быстро, вам будет больно больше, чем быстрее вы идете.Так что придумайте какое-то уравнение, которое связывает падение_скорости с уроном.Затем, как только они упадут на землю, измените конечный автомат на «ON_GROUND» и проверьте скорость_падения (вероятно, y_velocity).
2 голосов
/ 11 августа 2011

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

Я использую его с Ogre, графическим движком с открытым исходным кодом (который пока что; -) ... делает переключение между OpenGL-DirectX и Linux-Microsoft относительно простым), котороетакже много под капотом.

Поскольку вы уже знаете, как писать код, я бы посоветовал вышеизложенное в качестве жизнеспособных, не альтернатив, а открытых источников;так что вы изобретаете только те части колеса, которые вам нужны.

...