私はSceneKitを使用しており、ユーザーはパンジェスチャーを使用して球の中で見ているものを回転させることができます。これはうまく働いていますが、私は球体をパンのジェスチャーの方向に少し回転させて、少し反応が速くなるようにしたいと思います。SceneKit - パンジェスチャーを介して回転した球にドリフトを追加する
ここでのシーンのために私の設定です:
// Create scene
let scene = SCNScene()
sceneView.scene = scene
let panRecognizer = UIPanGestureRecognizer(target: self,
action: #selector(ViewController.handlePanGesture(_:)))
sceneView.addGestureRecognizer(panRecognizer)
//Create sphere
let sphere = SCNSphere(radius: 50.0)
// sphere setup
sphereNode = SCNNode(geometry: sphere)
sphereNode!.position = SCNVector3Make(0,0,0)
scene.rootNode.addChildNode(sphereNode!)
// Create camera
let camera = SCNCamera()
// camera setup
cameraNode = SCNNode()
cameraNode!.camera = camera
cameraNode!.position = SCNVector3Make(0, 0, 0)
cameraOrbit = SCNNode()
cameraOrbit!.addChildNode(cameraNode!)
scene.rootNode.addChildNode(cameraOrbit!)
let lookAtConstraint = SCNLookAtConstraint(target: sphereNode!)
lookAtConstraint.gimbalLockEnabled = true
cameraNode!.constraints = [lookAtConstraint]
sceneView.pointOfView = cameraNode
そして、ここでは、(SCNCamera limit arcball rotationの礼儀)パンジェスチャーが現在の処理方法である。
let translation = sender.translationInView(sender.view!)
let widthRatio = Float(translation.x)/Float(sender.view!.frame.size.width) + lastWidthRatio
let heightRatio = Float(translation.y)/Float(sender.view!.frame.size.height) + lastHeightRatio
self.cameraOrbit?.eulerAngles.y = Float(-2 * M_PI) * widthRatio
self.cameraOrbit?.eulerAngles.x = Float(-M_PI) * heightRatio
if (sender.state == .Ended) {
lastWidthRatio = widthRatio
lastHeightRatio = heightRatio
}
私が開始する場所がわからないんだけど僅かながら回転運動を継続する。たぶん、physicsBody
を追加し、力をかけることがありますか? eulerAngles
の変化をアニメーション化していますか?
私も同様のことをしました - ありがとう!私の問題は、球の最後の休止位置がその値が最後に設定された時間よりもさらに回転しているので、 'lastRatio'値がオフになっていることです。したがって、ユーザが次のパンジェスチャを行うために行くと、ドリフトが開始される前の位置にカメラが「ジャンプ」し、「ユーラーアングル」がリセットされる。もしあなたがそれについて考えているなら、私はすべて耳です。 –
ええ、アクションが完了したときにlastRatioの値を再び更新する 'runAction'に補完ハンドラを追加してみてください。 –
@AndyHeard私はそれを試みましたが、それは動作していないと私は本当に理由を理解していません。私のコードスニペット '' 'lastWidthRatio + =(((-velocity.x * 0.001)* 2)/ sender.view.frame.size.width);' '' –