3D and AR scenes in SwiftUI, powered by RealityKit. The Apple companion to SceneView for Android.
Add SceneViewSwift via Swift Package Manager:
- In Xcode, go to File > Add Package Dependencies...
- Enter the repository URL:
https://github.com/sceneview/sceneview-swift - Select the version rule and add the package to your target.
Or add it to your Package.swift:
dependencies: [
.package(url: "https://github.com/sceneview/sceneview-swift", from: "3.3.0")
]import SwiftUI
import SceneViewSwift
struct ModelViewer: View {
@State private var model: ModelNode?
var body: some View {
SceneView { content in
if let model {
content.addChild(model.entity)
}
}
.environment(.studio)
.cameraControls(.orbit)
.autoRotate()
.task {
model = try? await ModelNode.load("robot.usdz")
}
}
}import SwiftUI
import SceneViewSwift
struct ARPlacement: View {
@State private var model: ModelNode?
@State private var placedEntities: [Entity] = []
var body: some View {
ARSceneView(
planeDetection: .horizontal,
onTapOnPlane: { position in
if let model {
let clone = model.entity.clone(recursive: true)
clone.position = position
// Add to AR scene
}
}
)
.task {
model = try? await ModelNode.load("chair.usdz")
}
}
}SceneView { root in
let metal = GeometryNode.sphere(
radius: 0.3,
material: .pbr(color: .gray, metallic: 1.0, roughness: 0.1)
)
.position(.init(x: 0, y: 0.3, z: 0))
.withGroundingShadow()
root.addChild(metal.entity)
}
.environment(.sunset)let sun = LightNode.directional(color: .warm, intensity: 1000, castsShadow: true)
.lookAt(.zero)
let lamp = LightNode.point(color: .custom(r: 1, g: 0.5, b: 0), intensity: 500)
.position(.init(x: 1, y: 2, z: 0))// Always faces camera
let label = BillboardNode.text("Player 1", fontSize: 0.04)
.position(.init(x: 0, y: 1.5, z: 0))
// 3D extruded text
let title = TextNode(text: "SceneView", fontSize: 0.08, depth: 0.02)
.centered()| Type | Description |
|---|---|
SceneView |
3D scene with orbit camera, lighting, and gestures |
ARSceneView |
AR scene with plane detection and tap-to-place |
| Type | Description |
|---|---|
ModelNode |
USDZ model loading with animations and collision |
GeometryNode |
Procedural shapes (cube, sphere, cylinder, cone, plane) |
MeshNode |
Custom mesh geometry from raw vertex data |
TextNode |
3D extruded text with centering |
BillboardNode |
Always-faces-camera wrapper |
LineNode |
Line segments and axis gizmos |
PathNode |
Closed and open 3D paths with customizable geometry (circle, grid helpers) |
LightNode |
Directional, point, and spot lights |
CameraNode |
Programmatic camera control with orbit, fly-through, and custom modes |
ImageNode |
Display images on 3D planes with automatic aspect ratio |
VideoNode |
Play video content on 3D surfaces with playback controls |
PhysicsNode |
Apply physics simulation (dynamic, static, kinematic) to entities |
DynamicSkyNode |
Time-of-day sun positioning with atmospheric color model |
FogNode |
Atmospheric fog (linear, exponential, height-based) |
ReflectionProbeNode |
Local cubemap reflections for realistic surfaces |
AnchorNode |
AR world/plane anchor |
AugmentedImageNode |
Detect real-world images and place 3D content (iOS only) |
| Type | Description |
|---|---|
SceneEnvironment |
6 HDR presets: studio, outdoor, sunset, night, warm, autumn |
CameraControls |
Orbit camera with inertia and auto-rotation |
GeometryMaterial |
PBR material: .simple, .pbr, .unlit |
| Android (Compose) | iOS (SwiftUI) |
|---|---|
Scene { } |
SceneView { root in } |
ARScene { } |
ARSceneView() |
rememberModelInstance |
ModelNode.load() |
CubeNode |
GeometryNode.cube() |
SphereNode |
GeometryNode.sphere() |
LightNode(apply = { }) |
LightNode.directional() |
rememberEnvironment |
.environment(.studio) |
CameraManipulator |
CameraControls |
See Examples/SceneViewDemo/ for a full 4-tab demo:
- Explore -- 3D viewer with orbit camera and 6 HDR environments
- Shapes -- All primitive shapes with live previews and code snippets
- AR -- Tap-to-place objects on real surfaces
- About -- SDK information and feature list
Apache 2.0. See LICENSE for details.