I'm tying to create an app with Scene kit to solve Rubix Cube. I've my own dae file for the cube. this is my setup code in viewDidLoad
let myscene = SCNScene(named: "Rubik1.scnassets/Rubiks_Cube.dae")
scene.rootNode.addChildNode((myscene?.rootNode)!)
// retrieve the SCNView
let scnView = self.view as! SCNView
// set the scene to the view
scnView.scene = scene
geometryNode = (scnView.scene?.rootNode.childNodeWithName("Cube",recursively: true))!
let panRecognizer = UIPanGestureRecognizer(target: self, action: "panGesture:")
scnView.addGestureRecognizer(panRecognizer)
upon recognising a pan gesture to rotate the cube
func panGesture(gestureRecognize: UIPanGestureRecognizer){
let translation = gestureRecognize.translationInView(gestureRecognize.view!)
let x = Float(translation.x)
let y = Float(-translation.y)
let anglePan = sqrt(pow(x,2)+pow(y,2))*(Float)(M_PI)/180.0
var rotationVector = SCNVector4()
rotationVector.x = -y
rotationVector.y = x
rotationVector.z = 0
rotationVector.w = anglePan
geometryNode.rotation = rotationVector
//geometryNode.transform = SCNMatrix4MakeRotation(anglePan, -y, x, 0)
if(gestureRecognize.state == UIGestureRecognizerState.Ended) {
//
}
}
above code doesn't preserve the previous pan gestures. how do I use "rotationvector" or
SCNMatrix4MakeRotation(anglePan, -y, x, 0)
to rotate the cube
The problem is solved
if(gestureRecognize.state == UIGestureRecognizerState.Ended) {
let currentPivot = geometryNode.pivot
let changePivot = SCNMatrix4Invert( geometryNode.transform)
geometryNode.pivot = SCNMatrix4Mult(changePivot, currentPivot)
geometryNode.transform = SCNMatrix4Identity
}
This solution works if your object original position isn't (0,0,0).
if(gestureRecognize.state == UIGestureRecognizerState.Ended) {
let currentPivot = geometryNode.pivot
let currentPosition = geometryNode.position
let changePivot = SCNMatrix4Invert(SCNMatrix4MakeRotation(geometryNode.rotation.w, geometryNode.rotation.x, geometryNode.rotation.y, geometryNode.rotation.z))
geometryNode.pivot = SCNMatrix4Mult(changePivot, currentPivot)
geometryNode.transform = SCNMatrix4Identity
geometryNode.position = currentPosition
}
But I don't understand why we assign the invert value of transform or rotation to changePivot. Is it correct, we are trying to rotate the pivot to our current rotation values and with setting the .transform property to the identity matrix it resets the node to the pivot value. We don't see any change, because the pivot already has the same values as our node right then. But why we use the invert values, normally you use this to rotate something back to its origin. Can somebody tell me, where i'm thinking wrong?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With