2014-12-16 4 views
3

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

пример:

// Roll right 90 - 
SCNNode.pivot = SCNMatrix4MakeRotation(Float(M_PI_2), 0, 1, 0) 

// Roll right 180 - 
SCNNode.pivot = SCNMatrix4MakeRotation(Float(M_PI_2) * 2, 0, 1, 0) 

// Roll up  90 - 
SCNNode.pivot = SCNMatrix4MakeRotation(Float(M_PI_2), 1, 0, 0) 

// Roll up & right 90 - 
SCNNode.pivot = SCNMatrix4MakeRotation(Float(M_PI_2), 1, 1, 0) 

Все это будет работать, но если мне нужно катить мяч прямо 180 и до 90 я застрял.

Даже если бы был способ добавления векторов вместе, которые бы сделали меня.

Любая помощь очень ценится.

ответ

5

Чтобы комбинировать эффекты rotation matrices, используйте умножение матрицы.

Чтобы сделать это в SceneKit, вы можете:

  • Создать отдельные матрицы поворота и умножить их вместе с помощью SCNMatrix4Mult.
  • Примените поворот непосредственно к существующей матрице с помощью SCNMatrix4Rotate. (Это эквивалентно выбору SCNMatrix4MakeRotation + SCNMatrix4Mult;. Он просто сочетает в себе эти шаги в вызов одной функции)

Если порядок преобразований важно для вашего приложения, помните, что matrix multiplication order is the reverse of transformation order.

+0

Это работает для меня! –

+0

Одна вещь, которую я действительно нашел, стоит отметить, и это может быть хорошо известно всем остальным, но сначала я не понял. Перед его вращением ось узла соответствует доступу родительского узла. После того, как узел повернут, второе вращение выполняется относительно его новой оси, а не оси оригинала/родительского узла. Кажется логичным, теперь я знаю, но все же приспосабливаюсь к трехмерному мышлению. Спасибо за помощь Рикстер. –

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