如何使用平移手势在场景中旋转对象 - SceneKit
How to rotate object in a scene with pan gesture - SceneKit
我打算用 Scene kit 创建一个应用程序来解决 Rubix Cube。我有自己的多维数据集 dae 文件。
这是我在 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)
识别出旋转立方体的平移手势后
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) {
//
}
}
以上代码不保留之前的平移手势。我如何使用 "rotationvector" 或
SCNMatrix4MakeRotation(anglePan, -y, x, 0)
旋转立方体
问题已解决
if(gestureRecognize.state == UIGestureRecognizerState.Ended) {
let currentPivot = geometryNode.pivot
let changePivot = SCNMatrix4Invert( geometryNode.transform)
geometryNode.pivot = SCNMatrix4Mult(changePivot, currentPivot)
geometryNode.transform = SCNMatrix4Identity
}
如果您的对象原始位置不是 (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
}
但我不明白为什么要将变换或旋转的反转值赋给changePivot。是否正确,我们正在尝试将枢轴旋转到我们当前的旋转值,并将 .transform 属性 设置为单位矩阵,它将节点重置为枢轴值。我们没有看到任何变化,因为此时枢轴已经与我们的节点具有相同的值。
但是为什么我们使用反转值,通常你用它来旋转一些东西回到它的原点。谁能告诉我,我哪里想错了?
我打算用 Scene kit 创建一个应用程序来解决 Rubix Cube。我有自己的多维数据集 dae 文件。 这是我在 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)
识别出旋转立方体的平移手势后
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) {
//
}
}
以上代码不保留之前的平移手势。我如何使用 "rotationvector" 或
SCNMatrix4MakeRotation(anglePan, -y, x, 0)
旋转立方体
问题已解决
if(gestureRecognize.state == UIGestureRecognizerState.Ended) {
let currentPivot = geometryNode.pivot
let changePivot = SCNMatrix4Invert( geometryNode.transform)
geometryNode.pivot = SCNMatrix4Mult(changePivot, currentPivot)
geometryNode.transform = SCNMatrix4Identity
}
如果您的对象原始位置不是 (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
}
但我不明白为什么要将变换或旋转的反转值赋给changePivot。是否正确,我们正在尝试将枢轴旋转到我们当前的旋转值,并将 .transform 属性 设置为单位矩阵,它将节点重置为枢轴值。我们没有看到任何变化,因为此时枢轴已经与我们的节点具有相同的值。 但是为什么我们使用反转值,通常你用它来旋转一些东西回到它的原点。谁能告诉我,我哪里想错了?