Ios SceneKit-使SCNNode水平旋转,但不旋转多次?
好的,如果有一个奇怪的时间旋转一个基于操纵杆的SCNNode,只需旋转到操纵杆定义的角度即可。我在模仿苹果的Fox WWDC演示,所以我得到了操纵杆的角度,并将其转换为CGFloat- 我只是试着在水平轴上旋转我的节点(不是y方向,只是x方向),这样它 当操纵杆向下和向下时,面向摄像机的视角 操纵杆向上时面朝前 我有一定程度的工作经验,但不是一路都有。不知道为什么-问题是我需要我的节点的同一侧(它是一个立方体)面对左边,如果操纵杆向下-现在这可能会发生,也可能不会发生,这取决于立方体在达到这个后向(向下)角度时经历了多少次旋转 例如,如果我在节点背面有一个点,如果操纵杆指向下方,立方体旋转指向用户,我需要该点始终面向用户/摄像机 到目前为止,我从float2中的操纵杆(全部来自Apple)获得了角度-看看CameradDirection:Ios SceneKit-使SCNNode水平旋转,但不旋转多次?,ios,swift3,scenekit,augmented-reality,arkit,Ios,Swift3,Scenekit,Augmented Reality,Arkit,好的,如果有一个奇怪的时间旋转一个基于操纵杆的SCNNode,只需旋转到操纵杆定义的角度即可。我在模仿苹果的Fox WWDC演示,所以我得到了操纵杆的角度,并将其转换为CGFloat- 我只是试着在水平轴上旋转我的节点(不是y方向,只是x方向),这样它 当操纵杆向下和向下时,面向摄像机的视角 操纵杆向上时面朝前 我有一定程度的工作经验,但不是一路都有。不知道为什么-问题是我需要我的节点的同一侧(它是一个立方体)面对左边,如果操纵杆向下-现在这可能会发生,也可能不会发生,这取决于立方体在达到这个后
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))
}
}