SwiftUI如何实现应用打开时SceneView加载的3D对象按指定速度自动旋转
SwiftUI 实现SceneView加载3D模型自动持续旋转方案
实现思路
- 提前持有
SCNScene实例,不要直接在SceneView初始化时临时创建,这样才能获取到3D模型的根节点添加动画 - 用SceneKit自带的
SCNAction创建无限重复的旋转动画,绑定到模型根节点即可实现自动旋转,不会影响原有手动旋转控制功能
完整修改后代码
import SwiftUI import SceneKit struct Home : View { @State var models = [ Model(id: 0, name: "Venus", modelName: "AirForce.usdz"), ] // 补全原代码缺失的index变量,可根据实际需求修改 @State private var index = 0 // 持有SCNScene实例方便后续操作节点 @State private var scene: SCNScene? var body: some View{ VStack{ if let scene = scene { SceneView(scene: scene, options: [.autoenablesDefaultLighting,.allowsCameraControl]) .frame(width: UIScreen.main.bounds.width , height: UIScreen.main.bounds.height / 2) // 页面加载完成后添加旋转动画 .onAppear { // 创建旋转动画:绕Y轴旋转360度,完成一次旋转耗时10秒,数值越小旋转速度越快 let rotateAction = SCNAction.repeatForever(SCNAction.rotate(by: .pi * 2, around: SCNVector3(0, 1, 0), duration: 10)) // 动画添加到模型根节点 scene.rootNode.runAction(rotateAction) } } } // 页面初始化时加载3D模型 .onAppear { scene = SCNScene(named: models[index].modelName) } } } // 原Model结构的补充定义,若已经定义过可直接忽略 struct Model: Identifiable { let id: Int let name: String let modelName: String }
自定义参数说明
- 调整
SCNAction.rotate方法的around参数可以修改旋转轴:SCNVector3(1, 0, 0)代表绕X轴旋转SCNVector3(0, 1, 0)代表绕Y轴旋转(常用,即水平方向旋转)SCNVector3(0, 0, 1)代表绕Z轴旋转
- 调整
duration参数的数值即可修改旋转速度,数值越小旋转速度越快
内容的提问来源于stack exchange,提问作者user9183711
相关产品推荐
相关产品推荐

