Skillshub axiom-realitykit-ref
RealityKit API reference — Entity, Component, System, RealityView, Model3D, anchor types, material system, physics, collision, animation, audio, accessibility
install
source · Clone the upstream repo
git clone https://github.com/ComeOnOliver/skillshub
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/CharlesWiltgen/Axiom/axiom-realitykit-ref" ~/.claude/skills/comeonoliver-skillshub-axiom-realitykit-ref && rm -rf "$T"
manifest:
skills/CharlesWiltgen/Axiom/axiom-realitykit-ref/SKILL.mdsource content
RealityKit API Reference
Complete API reference for RealityKit organized by category.
When to Use This Reference
Use this reference when:
- Looking up specific RealityKit API signatures or properties
- Checking which component types are available
- Finding the right anchor type for an AR experience
- Browsing material properties and options
- Setting up physics body parameters
- Looking up animation or audio API details
- Checking platform availability for specific APIs
Part 1: Entity API
Entity
// Creation let entity = Entity() let entity = Entity(components: [TransformComponent(), ModelComponent(...)]) // Async loading let entity = try await Entity(named: "scene", in: .main) let entity = try await Entity(contentsOf: url) // Clone let clone = entity.clone(recursive: true)
Entity Properties
| Property | Type | Description |
|---|---|---|
| | Identifier for lookup |
| | Unique identity |
| | Local enabled state |
| | Effective enabled (considers parents) |
| | Entity is in an active scene |
| | Has anchoring or anchored ancestor |
| | Owning scene |
| | Parent entity |
| | Child entities |
| | All attached components |
| | Nearest anchoring ancestor |
Entity Hierarchy Methods
entity.addChild(child) entity.addChild(child, preservingWorldTransform: true) entity.removeChild(child) entity.removeFromParent() entity.findEntity(named: "name") // Recursive search
Entity Subclasses
| Class | Purpose | Key Component |
|---|---|---|
| Base container | Transform only |
| Renderable object | ModelComponent |
| AR anchor point | AnchoringComponent |
| Virtual camera | PerspectiveCameraComponent |
| Sun/directional | DirectionalLightComponent |
| Point light | PointLightComponent |
| Spot light | SpotLightComponent |
| Invisible collision zone | CollisionComponent |
| SwiftUI view in 3D | visionOS |
| Body-tracked entity | BodyTrackingComponent |
Part 2: Component Catalog
Transform
// Properties entity.position // SIMD3<Float>, local entity.orientation // simd_quatf entity.scale // SIMD3<Float> entity.transform // Transform struct // World-space entity.position(relativeTo: nil) entity.orientation(relativeTo: nil) entity.setPosition(pos, relativeTo: nil) // Utilities entity.look(at: target, from: position, relativeTo: nil)
ModelComponent
let component = ModelComponent( mesh: MeshResource.generateBox(size: 0.1), materials: [SimpleMaterial(color: .red, isMetallic: true)] ) entity.components[ModelComponent.self] = component
MeshResource Built-in Generators
| Method | Parameters |
|---|---|
| or single |
| Rounded box |
| |
| , |
| Vertical plane |
| , |
| , |
| , with options |
CollisionComponent
let component = CollisionComponent( shapes: [ .generateBox(size: SIMD3(0.1, 0.2, 0.1)), .generateSphere(radius: 0.05), .generateCapsule(height: 0.3, radius: 0.05), .generateConvex(from: meshResource) ], mode: .default, // .default or .trigger filter: CollisionFilter( group: CollisionGroup(rawValue: 1), mask: .all ) )
ShapeResource Types
| Method | Description | Performance |
|---|---|---|
| Axis-aligned box | Fastest |
| Sphere | Fast |
| Capsule | Fast |
| Convex hull from mesh | Moderate |
| Exact mesh | Slowest (static only) |
PhysicsBodyComponent
let component = PhysicsBodyComponent( massProperties: .init( mass: 1.0, inertia: SIMD3(repeating: 0.1), centerOfMass: .zero ), material: .generate( staticFriction: 0.5, dynamicFriction: 0.3, restitution: 0.4 ), mode: .dynamic // .dynamic, .static, .kinematic )
| Mode | Behavior |
|---|---|
| Physics simulation controls position |
| Immovable, participates in collisions |
| Code-controlled, affects dynamic bodies |
PhysicsMotionComponent
var motion = PhysicsMotionComponent() motion.linearVelocity = SIMD3(0, 5, 0) motion.angularVelocity = SIMD3(0, .pi, 0) entity.components[PhysicsMotionComponent.self] = motion
CharacterControllerComponent
entity.components[CharacterControllerComponent.self] = CharacterControllerComponent( radius: 0.3, height: 1.8, slopeLimit: .pi / 4, stepLimit: 0.3 ) // Move character with gravity entity.moveCharacter( by: SIMD3(0.1, -0.01, 0), deltaTime: Float(context.deltaTime), relativeTo: nil )
AnchoringComponent
// Plane detection AnchoringComponent(.plane(.horizontal, classification: .table, minimumBounds: SIMD2(0.2, 0.2))) AnchoringComponent(.plane(.vertical, classification: .wall, minimumBounds: SIMD2(0.5, 0.5))) // World position AnchoringComponent(.world(transform: float4x4(...))) // Image anchor AnchoringComponent(.image(group: "AR Resources", name: "poster")) // Face tracking AnchoringComponent(.face) // Body tracking AnchoringComponent(.body)
Plane Classification
| Classification | Description |
|---|---|
| Horizontal table surface |
| Floor surface |
| Ceiling surface |
| Vertical wall |
| Door |
| Window |
| Chair/couch |
Light Components
// Directional let light = DirectionalLightComponent( color: .white, intensity: 1000, isRealWorldProxy: false ) light.shadow = DirectionalLightComponent.Shadow( maximumDistance: 10, depthBias: 0.01 ) // Point PointLightComponent( color: .white, intensity: 1000, attenuationRadius: 5 ) // Spot SpotLightComponent( color: .white, intensity: 1000, innerAngleInDegrees: 30, outerAngleInDegrees: 60, attenuationRadius: 10 )
Accessibility
var accessibility = AccessibilityComponent() accessibility.label = "Red cube" accessibility.value = "Interactive 3D object" accessibility.traits = .button accessibility.isAccessibilityElement = true entity.components[AccessibilityComponent.self] = accessibility
Additional Components
| Component | Purpose | Platform |
|---|---|---|
| Fade entity in/out | All |
| Contact shadow beneath entity | All |
| Enable gesture input | visionOS |
| Highlight on gaze/hover | visionOS |
| Multiplayer entity sync | All |
| Custom environment lighting | All |
| Receive IBL from source | All |
Part 3: System API
System Protocol
protocol System { init(scene: RealityKit.Scene) func update(context: SceneUpdateContext) }
SceneUpdateContext
| Property | Type | Description |
|---|---|---|
| | Time since last update |
| | The scene |
// Query entities context.entities(matching: query, updatingSystemWhen: .rendering)
EntityQuery
// Has specific component EntityQuery(where: .has(HealthComponent.self)) // Has multiple components EntityQuery(where: .has(HealthComponent.self) && .has(ModelComponent.self)) // Does not have component EntityQuery(where: .has(EnemyComponent.self) && !.has(DeadComponent.self))
Scene Events
| Event | Trigger |
|---|---|
| Every frame |
| Entity added to scene |
| Entity removed from scene |
| Anchor tracking changes |
| Two entities start colliding |
| Collision continues |
| Collision ends |
| Animation finishes |
scene.subscribe(to: CollisionEvents.Began.self, on: entity) { event in // event.entityA, event.entityB, event.impulse }
Part 4: RealityView API
Initializers
// Basic (iOS 18+, visionOS 1.0+) RealityView { content in // make: Add entities to content } // With update RealityView { content in // make } update: { content in // update: Called when SwiftUI state changes } // With placeholder RealityView { content in // make (async loading) } placeholder: { ProgressView() } // With attachments (visionOS) RealityView { content, attachments in // make } update: { content, attachments in // update } attachments: { Attachment(id: "label") { Text("Hello") } }
RealityViewContent
content.add(entity) content.remove(entity) content.entities // EntityCollection // iOS/macOS — camera content content.camera // RealityViewCameraContent (non-visionOS)
Gestures on RealityView
RealityView { content in ... } .gesture(TapGesture().targetedToAnyEntity().onEnded { value in let entity = value.entity }) .gesture(DragGesture().targetedToAnyEntity().onChanged { value in value.entity.position = value.convert(value.location3D, from: .local, to: .scene) }) .gesture(RotateGesture().targetedToAnyEntity().onChanged { value in // Handle rotation }) .gesture(MagnifyGesture().targetedToAnyEntity().onChanged { value in // Handle scale })
Part 5: Model3D API
// Simple display Model3D(named: "robot") // With phases Model3D(named: "robot") { phase in switch phase { case .empty: ProgressView() case .success(let model): model.resizable().scaledToFit() case .failure(let error): Text("Failed: \(error.localizedDescription)") @unknown default: EmptyView() } } // From URL Model3D(url: modelURL)
Part 6: Material System
SimpleMaterial
var material = SimpleMaterial() material.color = .init(tint: .blue) material.metallic = .init(floatLiteral: 1.0) material.roughness = .init(floatLiteral: 0.3)
PhysicallyBasedMaterial
var material = PhysicallyBasedMaterial() material.baseColor = .init(tint: .white, texture: .init(try .load(named: "albedo"))) material.metallic = .init(floatLiteral: 0.0) material.roughness = .init(floatLiteral: 0.5) material.normal = .init(texture: .init(try .load(named: "normal"))) material.ambientOcclusion = .init(texture: .init(try .load(named: "ao"))) material.emissiveColor = .init(color: .blue) material.emissiveIntensity = 2.0 material.clearcoat = .init(floatLiteral: 0.8) material.clearcoatRoughness = .init(floatLiteral: 0.1) material.specular = .init(floatLiteral: 0.5) material.sheen = .init(color: .white) material.anisotropyLevel = .init(floatLiteral: 0.5) material.blending = .transparent(opacity: .init(floatLiteral: 0.5)) material.faceCulling = .back // .none, .front, .back
UnlitMaterial
var material = UnlitMaterial() material.color = .init(tint: .red, texture: .init(try .load(named: "texture"))) material.blending = .transparent(opacity: .init(floatLiteral: 0.8))
Special Materials
// Occlusion — invisible but hides content behind it let occlusionMaterial = OcclusionMaterial() // Video let videoMaterial = VideoMaterial(avPlayer: avPlayer)
TextureResource Loading
// From bundle let texture = try await TextureResource(named: "texture") // From URL let texture = try await TextureResource(contentsOf: url) // With options let texture = try await TextureResource(named: "texture", options: .init(semantic: .color)) // .color, .raw, .normal, .hdrColor
Part 7: Animation
Transform Animation
entity.move( to: Transform( scale: .one, rotation: targetRotation, translation: targetPosition ), relativeTo: entity.parent, duration: 1.5, timingFunction: .easeInOut )
Timing Functions
| Function | Curve |
|---|---|
| System default |
| Constant speed |
| Slow start |
| Slow end |
| Slow start and end |
Playing Loaded Animations
// All animations from USD for animation in entity.availableAnimations { let controller = entity.playAnimation(animation) } // With options let controller = entity.playAnimation( animation.repeat(count: 3), transitionDuration: 0.3, startsPaused: false )
AnimationPlaybackController
let controller = entity.playAnimation(animation) controller.pause() controller.resume() controller.stop() controller.speed = 0.5 // Half speed controller.blendFactor = 1.0 // Full blend controller.isComplete // Check completion
Part 8: Audio
AudioFileResource
// Load let resource = try AudioFileResource.load( named: "sound.wav", configuration: .init( shouldLoop: true, shouldRandomizeStartTime: false, mixGroupName: "effects" ) )
Audio Components
// Spatial (3D positional) entity.components[SpatialAudioComponent.self] = SpatialAudioComponent( directivity: .beam(focus: 0.5), distanceAttenuation: .rolloff(factor: 1.0), gain: 0 // dB ) // Ambient (non-positional, uniform) entity.components[AmbientAudioComponent.self] = AmbientAudioComponent( gain: -6 ) // Channel (multi-channel output) entity.components[ChannelAudioComponent.self] = ChannelAudioComponent( gain: 0 )
Playback
let controller = entity.playAudio(resource) controller.pause() controller.stop() controller.gain = -3 // Adjust volume (dB) controller.speed = 1.5 // Pitch shift entity.stopAllAudio()
Part 9: RealityRenderer (Metal Integration)
// Low-level Metal rendering of RealityKit content let renderer = try RealityRenderer() renderer.entities.append(entity) // Render to Metal texture let descriptor = RealityRenderer.CameraOutput.Descriptor( colorFormat: .bgra8Unorm, depthFormat: .depth32Float ) try renderer.render( viewMatrix: viewMatrix, projectionMatrix: projectionMatrix, size: size, colorTexture: colorTexture, depthTexture: depthTexture )
Resources
WWDC: 2019-603, 2019-605, 2021-10074, 2022-10074, 2023-10080, 2024-10103, 2024-10153
Docs: /realitykit, /realitykit/entity, /realitykit/component, /realitykit/system, /realitykit/realityview, /realitykit/model3d, /realitykit/modelentity, /realitykit/anchorentity, /realitykit/physicallybasedmaterial
Skills: axiom-realitykit, axiom-realitykit-diag, axiom-scenekit-ref