【问题标题】:Rotate SCNNode then move relative to rotation?旋转 SCNNode 然后相对于旋转移动?
【发布时间】:2018-03-20 16:11:09
【问题描述】:

我的节点设置:

let node = SCNNode()
node.position = SCNVector3(0.0, 0.0, 0.0)

然后我希望将节点向左旋转 90 度,这可以通过以下方式实现:

node.transform = SCNMatrix4Rotate(node.transform, .pi/2, 0.0, 1.0, 0.0)

接下来,我想将节点相对于当前旋转沿负 z 轴向前平移一个单位,最终得到:

node.position = SCNVector3(-1.0, 0.0, 0.0)

我不知道如何以编程方式从节点的旋转到节点的位置。

基本上node从(0, 0, 0)开始,它的前向向量是-z轴,node左转向前移动一个单位到(-1, 0, 0)结束。

这不起作用:

func move(_ direction: moveDirection) {
    switch direction {
    case .forward: characterNode.position = SCNVector3(characterNode.position.x, characterNode.position.y, characterNode.position.z - 1.0)
    case .left: characterNode.pivot = SCNMatrix4Rotate(characterNode.pivot, -.pi/32, 0.0, 1.0, 0.0)
    case .backward: characterNode.position = SCNVector3(characterNode.position.x, characterNode.position.y, characterNode.position.z + 1.0)
    case .right: characterNode.pivot = SCNMatrix4Rotate(characterNode.pivot, .pi/32, 0.0, 1.0, 0.0)
    }
}

【问题讨论】:

    标签: swift swift4 scenekit scnnode


    【解决方案1】:

    假设我对你的理解正确,一旦你旋转了你的SCNNode,你想把它往那个方向移动。

    这可以通过使用worldFront 值来完成,这很简单:

    世界空间中的局部单位-Z轴(0,0,-1)。

    因此,这可能是您正在寻找的答案:

        //1. Create A Node Holder
        let nodeToAdd = SCNNode()
    
        //2. Create An SCNBox Geometry
        let nodeGeometry = SCNBox(width: 0.2, height: 0.2, length: 0.2, chamferRadius: 0)
        nodeGeometry.firstMaterial?.diffuse.contents = UIColor.cyan
        nodeGeometry.firstMaterial?.lightingModel = .constant
        nodeToAdd.geometry = nodeGeometry
    
        //3. Position It 1.5m Away From The Camera
        nodeToAdd.position = SCNVector3(0, 0, -1.5)
    
        //4. Rotate The Node By 90 Degrees On It's Y Axis
        nodeToAdd.rotation = SCNVector4Make(0, 1, 0, .pi / 2)
    
        //5. Add The Node To The ARSCNView
        augmentedRealityView.scene.rootNode.addChildNode(nodeToAdd)
    
        //6. Use The World Front To Move The Node Forward e.g 
    
        /*
        nodeToAdd.simdPosition += nodeToAdd.simdWorldFront * 1.2
        */
    
        nodeToAdd.simdPosition += nodeToAdd.simdWorldFront
    
        //7. Print The Position
        print(nodeToAdd.position)
    
         /*
        SCNVector3(x: -0.999999881, y: 0.0, z: -1.50000024)
        */
    

    【讨论】:

    • 对不起,我不明白最后一行或值“1.2”,你能解释一下吗?在我的示例中,我使用 y 轴向左旋转(转动)。在 x 轴上旋转 +90 度会让你面对天花板,不是吗?
    • 所以你在你的 YAxis 上旋转它?不用担心我会更新的。 1.2 只是我们想要沿轴移动的距离...
    • 已更新 Debug 示例 ^_________^ 所以很明显,如果你将原始 Z 值更改为 0,我相信你会得到想要的结果 :)
    • 这行得通,虽然我不太了解 simd 属性...
    • 是否可以使用 pivot 属性?旋转节点的实际轴,然后通过它们平移?
    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 2016-03-18
    • 2013-09-27
    • 2017-08-31
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2019-09-29
    相关资源
    最近更新 更多