【问题标题】:How to rotate object in a scene with pan gesture - SceneKit如何使用平移手势旋转场景中的对象 - SceneKit
【发布时间】:2016-05-13 16:54:29
【问题描述】:

我想用 Scene 工具包创建一个应用程序来解决 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) {
        //
    }
}

以上代码不保留之前的平移手势。如何使用“旋转向量”或

SCNMatrix4MakeRotation(anglePan, -y, x, 0)

旋转立方体

【问题讨论】:

    标签: swift rotation scenekit


    【解决方案1】:

    问题解决了

    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) 时才有效。
    • 在应用程序的整个生命周期中,对象将位于 0,0,0。这解决了我的需求,暂时就够用了。
    【解决方案2】:

    如果您的对象原始位置不是 (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 属性设置为单位矩阵,它将节点重置为枢轴值。我们看不到任何变化,因为此时枢轴已经与我们的节点具有相同的值。 但是为什么我们使用反转值,通常您使用它来将某些东西旋转回其原点。谁能告诉我,我哪里想错了?

    【讨论】:

    • 问题已经得到解答,您的回答没有任何新意。
    • 只有当原始对象的位置在 (0,0,0) 时,答案才有效。我的回答只是一个补充,即使原始位置是例如(0,0,-1),它也可以工作。我试图评论,但没有足够的积分...
    • 对象在使用此逻辑时会进行一点转换。旋转工作正常,但翻译是一个问题。可能是因为我的初始变换本身不是单位矩阵。翻译第一次发生手势结束并且不再发生。有什么想法吗?
    • @Manganese 我希望输入是手指轻扫,也是瞬时/短扫。所以我打算在手势结束并停止时旋转,以便用户可以选择旋转另一侧或同一侧
    猜你喜欢
    • 2017-11-30
    • 2018-03-15
    • 2018-07-17
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多