Я хочу иметь игрового персонажа, который может «ходить» по органической поверхности под любым углом, в том числе вбок и вверх ногами. Благодаря «органическим» уровням со скошенными и изогнутыми элементами вместо прямых линий под углом 90 градусов.
В настоящее время я работаю в AS3 (умеренный любительский опыт) и использую Nape (в значительной степени новичок) для базовой физики, основанной на гравитации, к которой эта механика ходьбы будет очевидным исключением.
Есть ли процедурный способ сделать этот вид механики ходьбы, возможно, используя ограничения Nape? Или было бы лучше создать явные "дорожки" для ходьбы, следуя контурам поверхностей уровня, и использовать их для ограничения движения при ходьбе?
Ответы:
Вот мой полный опыт обучения, в результате чего я получил довольно функциональную версию движения, которое я хотел, используя все внутренние методы Nape. Весь этот код находится в моем классе Spider, извлекая некоторые свойства из его родителя, класса Level.
Большинство других классов и методов являются частью пакета Nape. Вот соответствующая часть моего списка импорта:
Во-первых, когда на сцену добавляется паук, я добавляю слушателей в мир затылка для столкновений. По мере продвижения в развитии мне нужно будет различать группы столкновений; на данный момент эти обратные вызовы будут технически выполняться, когда ЛЮБОЕ тело сталкивается с любым другим телом.
Обратные вызовы изменяют свойство «состояния» паука, которое является набором логических значений, и записывают любые арбитры столкновения Nape для последующего использования в моей логике ходьбы. Они также устанавливают и сбрасывают toTimer, который позволяет пауку потерять контакт с поверхностью уровня на срок до 100 мс, прежде чем снова станет действовать мировая гравитация.
Наконец, я вычисляю, какие силы применить к пауку, основываясь на его состоянии и его связи с геометрией уровня. Я в основном позволю комментариям говорить за себя.
По-настоящему липкая часть, которую я обнаружил, заключалась в том, что угол движения должен был соответствовать реальному желаемому направлению движения в сценарии с несколькими точками контакта, когда паук достигает острого угла или сидит в глубокой долине. Тем более что, учитывая мои суммарные векторы силы адгезии, эта сила будет ТЯЖЕТЬ в направлении, в котором мы хотим двигаться, а не перпендикулярно ей, поэтому нам нужно противодействовать этому. Поэтому мне была нужна логика, чтобы выбрать одну из точек контакта, чтобы использовать ее в качестве основы для угла вектора движения.
Побочным эффектом «тяги» силы сцепления является небольшое колебание, когда паук достигает острого вогнутого угла / кривой, но это на самом деле довольно реалистично с точки зрения внешнего вида, поэтому, если это не вызовет проблем в будущем, я буду оставь как есть. Если мне нужно, я могу использовать вариацию этого метода для расчета силы сцепления.
Эта логика в значительной степени «идеальна», поскольку до сих пор кажется, что она делает то, что я хочу. Тем не менее, существует давняя косметическая проблема, заключающаяся в том, что, если я попытаюсь выровнять изображение паука с силами сцепления или движения, я обнаружу, что паук в конечном итоге «наклоняется» в направлении движения, что было бы хорошо, если бы он был Двуногий спортивный спринтер, но он не так, и углы очень чувствительны к изменениям на местности, поэтому паук дрожит, когда он пересекает малейший выступ. Я могу использовать вариант решения Byte56, отобрав ближайший ландшафт и усреднив эти углы, чтобы сделать ориентацию паука более плавной и реалистичной.
источник
Как насчет того, чтобы заставить любую "палку" поверхности, к которой прикоснулся персонаж, применить силу вдоль обратной нормали к поверхности? Сила сохраняется до тех пор, пока они находятся в контакте с поверхностью, и перекрывает гравитацию, пока она активна. Таким образом, прыжки с потолка будут иметь ожидаемый эффект от падения на пол.
Возможно, вы захотите реализовать некоторые другие функции, чтобы сделать это гладко и проще в реализации. Например, вместо того, что касается персонажа, используйте круг вокруг персонажа и суммируйте перевернутые нормали. Как показывает эта дрянная краска:
(Представленное изображение паука является собственностью Byte56)
Синие линии - это обратные нормали к поверхности в этой точке. Зеленая линия - это суммарная сила, приложенная к пауку. Красный круг представляет диапазон, который паук ищет для нормалей.
Это позволило бы получить некоторую неровность на местности без того, чтобы паук «потерял свою хватку». Поэкспериментируйте с размером и формой круга, возможно, просто используйте полукруг, ориентированный пауком вниз, может быть, просто прямоугольник, который охватывает ноги.
Это решение позволяет вам держать физику включенной без необходимости иметь дело с конкретными путями, по которым персонаж может следовать. Он также использует информацию, которую довольно легко получить и интерпретировать (нормали). Наконец, это динамично. Легко объяснить даже изменение формы мира, поскольку вы можете легко получить нормали для любой геометрии, которую вы рисуете.
Помните, что когда лица не находятся в пределах досягаемости паука, возникает нормальная гравитация.
источник