2017-07-21 130 views
1

問題:試圖將立方體旋轉到立方體自身上的一個點。該點是隨機創建的,它應該出現在屏幕的中心。Swift SCNNode 3D立方體旋轉到立方體上的一個點

試着用lookAtConstraint和func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)賦值的隨機點。但沒有工作(評論)

cube = SCNNode(geometry: sphereGeometry) 
     cube.position = SCNVector3Make(0.0, 0.0, 0.0) 
     gamescn.rootNode.addChildNode(cube) 

     cameraNode = SCNNode() 
     cameraNode.camera = SCNCamera() 
     cameraNode.position = SCNVector3(x: 0, y: 0, z: 40) 
     gamescn.rootNode.addChildNode(cameraNode) 

     lookAtConstraint 

//  lookAtConstraint = SCNLookAtConstraint(target: cube) 
//  lookAtConstraint.isGimbalLockEnabled = true 
//  cameraNode.constraints = [lookAtConstraint] 

還嘗試了偏差第一中心點(initally [0,0,從中心的距離) - 然後cube.eulerAngles = deviationfunc renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)。但立方體隨機旋轉。

回答

0

我想出了一個3D幾何的簡單解決方案。那裏可能還有其他優雅的解決方案。 這裏是我實現了 -

了兩個效用函數來得到ASIN & ACOS角度及部件兩點之間 -

func angleBetweenVectorsCos(_ vectorB:SCNVector3) -> SCNFloat { 
     let cosineAngle = (dot(vector: vectorB)/(magnitude * vectorB.magnitude)) 
     return SCNFloat(acos(cosineAngle)) 
} 

func angleBetweenVectorsSin(_ vectorB:SCNVector3) -> SCNFloat { 
     let cosineAngle = angleBetweenVectorsCos(vectorB) 
     let sinangle = sqrt(1-cosineAngle*cosineAngle) 
     return SCNFloat(acos(sinangle)) 
} 

然後 - 在func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)功能我分配計算

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { 
     if time > rotationTimer{ 


      let angleCos = lastposition.angleBetweenVectorsCos(movingTarget.position) 
      let angleSin = lastposition.angleBetweenVectorsSin(movingTarget.position) 
      SCNTransaction.begin() 
      SCNTransaction.animationDuration = 0.5 
      xDegree += angleSin 
      yDegree += angleCos 
      zDegree += 0 

      if vMove { 
       cube.eulerAngles.x = xDegree 
      } 
      if hMove { 
       cube.eulerAngles.y = -yDegree 
      } 


      SCNTransaction.commit() 
      lastposition = movingTarget.position 
      .......  
      rotationTimer = time + 0.2 
     } 

    } 
角度

如何獲得vMove(垂直運動)和hMove(水平運動) - 只是通過檢測距離原點的距離來計算移動物體在哪個表面上。

我爲此做了一個完整的github回購。 See this and suggest some improvements