2017-10-11 22 views
0

나는 팬 제스처로 90deg 단위로 계속 회전하는 SCNNode를 가지고 있습니다. 처음 몇 번의 회전은 노드 축이 잘못된 방향으로 회전하고 회전이 잘못된 방향으로 실행되는 시나리오에서 의도 한대로 작동합니다. 각 회전 후에 축의 방향을 어떻게 결정합니까?Scenekit - SCNNode의 다중 회전 및 축 방향

시나리오 (편의상 큐브 사용)

  • i는 Y 축을 따라 큐브 90DEG 회전. Y 포인트는 여전히, X는 이제 카메라를 가리키는 오른쪽 Z 포인트는 큐브 이제 Y를 X를 따라 다시 90DEG가 왼쪽 된 점
  • 내가 회전, 카메라 Z
  • 문제
  • - 난 지금 X 축을 따라 90DEG를 회전하려고 . X가 180도 회전했기 때문에 이제 회전이 반전됩니다.

회전시기 (-1,0,0) 및 (1,0,0)을 어떻게 알 수 있습니까?

나는 3D 수학의 세계에 새로운 경험을 가지고 있습니다. 제 문제를 올바르게 설명했으면 좋겠습니다.

답변

0

추가 연구 후에 나는 완전히 잘못된 접근 방식을 선택한다는 것을 깨달았습니다. 내가 원하는 것을 얻는 방법은 rootNode의 축을 사용하여 노드를 회전시키는 것입니다.이 방법은 노드의 로컬 축에 대해 걱정할 필요가 없습니다.

편집 : 다른 노드를 사용 Xartec의 제안

let rotation = SCNMatrix4MakeRotation(angle, x, y, Float(0)) 
let newTransform = SCNMatrix4Mult(bricksNode.transform, rotation) 
let animation = CABasicAnimation(keyPath: "transform") 
animation.fromValue = bricksNode.transform 
animation.toValue = scnScene.rootNode.convertTransform(newTransform,from: nil) 
animation.duration = 0.5 
bricksNode.addAnimation(animation, forKey: nil) 
+1

에 따라 업데이트 된 코드는 기본적으로 월드 스페이스 당신이 원하는 것을 달성하기위한 가장 간단한 방법은 아닙니다 나타냅니다. 더미 노드 대신 장면이있는 경우 rootNode를 사용할 수 있습니다. 그리고 worldTransform 대신에 .transform을 사용하여 역순으로 행렬을 곱할 수 있습니다. – Xartec

+0

귀중한 입력 Xartec 주셔서 감사합니다, 나는 답변을 업데이 트합니다! –

+0

회전 노드의 위치가 (0, 0, 0)이 아닌 경우에도 동일한 질문을 할 수 있습니까? –