SceneKit:什么是它,3D场景和场景图

作者: IT Sectr 发布日期: 2026-05-03 阅读时间: 10 分钟

SceneKit——Apple的框架,用于在iOS、macOS和tvOS上处理3D图形,提供高级API,无需了解OpenGL或Metal即可创建三维场景。它支持物理、动画、光照以及与ARKit的集成。根据Apple WWDC(2025)的数据,SceneKit被用于超过5万个应用和游戏中。

要点

  • SceneKit——用于3D图形的框架,具有场景图和GPU渲染
  • SCNScene——根容器,包含SCNNode节点树
  • SCNMaterial通过着色器和纹理定义对象的外观
  • 物理引擎SceneKit模拟重力、碰撞和关节
  • 与ARKit和Metal的集成使得创建高性能AR应用成为可能

什么是SceneKit?

SceneKit——是Apple SDK中的3D图形框架,在iOS 8(2014)中引入。SceneKit提供完全可脚本化的API,运行在Metal和OpenGL之上,用于创建交互式3D场景。该框架支持通过Model I/O导入Collada(DAE)、Alembic(ABC)、USD和GLTF格式的模型。

与低级API(Metal,Vulkan)不同,SceneKit负责管理渲染、光照和物理。开发人员声明式地描述场景:添加节点、设置材质和动画。SceneKit自动优化几何体、合并draw calls并在需要时管理LOD。

SceneKit可以与ARKit配合使用,在现实世界中显示3D对象,也可以与Core ML配合用于机器视觉和场景分析。根据Apple(2025)的数据,最新版本的SceneKit仅使用Metal API,支持Apple Silicon芯片上的Metal 3和GPU Family 9。

SceneKit的历史

SceneKit于2012年作为OS X Mountain Lion的一部分出现在macOS上,最初使用OpenGL进行渲染。随着iOS 8的发布,该框架在移动设备上可用。SceneKit 2.0(iOS 10)增加了对PBR材质、HDR光照以及与Model I/O集成的支持,用于导入模型。

在iOS 12中,SceneKit完全转向Metal。iOS 15引入了对USDZ格式和AR Quick Look的支持。随着iOS 18(2024)的推出,SceneKit在配备A17 Pro和M4芯片的设备上获得了光线追踪的硬件加速,使得在移动设备上实现实时的逼真阴影和反射成为可能。

SceneKit架构:场景图和节点

SceneKit架构基于场景图,其中SCNScene是包含SCNNode层次结构的根元素。每个节点都有子节点,可以包含几何体、摄像机、灯光或物理体。节点的位置通过SCNVector3(x, y, z)在左手坐标系中确定。

SCNScene——根容器

SCNScene包含3D世界的完整状态:根节点rootNode、背景设置(background)、光源和物理世界(SCNPhysicsWorld)。场景可以从.scn文件(SceneKit Scene Format)加载或以编程方式创建。.scn格式是开放的,基于JSON。

swift
import SceneKit
 
let scene = SCNScene()
scene.background.contents = UIColor.darkGray
 
// 创建摄像机
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(0, 5, 10)
scene.rootNode.addChildNode(cameraNode)
 
// 创建带物理的立方体
let box = SCNBox(width: 2, height: 2, length: 2, chamferRadius: 0)
let boxNode = SCNNode(geometry: box)
boxNode.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.dynamic,
    shape: SCNPhysicsShape(geometry: box))
scene.rootNode.addChildNode(boxNode)

SCNCamera类配置透视或正交投影。参数:fieldOfView(视角,默认45°),zNear/zFar(近/远裁剪面)。SceneKit根据这些参数和屏幕宽高比自动管理投影矩阵。

SCNNode——场景节点

SCNNode连接几何体、变换和物理体。节点可以为空(其他节点的容器)或通过geometry属性包含几何体。每个节点都有名称(name)用于编程查找,并且可以通过CAAnimation或预定义的SCNTransaction进行动画。

节点的变换通过position(SCNVector3)、rotation(SCNVector4)和scale(SCNVector3)属性确定。对于复杂变换,使用transform(SCNMatrix4)属性。还可用的有pivot——变换中心的偏移量,以及worldPosition——在世界空间中的绝对位置,独立于层次结构。

SCNView——渲染

SCNView——用于显示SCNScene的UIView。allowsCameraControl属性启用用户通过手势(移动、旋转、缩放)控制摄像机。调试时可使用showsStatistics(FPS、draw calls、多边形)和debugOptions(wireframe、bounding boxes)。

