旋转SCNNode然后相对于旋转移动?

时间:2018-03-20 02:19:49

标签: swift swift4 scenekit scnnode

我的节点设置:

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)

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

  

基本上节点从(0,0,0)开始,其前向矢量是-z轴,节点向左转,向前移动一个单位,最后到达(-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)
    }
}

1 个答案:

答案 0 :(得分: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)
    */