2017-06-17 38 views
0

我有以下代碼創建一個SCNBox並在屏幕上拍攝它。這種方式很有效,但只要我將手機轉向任何其他方向,那麼力量衝動就不會更新,並且始終以相同的舊位置拍攝。ARKit - 在用戶的手機方向應用力

下面是代碼:

@objc func tapped(recognizer :UIGestureRecognizer) { 

     guard let currentFrame = self.sceneView.session.currentFrame else { 
      return 
     } 

     /
     let box = SCNBox(width: 0.2, height: 0.2, length: 0.2, chamferRadius: 0) 

     let material = SCNMaterial() 
     material.diffuse.contents = UIColor.red 
     material.lightingModel = .constant 

     var translation = matrix_identity_float4x4 
     translation.columns.3.z = -0.01 

     let node = SCNNode() 
     node.geometry = box 
     node.geometry?.materials = [material] 

     print(currentFrame.camera.transform) 

     node.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil) 

     node.simdTransform = matrix_multiply(currentFrame.camera.transform, translation) 
     node.physicsBody?.applyForce(SCNVector3(0,2,-10), asImpulse: true) 

     self.sceneView.scene.rootNode.addChildNode(node) 


    } 

第26行是我申請的力量,但它並沒有考慮到用戶的當前電話的方向。我該如何解決這個問題?

回答

2

在第26行,你傳遞一個常量向量到applyForce。該方法在世界空間中使用一個矢量,因此傳遞一個常量矢量意味着您總是在相同的方向上施加一個力 - 如果您想要一個基於相機或其他方向指向的方向,您需要根據該方向計算矢量。

(新)SCNNode屬性worldFront在這裏可能會有所幫助 - 它給你一個節點指向的方向,自動轉換到世界空間,所以它對物理方法很有用。 (雖然你可能想要縮放它。)

+0

非常感謝!工作就像一個魅力:)有一個美好的一天! –