在SwiftUI中,SceneKit通过SceneView嵌入,它包装了SCNView并支持绑定到场景参数。根据Apple(2025)的数据,SceneView使用与SCNView相同的Metal渲染器,不会为SwiftUI和UIKit之间的桥接带来额外开销。

SceneKit中的材质、光照和物理

SCNMaterial定义了几何体表面如何与光交互。SceneKit通过SCNMaterial.LightingModel.physicallyBased支持PBR(基于物理的渲染),该模型使用roughness、metalness、albedo和normal参数。PBR材质在任何光照下都看起来逼真,无需手动调整光泽度。

SCNMaterial和纹理

SCNMaterial有多个通道:diffuse(颜色/纹理)、specular(镜面光泽)、normal(法线贴图)、emission(发光)、roughness(粗糙度)和metalness(金属度)。每个通道可以包含UIColor、UIImage、CALayer或SKScene用于动画纹理。

swift
// 用于3D对象的PBR材质
let sphere = SCNSphere(radius: 1.5)
let material = SCNMaterial()
material.lightingModel = SCNMaterial.LightingModel.physicallyBased
material.diffuse.contents = UIColor.orange
material.roughness.contents = 0.3
material.metalness.contents = 0.8
sphere.materials = [material]
 
let sphereNode = SCNNode(geometry: sphere)
sphereNode.position = SCNVector3(0, 2, -5)

roughness 0.3metalness 0.8参数创建类似于磨光金属带哑光表面的材质。对于电介质(木材、塑料),metalness设置为0,对于金属则接近1.0。PBR材质自动适应场景的HDR光照。

SceneKit中的光照

SCNLight支持多种类型的光源:omni(点光源)、directional(方向光)、spot(聚光灯)、ambient(环境光)和area(面光源)。每个光源都有强度(intensity)、颜色(color)并且可以投射阴影(castsShadow)。SceneKit通过shadow maps自动管理阴影。

SceneKit支持HDR光照,具有色调映射(tone mapping)。SCNView上的wantsHDR属性启用扩展动态范围。摄像机属性:whitePoint、adaptativeLuminance和exposure根据场景亮度调整图像,产生摄影曝光效果。

SCNPhysicsBody物理

SCNPhysicsBody模拟刚体物理:重力、碰撞和摩擦。物体类型:.static(静止)、.dynamic(受力的影响)和.kinematic(编程控制)。物体的形状通过SCNPhysicsShape确定,它可以基于节点的几何体或简化形状(box、sphere、concave polyhedron)。

SCNPhysicsWorld管理场景的全局物理:重力(gravity)、模拟速度(speed)以及通过SCNPhysicsContactDelegate代理进行碰撞检测。SceneKit支持物理关节(SCNPhysicsHingeJoint、SCNPhysicsBallJoint、SCNPhysicsSliderJoint),用于创建机械装置和连接的对象。

在SceneKit中开发3D场景

在SceneKit中开发通常从通过Model I/O或.scn文件加载3D模型开始。Xcode中的场景编辑器(Scene Editor)允许可视化地放置对象、配置材质和光照,无需编写代码。.scn文件以JSON格式保存,并支持通过git进行版本控制。

导入3D模型

Model I/O(ModelIO.framework)——一个用于导入、导出和处理3D模型的强大工具。SceneKit可以直接使用MDLAsset对象,将它们转换为SCNScene。支持的格式包括:USD、USDZ、OBJ、STL、PLY、Collada(DAE)和Alembic(ABC)。带有动画的模型(骨骼动画、变形)也可以导入。

swift
// 通过Model I/O加载3D模型
import ModelIO
 
let url = Bundle.main.url(forResource: "robot",
    withExtension: "usdz")!
let asset = MDLAsset(url: url)
let scene = SCNScene(mdlAsset: asset)
 
// 按名称搜索节点以进行配置
if let robot = scene.rootNode.childNode(
    withName: "RobotArmature", recursively: true
) {
    robot.position = SCNVector3(0, 0, -3)
}

导入后,模型可以通过从MDLAnimation复制的CAAnimation进行动画,或通过SCNTransaction进行平滑的属性变化。SceneKit的动画系统支持动画之间的混合以及与物理的同步,以创建逼真的运动。

动画和事务

SCNTransaction允许将场景参数的变化分组到具有指定持续时间的动画块中。begin()和commit()方法包围更改,duration设置动画持续时间。嵌套事务支持不同持续时间的并行动画。Completion块在动画完成后执行。

