2013-04-03 3 views
3

SCNNode принимает поворот с использованием SCNVector4, который имеет угол (w) и величину, как этот угол применяется к каждой оси (x, y, z). Например, для поворота на 45 градусов вокруг оси х, я бы создать SCNVector4 вроде этого:Как вычислить многоосевое вращение SCNVector4 для SCNNode?

SCNVector4Make(1.0f, 0, 0, DEG2RAD(45)) 

То, что я хотел бы сделать, это повернуть его по всем трем осям, например: 45 градусов по ось x, 15 градусов по оси y и -135, проходя по оси z. Кто-нибудь знает математику, чтобы рассчитать окончательный SCNVector4?

ответ

2

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

http://www.cprogramming.com/tutorial/3d/rotationMatrices.html имеет неплохую запись математики. Любая ссылка OpenGL, которая касается матриц вращения, тоже стоит посмотреть.

2

Если вы не анимировать вращение, это может быть чище, чтобы просто установить матрицу преобразования непосредственно, как:

node.transform = CATransform3DRotate(CATransform3DRotate(CATransform3DRotate(node.transform, xAngle, 1, 0, 0), yAngle, 0, 1, 0), zAngle, 0, 0, 1); 
+0

Бесполезно! Присвоение структуры одного типа другой структуре другого типа неверно, даже если оно работает. Что, если они изменят одну из этих структур? –

+0

В заголовках «public typealias SCNMatrix4 = CATransform3D» .Если они меняют структуру SCNMatrix4, все существующие двоичные файлы будут разбиты. Они не могут и не будут этого делать. –

7

rotation Вместо свойства используйте eulerAngles и указать угол для каждой оси

+0

Почему 'eulerAngles', а не' rotation'? – Crashalot

+0

@Crashalot Из https://developer.apple.com/library/mac/documentation/SceneKit/Reference/SCNNode_Class: 'rotation' = ориентация, выраженная как угол поворота вокруг оси,' eulerAngles' = ориентация, выраженная как шаг, рыскание, и углы поворота, каждый в радианах –

2

Вы запрашиваете матрицу вращения или как просто поворачивать в целом? Если второе верно, то, например:

[node runAction:[SCNAction rotateByX:0 y:M_PI z:0 duration:0]];