SceneKit:平移手势不存储先前的旋转
SceneKit: pan gesture not storing previous rotation
我正在使用平移手势来旋转我的 SceneKit 场景中的节点。我目前拥有的代码完美地旋转了节点。这是我用来旋转节点的代码:
var previousRotation:Float = 0
@objc func panGestureRecognized(gesture: UIPanGestureRecognizer) {
if gesture.numberOfTouches == 2 {
let view = self.view as! SCNView
let node = view.scene!.rootNode.childNode(withName: "Node", recursively: false)
let translation = gesture.translation(in: view)
var newAngle = Float(translation.x) * Float(Double.pi) / 180.0
newAngle += previousRotation
switch gesture.state {
case .began:
newAngle += previousRotation
break
case .changed:
node!.rotation = SCNVector4(x: 0, y: Float(translation.y), z: 0, w: newAngle)
break
case .ended:
newAngle += previousRotation
break
default: break
}
}
}
问题是,当您抬起手指并再次开始旋转时,旋转 "resets"。我需要它 "keep" 它的旋转,所以当你再次开始平移时,它只是从上次旋转停止的地方继续。
开始吧,经过一些重大更改、来自其他 SO 问题的信息以及不同的方法,我想通了。使用此代码,您可以在任何轴(在我的例子中是 y)上完美地旋转一个节点,然后 "store" 它的旋转以在之后继续与另一个平移一起旋转。
var previousRotation = SCNVector4(x: 0, y: 0, z: 0, w: 0)
@objc func pan(gesture: UIPanGestureRecognizer) {
if gesture.numberOfTouches == 2 {
let view = self.view as! SCNView
let node = view.scene!.rootNode.childNode(withName: "Node", recursively: false)
let translate = gesture.translation(in: view)
var newAngle = Float(translate.x) * Float(Double.pi) / 180.0
var rotationVector = SCNVector4()
rotationVector = SCNVector4(x: 0, y: previousRotation.y + Float(translate.y), z: 0, w: previousRotation.w - newAngle)
switch gesture.state {
case .began:
previousRotation = node!.rotation
break
case .changed:
node!.rotation = rotationVector
break
default: break
}
}
}
希望这对以后的其他人有所帮助。
我正在使用平移手势来旋转我的 SceneKit 场景中的节点。我目前拥有的代码完美地旋转了节点。这是我用来旋转节点的代码:
var previousRotation:Float = 0
@objc func panGestureRecognized(gesture: UIPanGestureRecognizer) {
if gesture.numberOfTouches == 2 {
let view = self.view as! SCNView
let node = view.scene!.rootNode.childNode(withName: "Node", recursively: false)
let translation = gesture.translation(in: view)
var newAngle = Float(translation.x) * Float(Double.pi) / 180.0
newAngle += previousRotation
switch gesture.state {
case .began:
newAngle += previousRotation
break
case .changed:
node!.rotation = SCNVector4(x: 0, y: Float(translation.y), z: 0, w: newAngle)
break
case .ended:
newAngle += previousRotation
break
default: break
}
}
}
问题是,当您抬起手指并再次开始旋转时,旋转 "resets"。我需要它 "keep" 它的旋转,所以当你再次开始平移时,它只是从上次旋转停止的地方继续。
开始吧,经过一些重大更改、来自其他 SO 问题的信息以及不同的方法,我想通了。使用此代码,您可以在任何轴(在我的例子中是 y)上完美地旋转一个节点,然后 "store" 它的旋转以在之后继续与另一个平移一起旋转。
var previousRotation = SCNVector4(x: 0, y: 0, z: 0, w: 0)
@objc func pan(gesture: UIPanGestureRecognizer) {
if gesture.numberOfTouches == 2 {
let view = self.view as! SCNView
let node = view.scene!.rootNode.childNode(withName: "Node", recursively: false)
let translate = gesture.translation(in: view)
var newAngle = Float(translate.x) * Float(Double.pi) / 180.0
var rotationVector = SCNVector4()
rotationVector = SCNVector4(x: 0, y: previousRotation.y + Float(translate.y), z: 0, w: previousRotation.w - newAngle)
switch gesture.state {
case .began:
previousRotation = node!.rotation
break
case .changed:
node!.rotation = rotationVector
break
default: break
}
}
}
希望这对以后的其他人有所帮助。