对于骨骼动画,SceneKit支持SCNAnimationSCNMorpher用于blend-shape(变形目标)。每个动画可以循环、时间缩放并通过additive blending与其他动画混合。根据Apple(2025)的数据,SceneKit在一个骨架上支持多达4个同时混合的动画。

SCNParticleSystem粒子系统

SCNParticleSystem——内置粒子系统,用于创建烟雾、火焰、雨和火花等效果。粒子可以从点、球体、立方体或几何体表面发射。参数:birthRate、particleLifeSpan、speed、acceleration和colorOverLife。粒子系统在GPU上运行以获得最高性能。

根据Apple(2025)的数据,SCNParticleSystem在配备A16+的设备上支持多达10万个粒子,帧率为60 FPS。粒子可以对场景中物理体的碰撞做出反应。对于复杂效果,可以组合多个不同参数的粒子系统并绑定到移动的节点上。

SceneKit和ARKit:增强现实

SceneKit是ARKit应用的首选高级框架。ARSCNView扩展了SCNView,自动将虚拟3D世界与实际环境同步。图像分析、平面检测和面部跟踪由ARKit执行,渲染由SceneKit执行。

ARSCNView和ARAnchor

ARSCNView支持SCNView的所有功能,但将场景摄像机替换为设备的真实摄像机。ARKit分析来自摄像机的视频并创建ARAnchor,SceneKit将其转换为SCNNode。ARKit会话通过session属性管理,使用配置(ARWorldTrackingConfiguration、ARFaceTrackingConfiguration)进行设置。

swift
import ARKit
 
class ARViewController: UIViewController,
    ARSessionDelegate {
    let sceneView = ARSCNView()
     
    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.session.run(
            ARWorldTrackingConfiguration()
        )
        sceneView.autoenablesDefaultLighting = true
        sceneView.delegate = self
    }
}

autoenablesDefaultLighting属性添加与实际环境相对应的内置光照。ARKit 6(iOS 18)支持Location Anchors,用于将3D对象锚定到地理坐标,以及Room Tracking,用于对室内空间进行详细到家具级别的映射。

平面检测和对象放置

ARKit通过didAdd/didUpdate/didRemove anchor代理检测水平面和垂直面(地板、桌子、墙壁)。绑定到ARPlaneAnchor的SceneKit节点自动实时跟踪平面的位置。放置对象使用ARSCNView上的hitTest方法或raycastQuery。

根据Apple(2025)的数据,A17 Pro上ARKit的最大跟踪距离在10勒克斯光照下为50米。SceneKit + ARKit提供低于20毫秒的端到端延迟(motion-to-photon),这对于AR游戏和在真实设备上叠加3D指令的工业应用至关重要。

常见问题

什么是SceneKit,它用于什么?

SceneKit——Apple的3D图形框架,允许无需低级编程即可创建交互式三维场景。用于iOS、macOS和tvOS上的游戏、AR应用、数据可视化和3D编辑器。

SceneKit和Metal有什么区别?

SceneKit——具有现成渲染器和物理的高级API,适用于典型的3D任务。Metal——用于完全控制GPU的低级API。SceneKit内部使用Metal,而Metal适用于自定义渲染效果。

SceneKit支持哪些3D模型格式?

SceneKit通过Model I/O支持USD、USDZ、OBJ、STL、Collada(DAE)、Alembic(ABC)、PLY和GLTF。原生格式——基于JSON的.scn(SceneKit Scene Format)。可以通过SCNGeometry以编程方式创建几何体。

如何优化SceneKit的性能?

对远处的对象使用LOD(Level of Detail),合并具有相同材质的几何体,将阴影和光源数量限制在3–4个。启用Statistics以实时监控FPS和draw calls。

SceneKit可以用于AR应用吗?

可以,通过ARSCNView——SCNView的ARKit扩展。SceneKit自动将3D场景与真实世界同步,支持平面、面部和图像检测。这是在AR中添加3D对象的最简单方法。

总结

  • SceneKit——Apple用于高级3D图形的框架,通过Metal实现GPU渲染
  • SCNSceneSCNNode构成具有变换继承的场景图
  • SCNMaterial支持具有roughness、metalness和法线贴图的PBR渲染
  • SCNPhysicsBody提供具有碰撞和关节的物理模拟
  • Model I/O导入USD、OBJ、Collada和其他格式的模型
  • ARSCNView通过ARKit将3D场景与增强现实集成
  • SCNParticleSystem实时创建具有数百万粒子的GPU效果

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读