2016-08-08 11 views
2

swipe gesturesを使用して作成したSCNBoxを回転しようとしています。たとえば、右にスワイプすると、ボックスは左にスワイプするとY-axisと-90degsの90度回転します。これを達成するために、ノードのSCNAction.rotateByXメソッドを使用して回転アニメーションを実行しています。今私が持っている問題は、Y-axisの回転の後に​​またはZ-axisのいずれかに沿って回転するとき、そしてその逆が軸の位置が変わるということです。SCNBoxを回転させる方法

私が気づいているのは、X軸、Y軸、Z軸のいずれかで回転を実行すると、他の軸が指す方向が変わるということです。

例:デフォルトの位置Z-axisで回転させた後次に

enter image description here

もちろん

enter image description here

私はswipe left or right私はもはや取得しない場合は、この今ため、問題を提起します​​とY-axisが現在位置を入れ替えたためです。私が知りたいのは、なぜこれが起こるのかということです。とにかく他の軸に影響を与えずに回転アニメーションを実行することができますか?

これは私の最初の3Dグラフィックスであるため、この件に関する私の理解の欠如についてお詫び申し上げます。

ソリューション:私はまだ何の問題に遭遇していないが、Xに変更を確実にするために、完了ハンドラを使用する方が安全かもしれ

func swipeRight(recognizer: UITapGestureRecognizer) { 
    // rotation animation 
    let action = SCNAction.rotateByX(0, y: CGFloat(GLKMathDegreesToRadians(90)), z: 0, duration: 0.5) 
    boxNode.runAction(action) 

    //repositoning of the x,y,z axes after the rotation has been applied 
    let currentPivot = boxNode.pivot 
    let changePivot = SCNMatrix4Invert(boxNode.transform) 
    boxNode.pivot = SCNMatrix4Mult(changePivot, currentPivot) 
    boxNode.transform = SCNMatrix4Identity 
} 

、Yは、Z軸は、それらを再配置する前に行われます。私は同じ問題を持っていた

+0

は、あなたが望むものを、このです:Y軸を中心に回転するモデル。さて、X軸についてモデルを回転させると、モデルは、X軸が「デフォルト位置」から移動していないかのように動作します。したがって、スワイプ右でYを中心に回転すると、モデルがどこにあっても上向きスワイプは、モデルのX軸の位置を変更したのではなく、画面のX軸を中心にモデルを上向きに回転させます。これはあなたの後のことですか? – bpedit

+1

@bpedit、それはまさに私が望むものですが、すべての軸のデフォルトの位置を保持する方法を見つけることができません。 – RickyTheCoder

答えて

3

は、ここで私は必要な動作を与えるために使用するものです:

func panGesture(sender: UIPanGestureRecognizer) { 
    let translation = sender.translationInView(sender.view!) 

    let pan_x = Float(translation.x) 
    let pan_y = Float(-translation.y) 
    let anglePan = sqrt(pow(pan_x,2)+pow(pan_y,2))*(Float)(M_PI)/180.0 
    var rotVector = SCNVector4() 

    rotVector.x = -pan_y 
    rotVector.y = pan_x 
    rotVector.z = 0 
    rotVector.w = anglePan 

    // apply to your model container node 
    boxNode.rotation = rotVector 

    if(sender.state == UIGestureRecognizerState.Ended) { 
     let currentPivot = boxNode.pivot 
     let changePivot = SCNMatrix4Invert(boxNode.transform) 
     boxNode.pivot = SCNMatrix4Mult(changePivot, currentPivot) 
     boxNode.transform = SCNMatrix4Identity 
    } 
} 
+0

これで解決しました。 SCNAction.rotateByXを使って自分のポストを少し後で編集し、この同じ問題が発生したときに誰かのためにスワイプジェスチャーを行います。 – RickyTheCoder

関連する問題