如何使 SCNNode rotate/spin 水平
How to make SCNNode rotate/spin horizontally
我正在尝试让我的 SCNNode 自动水平旋转。这是我目前的代码:
box.scale = SCNVector3(x: 0.26, y: 0.26, z: 0.26)
box.position = SCNVector3(0.15, 3.85, -3)
如何让这个盒子自动水平旋转?另外,有没有办法在启用用户交互的情况下实现它?谢谢!
更新:如果我听起来不够清楚,这就是我的意思:你知道当你用手指旋转篮球时它是如何水平旋转的吗?这就是我想要达到的效果!谢谢!
您可以
- 使用
SCNAction
class,例如SCNAction.rotate(by:around:duration:)
。这样做的好处是您可以链接多个动画或永远重复它们,
编辑:
let action = SCNAction.repeatForever(SCNAction.rotate(by: .pi, around: SCNVector3(0, 1, 0), duration: 5))
box.runAction(action)
您可以像这样更改变换
let oldTransform = box.transform
let rotation = SCNMatrix4MakeRotation(axis.x, axis.y, axis.z angle)
SCNTransaction.begin()
SCNTransaction.animationDuration = 0.5
box.transform = SCNMatrix4Mult(rotation, oldTransform)
SCNTransaction.commit()
要使用用户输入,您可以例如使用手势识别器更改旋转角度或持续时间
使用 SceneView 的 SwiftUI 使用一些稍微更新的语法更新了接受的答案。
在 iOS14/iOS15
上效果很好
let oldTransform = cubeNode.transform
let rotation = SCNMatrix4MakeRotation(GLKMathDegreesToRadians(90), 0, 1, 0)
SCNTransaction.begin()
SCNTransaction.animationDuration = 0.5
cubeNode.transform = SCNMatrix4Mult(rotation, oldTransform)
SCNTransaction.commit()
我正在尝试让我的 SCNNode 自动水平旋转。这是我目前的代码:
box.scale = SCNVector3(x: 0.26, y: 0.26, z: 0.26)
box.position = SCNVector3(0.15, 3.85, -3)
如何让这个盒子自动水平旋转?另外,有没有办法在启用用户交互的情况下实现它?谢谢!
更新:如果我听起来不够清楚,这就是我的意思:你知道当你用手指旋转篮球时它是如何水平旋转的吗?这就是我想要达到的效果!谢谢!
您可以
- 使用
SCNAction
class,例如SCNAction.rotate(by:around:duration:)
。这样做的好处是您可以链接多个动画或永远重复它们,
编辑:
let action = SCNAction.repeatForever(SCNAction.rotate(by: .pi, around: SCNVector3(0, 1, 0), duration: 5))
box.runAction(action)
您可以像这样更改变换
let oldTransform = box.transform
let rotation = SCNMatrix4MakeRotation(axis.x, axis.y, axis.z angle)
SCNTransaction.begin()
SCNTransaction.animationDuration = 0.5
box.transform = SCNMatrix4Mult(rotation, oldTransform)
SCNTransaction.commit()
要使用用户输入,您可以例如使用手势识别器更改旋转角度或持续时间
使用 SceneView 的 SwiftUI 使用一些稍微更新的语法更新了接受的答案。
在 iOS14/iOS15
上效果很好 let oldTransform = cubeNode.transform
let rotation = SCNMatrix4MakeRotation(GLKMathDegreesToRadians(90), 0, 1, 0)
SCNTransaction.begin()
SCNTransaction.animationDuration = 0.5
cubeNode.transform = SCNMatrix4Mult(rotation, oldTransform)
SCNTransaction.commit()