2016-08-08 29 views
2

Ich versuche eine SCNBox zu drehen, die ich mit swipe gestures erstellt habe. Zum Beispiel, wenn ich nach rechts streiche, sollte die Box 90 Grad in den Y-axis und -90degs drehen, wenn ich nach links wische. Um dies zu erreichen, habe ich die SCNAction.rotateByX Methode des Knotens verwendet, um die Rotationsanimation durchzuführen. Jetzt ist das Problem, das ich habe, wenn man sich entweder entlang der X-axis oder Z-axis nach einer Umdrehung in Y-axis dreht und umgekehrt, dass sich die Positionen der Achsen ändern.So drehen Sie eine SCNBox

Was ich festgestellt habe, ist, dass jede Drehung auf einer der X, Y, Z Achsen die Richtung ändert, in die die anderen Achsen zeigen.

Beispiel: Standardposition

enter image description here

Dann nach einer Drehung im Z-axis:

enter image description here

Natürlich stellen diese ein Problem jetzt, denn wenn ich swipe left or right ich nicht mehr die Wunsch-Effekt, weil die X-axis und Y-axis jetzt Positionen vertauscht haben. Was ich gerne wissen möchte, warum passiert das? und gibt es trotzdem eine Rotationsanimation ohne die anderen Achsen zu beeinflussen?

Ich entschuldige mich für meinen Mangel an Verständnis zu diesem Thema, da dies mein erster Schritt bei 3D-Grafik ist.

Lösung:

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 
} 

ich nicht in irgendwelche Probleme läuft habe noch, aber es kann sicherer sein, einen Abschluss-Handler zu verwenden, um alle Änderungen zu X, um sicherzustellen, Y, Z-Achsen durchgeführt werden, bevor sie neu positioniert.

+0

Ist das, was Sie wollen: drehen Modell um die Y-Achse. Drehen Sie jetzt das Modell um die X-Achse, und das Modell verhält sich so, als wäre seine X-Achse nicht von der "Standardposition" entfernt worden. Wenn Sie sich also mit einem Swipe-Right um das Y drehen, wird das Modell, unabhängig davon, wo das Modell endet, durch ein Wischen nach oben um die X-Achse des Bildschirms anstelle der neu positionierten X-Achse des Modells gedreht. Ist es das wonach du suchst? – bpedit

+1

@bpedit, das ist genau das, was ich will, aber scheint nicht einen Weg zu finden, um die Standardpositionen aller Achsen zu erhalten. – RickyTheCoder

Antwort

3

Ich hatte das gleiche Problem, hier ist, was ich benutze das gewünschte Verhalten zu geben:

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

danke das hat es gelöst. Ich werde meinen Beitrag etwas später mit meinem Code mit SCNAction.rotateByX bearbeiten und Gesten für jeden wischen, der zufällig auf dasselbe Problem stößt. – RickyTheCoder