2016-12-22 4 views
2

Swift 3, SceneKit : 내 게임에서 화면 중앙에 SCNSphere 노드가 있습니다. 구가 중력에 의해 SCNBox 노드로 떨어지고 상자와 충돌하면 SCNVector3 (0,6,0)의 속도가 적용됩니다.속도를 유지하면서 X 축을 따라 SceneKit 노드 끌기? Swift 3

새 상자가 만들어 져서 내 카메라와 구쪽으로 앞으로 이동합니다 (z +). 구가 상승하고 정점을 찍은 다음 새 상자쪽으로 (중력에 의해) 아래로 내려 가고 새 상자와 충돌하면 SCNVector (0,6,0)의 속도가 적용됩니다. 이 프로세스는 계속 반복됩니다. 기본적으로 새로운 접근 상자에서 반복적으로 튀는 구체입니다.

그러나 하나의 상자 대신 3 개의 상자가 연속으로 나타납니다. 모든 상자는 구 노드 앞에서 시작하여 만들어 질 때 상자쪽으로 이동합니다. 상자는 구의 왼쪽에 하나, 구의 바로 앞에 하나 (중간), 세 번째에 구의 권리.

왼쪽 및 오른쪽 상자에 착륙 할 수 있도록 내 손가락을 화면 위로 드래그하고 내 구를 움직일 수 있기를 원합니다. 드래그하는 동안 y- 속도 또는 y 위치가 전혀 변경되지 않기를 바랍니다.. 난 단지 내 구형 노드의 x 위치가 스크린과 관련된 손가락의 실제 x 위치를 반영하기를 원합니다. 또한 구체 노드가 터치만으로 위치를 변경하는 것을 원하지 않습니다..

예를 들어, 구의 위치가 SCNVector3 (2,0,0)이고 사용자가 SCNVector3 (-2,0,0) 근처를 두드리는 경우 구를 "텔레포트"하지 않고 사용자가 탭했다. 사용자가 마지막 위치에서 구를 드래그하도록합니다.

func handlePan(recognizer: UIPanGestureRecognizer) { 

    let sceneView = self.view as! SCNView 
    sceneView.delegate = self 
    sceneView.scene = scene 


    let trans:SCNVector3 = sceneView.unprojectPoint(SCNVector3Zero) 
    let pos:SCNVector3 = player.presentation.position 
    let newPos = (trans.x) + (pos.x) 
    player.position.x = newPos 
} 

답변

3

난 그냥 화면에 내 손가락 상대의 실제 X-위치를 반영하기 위해 내 구 노드의 x 위치를 원하는

당신은 UIPanGestureRecognizer를 사용하여이 작업을 수행 할 수

및 뷰의 좌표계에 translation이 표시됩니다.

let myPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) 
let trans2D:CGPoint = myPanGestureRecognizer.translation(in:self.view) 
let transPoint3D:SCNVector3 = SCNVector3Make(trans2D.x, trans2D.y, <<z>>) 

Z 값의 경우, z는 당신이 당신의 절두체의 근거리 및 원거리 클리핑 평면에 취소 프로젝트 상대에 할에 깊이를 참조해야한다고 말한다 unProjectPoint 토론, 참조하십시오.

그런 다음 장면의 3D 세계 좌표계로 번역을 취소하여 구체 노드에 대한 번역을 제공 할 수 있습니다. 일부 부분 샘플 코드 :

let trans:SCNVector3 = sceneView.unProjectPoint(transPoint3D) 
let pos:SCNVector3 = sphereNode.presentationNode.position 
let newPos:SCNVector3 = // trans + pos 
sphereNode.position = newPosition 
+0

질문의 맨 아래에 내 코드를 추가했습니다. handlePan 함수가 호출되지 않고 함수 내부의 코드가 제대로 작동하지 않을지 잘 모르겠습니다. 무엇을 바꾸어야합니까? –

+0

제스처 인식기를 추가하고 2D 화면 좌표에서 장면의 3D 세계 좌표계로 이동하는 코드가 업데이트되었습니다. –

관련 문제