Ios SceneKit-使SCNNode水平旋转,但不旋转多次?

Ios SceneKit-使SCNNode水平旋转,但不旋转多次?,ios,swift3,scenekit,augmented-reality,arkit,Ios,Swift3,Scenekit,Augmented Reality,Arkit,好的,如果有一个奇怪的时间旋转一个基于操纵杆的SCNNode,只需旋转到操纵杆定义的角度即可。我在模仿苹果的Fox WWDC演示,所以我得到了操纵杆的角度,并将其转换为CGFloat- 我只是试着在水平轴上旋转我的节点(不是y方向,只是x方向),这样它 当操纵杆向下和向下时,面向摄像机的视角 操纵杆向上时面朝前 我有一定程度的工作经验,但不是一路都有。不知道为什么-问题是我需要我的节点的同一侧(它是一个立方体)面对左边,如果操纵杆向下-现在这可能会发生,也可能不会发生,这取决于立方体在达到这个后

好的,如果有一个奇怪的时间旋转一个基于操纵杆的SCNNode,只需旋转到操纵杆定义的角度即可。我在模仿苹果的Fox WWDC演示,所以我得到了操纵杆的角度,并将其转换为CGFloat-

我只是试着在水平轴上旋转我的节点(不是y方向,只是x方向),这样它

当操纵杆向下和向下时,面向摄像机的视角

操纵杆向上时面朝前

我有一定程度的工作经验,但不是一路都有。不知道为什么-问题是我需要我的节点的同一侧(它是一个立方体)面对左边,如果操纵杆向下-现在这可能会发生,也可能不会发生,这取决于立方体在达到这个后向(向下)角度时经历了多少次旋转

例如,如果我在节点背面有一个点,如果操纵杆指向下方,立方体旋转指向用户,我需要该点始终面向用户/摄像机

到目前为止,我从float2中的操纵杆(全部来自Apple)获得了角度-看看CameradDirection:

func padOverlayVirtualStickInteractionDidStart(_ padNode: PadOverlay) {
        //control char
        if padNode == overlay!.controlOverlay!.leftPad {
            characterDirection = float2(Float(padNode.stickPosition.x), -Float(padNode.stickPosition.y))
        }

        //control world
        if padNode == overlay!.controlOverlay!.rightPad {
            cameraDirection = float2(Float(padNode.stickPosition.x), -Float(padNode.stickPosition.y))
        }
    }

    func padOverlayVirtualStickInteractionDidChange(_ padNode: PadOverlay) {
        //control char
        if padNode == overlay!.controlOverlay!.leftPad {
            characterDirection = float2(Float(padNode.stickPosition.x), -Float(padNode.stickPosition.y))
        }

        //control world
        if padNode == overlay!.controlOverlay!.rightPad {
            cameraDirection = float2( -Float(padNode.stickPosition.x), Float(padNode.stickPosition.y))
        }
    }
再次转换此项:

var worldDirection = float2()
public var cameraDirection: vector_float2 {
        get {
            return self.worldDirection
        }
        set {
            var direction = newValue
            let l = simd_length(direction)
            if l > 1.0 {
                direction *= 1 / l
            }
            self.worldDirection = direction
        }
    }
然后:

然后我应用到节点:

 public var worldDirectionAngle: CGFloat = 0.0 {
        didSet {
            overallWorldNode.runAction(
                SCNAction.rotateTo(x: 0.0, y: worldDirectionAngle, z: 0.0, duration: 0.2, usesShortestUnitArc:true))
        }
    }
如何停止多次旋转

 public var worldDirectionAngle: CGFloat = 0.0 {
        didSet {
            overallWorldNode.runAction(
                SCNAction.rotateTo(x: 0.0, y: worldDirectionAngle, z: 0.0, duration: 0.2, usesShortestUnitArc:true))
        }
    }