2013-09-25 2 views
1

Кто-нибудь знает, как найти или рассчитать нормализованное столкновение в SpriteKit. Исходя из Box2D, существует многообразный метод, который обеспечивает нормальную информацию, но в среде SpriteKit SKPhysicsContact предоставляет только контактную точку.Столкновение Нормальное в iOS7 Физика SpriteKit

Я использую примитивные объекты, плоскость, сталкивающуюся с кругом, столкновением по кругу/прямоугольнику и столкновениями по кругу/пользовательской форме.

Не мог бы кто-нибудь указать мне на математику при вычислении нормальной поверхности с помощью контактной точки столкновения, которая была бы высоко оценена.

+0

Какие типы фигур сталкиваются? И являются ли они краевыми столкновениями? Они будут определять, как вы вычисляете нормальный столкновение, и облегчите ответ на свой вопрос. – Matt

+0

Я использую примитивные фигуры, круги и прямоугольники в основном, но у меня есть пара пользовательских фигур с угловыми краями/плоскостями (подумайте о пользовательских фигурах, таких как классический разбойник кирпича). Поэтому, используя обычный физический движок, я должен уметь вычислять направление отражения. – badboy11

ответ

2

Обновление: От iOS 8, SKPhysicsContact имеет свойство contactNormal. Тем не менее, приведенный ниже совет может по-прежнему применяться, поскольку нормальный контакт не всегда делает то, что вы, возможно, захотите.


Столкновение нормально рассчитывается Box2D may not be a good estimate of the contact normal. Это относится к алгоритмам обнаружения/разрешения столкновений многих двумерных физических движков, возможно, включая SpriteKit.

Если вы хотите, чтобы реализовать классическое весло Breakout стиля (где удар по мячу вблизи концов лопасти отклоняет его больше, чем поразить его ближе к середине), вот несколько идей:

  1. Используйте эллиптическое физическое тело для весла. (Даже если ваше искусство спрайта в основном прямоугольное, разница в геометрии может быть не заметна для игрока.) Или используйте конструкцию нескольких узлов, каждая со своим физическим телом, чтобы составить более сложную кривизну из кругов, прямоугольников и эллипсы.

  2. Внесите обработчик после столкновения (didEndContact: или didSimulatePhysics) и отрегулируйте скорость шара после столкновения. Вы можете преобразовать точку контакта в координаты узла (весла), найти горизонтальное смещение от центра весла и использовать его для масштабирования или поворота нового вектора скорости шара. (Обратите внимание, что если вы делаете нетривиальный вектор математику, как это, вы могли бы найти его удобным для преобразования ваших векторов vector_float2, так что вы можете использовать аппаратное ускорение векторные математические функции, предоставляемые библиотекой SIMD.)

+0

Спасибо @rickster. Я думал об использовании нескольких узлов. Моя версия Box2D в игре Brick Breaker имела несколько приборов, которые также легко разбить и изменить свою форму при включении питания. Мне нужна помощь в том, чтобы выяснить, как вычислять нормальную поверхность, используя только точку контакта и круг сталкивающихся объектов или пользовательскую форму. Я использовал координатное положение центра и контактную точку для вычисления нормального вектора, но он был очень глючным и не работал, как я думал. Если вы знаете какой-либо сайт, который я мог бы использовать для изучения MATH, пожалуйста, сообщите нам. – badboy11

0

SKPhysicsContact содержит contactNormal vector property

Смежные вопросы