You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 15:54:01