2017-07-21 9 views
1

問題:キューブをキューブ上のポイントに回転しようとしています。その点はランダムに作成され、画面の中央に表示されます。スウィフト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] 

も偏差第1の中心点を得ることを試みた(コメント)(initally [0,0、中心からの距離]) - 次いでcube.eulerAngles = deviationfunc renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)インチしかしキューブはランダムに回転します。

答えて

0

私は、3Dジオメトリを使った簡単な解決策を考え出しました。そこに他のエレガントなソリューションがあるかもしれません。その後

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 
     } 

    } 

を算出した角度を割り当て

は、2点間の角度のCompoNetをACOS ASIN &を取得するために、2つのユーティリティ関数を作った - ここに は、私がいることを達成する方法であります

vMove(垂直移動)とhMove(水平移動)を取得する方法 - 移動オブジェクトの表面が原点からの距離を検出することによって計算されるだけです。

私はこれと同じフルギブスレポを作りました。 See this and suggest some improvements

関連する問題