axiom-scenekit-ref by charleswiltgen/axiom
npx skills add https://github.com/charleswiltgen/axiom --skill axiom-scenekit-ref完整的 SceneKit API 参考,包含每个主要概念对应的 RealityKit 等效项。
在以下情况下使用本参考:
| SceneKit | RealityKit | 备注 |
|---|---|---|
SCNScene | RealityViewContent / Entity (根) | RealityKit 场景是实体层次结构 |
SCNNode |
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
Entity| 两者中都是轻量级容器 |
SCNView | RealityView (SwiftUI) | UIKit 在 iOS 上使用 ARView |
SceneView (SwiftUI) | RealityView | SceneView 在 iOS 26 中已弃用 |
SCNRenderer | RealityRenderer | 低级 Metal 渲染 |
| 节点属性 | 组件 | ECS 将数据与层次结构分离 |
SCNSceneRendererDelegate | System / SceneEvents.Update | 帧级更新 |
.scn 文件 | .usdz / .usda 文件 | 使用 xcrun scntool 转换 |
| SceneKit | RealityKit | 备注 |
|---|---|---|
SCNGeometry | MeshResource | RealityKit 从代码生成或加载 USD |
SCNBox, SCNSphere 等 | MeshResource.generateBox(), .generateSphere() | 类似的内置形状 |
SCNMaterial | SimpleMaterial, PhysicallyBasedMaterial | RealityKit 优先使用 PBR |
SCNMaterial.lightingModel = .physicallyBased | PhysicallyBasedMaterial | RealityKit 中的默认值 |
SCNMaterial.diffuse | PhysicallyBasedMaterial.baseColor | 属性名称不同 |
SCNMaterial.metalness | PhysicallyBasedMaterial.metallic | 属性名称不同 |
SCNMaterial.roughness | PhysicallyBasedMaterial.roughness | 概念相同 |
SCNMaterial.normal | PhysicallyBasedMaterial.normal | 概念相同 |
| 着色器修改器 | ShaderGraphMaterial / CustomMaterial | 无直接移植 — 必须重写 |
SCNProgram (自定义着色器) | 带有 Metal 函数的 CustomMaterial | API 表面不同 |
SCNGeometrySource | MeshResource.Contents | 低级网格数据 |
| SceneKit | RealityKit | 备注 |
|---|---|---|
node.position | entity.position | 均为 SCNVector3 / SIMD3 |
node.eulerAngles | entity.orientation (四元数) | RealityKit 偏好四元数 |
node.scale | entity.scale | 均为 SIMD3 |
node.transform | entity.transform | 4×4 矩阵 |
node.worldTransform | entity.transform(relativeTo: nil) | 世界空间变换 |
node.addChildNode(_:) | entity.addChild(_:) | 相同的层次结构概念 |
node.removeFromParentNode() | entity.removeFromParent() | 概念相同 |
node.childNodes | entity.children | 子节点集合 |
node.parent | entity.parent | 父节点引用 |
node.childNode(withName:recursively:) | entity.findEntity(named:) | 按名称查找 |
| SceneKit | RealityKit | 备注 |
|---|---|---|
SCNLight (.omni) | PointLightComponent | 点光源 |
SCNLight (.directional) | DirectionalLightComponent | 太阳光/定向光 |
SCNLight (.spot) | SpotLightComponent | 聚光灯 |
SCNLight (.area) | 无直接等效项 | 使用多个点光源 |
SCNLight (.ambient) | EnvironmentResource (IBL) | 优先使用基于图像的照明 |
SCNLight (.probe) | EnvironmentResource | 环境探针 |
SCNLight (.IES) | 无直接等效项 | 使用光照强度配置文件 |
| SceneKit | RealityKit | 备注 |
|---|---|---|
SCNCamera | PerspectiveCamera 实体 | 带有相机组件的实体 |
camera.fieldOfView | PerspectiveCameraComponent.fieldOfViewInDegrees | 概念相同 |
camera.zNear / camera.zFar | PerspectiveCameraComponent.near / .far | 裁剪平面 |
camera.wantsDepthOfField | 后处理效果 | 机制不同 |
camera.motionBlurIntensity | 后处理效果 | 机制不同 |
allowsCameraControl | 自定义手势处理 | 无内置轨道相机 |
| SceneKit | RealityKit | 备注 |
|---|---|---|
SCNPhysicsBody | PhysicsBodyComponent | 基于组件 |
.dynamic | .dynamic | 相同模式 |
.static | .static | 相同模式 |
.kinematic | .kinematic | 相同模式 |
SCNPhysicsShape | CollisionComponent / ShapeResource | 在 RealityKit 中与物体分离 |
categoryBitMask | CollisionGroup | 命名组 vs 原始位掩码 |
collisionBitMask | CollisionFilter | 基于过滤器 |
contactTestBitMask | CollisionEvents.Began 订阅 | 基于事件的接触 |
SCNPhysicsContactDelegate | scene.subscribe(to: CollisionEvents.Began.self) | Combine 风格事件 |
SCNPhysicsField | PhysicsBodyComponent 力 | 直接施加力 |
SCNPhysicsJoint | PhysicsJoint | 类似的关节类型 |
| SceneKit | RealityKit | 备注 |
|---|---|---|
SCNAction | entity.move(to:relativeTo:duration:) | 变换动画 |
SCNAction.sequence | 动画链 | 在 RealityKit 中声明性较差 |
SCNAction.group | 并行动画 | 应用于不同实体 |
SCNAction.repeatForever | AnimationPlaybackController 重复 | API 不同 |
SCNTransaction (隐式) | 无直接等效项 | 仅显式动画 |
CAAnimation 桥接 | entity.playAnimation() | 从 USD 加载 |
SCNAnimationPlayer | AnimationPlaybackController | 播放控制 |
| 变形目标 | USD 中的混合形状 | 通过 USD 文件加载 |
| SceneKit | RealityKit | 备注 |
|---|---|---|
hitTest(_:options:) | RealityViewContent.entities(at:) | API 不同 |
| SCNView 上的手势识别器 | ManipulationComponent | 内置拖拽/旋转/缩放 |
allowsCameraControl | 自定义实现 | 无内置轨道 |
| SceneKit | RealityKit | 备注 |
|---|---|---|
ARSCNView | RealityView + AnchorEntity | 传统 → 现代 |
ARSCNViewDelegate | AnchorEntity 自动跟踪 | 事件驱动 |
renderer(_:didAdd:for:) | AnchorEntity(.plane) | 声明式锚定 |
ARWorldTrackingConfiguration | SpatialTrackingSession | iOS 18+ |
// 加载
let scene = SCNScene(named: "scene.usdz")!
let scene = try SCNScene(url: url, options: [
.checkConsistency: true,
.convertToYUp: true
])
// 属性
scene.rootNode // 节点层次结构的根
scene.background.contents // 天空盒 (UIImage, UIColor, MDLSkyCubeTexture)
scene.lightingEnvironment.contents // IBL 环境贴图
scene.fogStartDistance // 雾近端
scene.fogEndDistance // 雾远端
scene.fogColor // 雾颜色
scene.isPaused // 暂停模拟
// 创建
let node = SCNNode()
let node = SCNNode(geometry: SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0))
// 变换
node.position = SCNVector3(x, y, z)
node.eulerAngles = SCNVector3(pitch, yaw, roll)
node.scale = SCNVector3(1, 1, 1)
node.simdPosition = SIMD3<Float>(x, y, z) // 可使用 SIMD 变体
node.pivot = SCNMatrix4MakeTranslation(0, -0.5, 0) // 偏移枢轴点
// 可见性
node.isHidden = false
node.opacity = 1.0
node.castsShadow = true
node.renderingOrder = 0 // 值越低,越先渲染
// 层次结构
node.addChildNode(child)
node.removeFromParentNode()
node.childNodes
node.childNode(withName: "name", recursively: true)
node.enumerateChildNodes { child, stop in }
| 模型 | 描述 | 使用场景 |
|---|---|---|
.physicallyBased | PBR 金属-粗糙度 | 真实感渲染 (推荐) |
.blinn | Blinn-Phong 高光 | 简单的闪亮表面 |
.phong | Phong 高光 | 经典高光 |
.lambert | 仅漫反射,无高光 | 哑光表面 |
.constant | 无光照,纯色 | UI 元素,调试可视化 |
.shadowOnly | 不可见,接收阴影 | AR 地平面 |
let mat = SCNMaterial()
mat.lightingModel = .physicallyBased
// 纹理或标量值
mat.diffuse.contents = UIImage(named: "albedo") // 基础颜色
mat.metalness.contents = 0.0 // 0 = 电介质, 1 = 金属
mat.roughness.contents = 0.5 // 0 = 镜面, 1 = 粗糙
mat.normal.contents = UIImage(named: "normal") // 法线贴图
mat.ambientOcclusion.contents = UIImage(named: "ao") // AO 贴图
mat.emission.contents = UIColor.blue // 发光
mat.displacement.contents = UIImage(named: "height") // 高度贴图
// 选项
mat.isDoubleSided = false // 渲染两面
mat.writesToDepthBuffer = true
mat.readsFromDepthBuffer = true
mat.blendMode = .alpha // .add, .subtract, .multiply, .screen
mat.transparencyMode = .aOne // .rgbZero 用于预乘 alpha
// 具有自定义形状的动态物体
let shape = SCNPhysicsShape(geometry: SCNSphere(radius: 0.5), options: nil)
let body = SCNPhysicsBody(type: .dynamic, shape: shape)
body.mass = 1.0
body.friction = 0.5
body.restitution = 0.3 // 弹性
body.damping = 0.1 // 线性阻尼
body.angularDamping = 0.1 // 角阻尼
body.isAffectedByGravity = true
body.allowsResting = true // 休眠优化
node.physicsBody = body
// 复合形状
let compound = SCNPhysicsShape(shapes: [shape1, shape2],
transforms: [transform1, transform2])
// 凹面 (仅静态)
let concave = SCNPhysicsShape(geometry: mesh, options: [
.type: SCNPhysicsShape.ShapeType.concavePolyhedron
])
| 关节 | 描述 |
|---|---|
SCNPhysicsHingeJoint | 单轴旋转 (门) |
SCNPhysicsBallSocketJoint | 绕点自由旋转 (钟摆) |
SCNPhysicsSliderJoint | 沿轴线性运动 (抽屉) |
SCNPhysicsConeTwistJoint | 有限旋转 (布娃娃肢体) |
| 类别 | 动作 |
|---|---|
| 移动 | move(by:duration:), move(to:duration:) |
| 旋转 | rotate(by:around:duration:), rotateTo(x:y:z:duration:) |
| 缩放 | scale(by:duration:), scale(to:duration:) |
| 淡入淡出 | fadeIn(duration:), fadeOut(duration:), fadeOpacity(to:duration:) |
| 可见性 | hide(), unhide() |
| 音频 | playAudio(source:waitForCompletion:) |
| 自定义 | run { node in }, customAction(duration:action:) |
| 组合 | sequence([]), group([]), repeat(_:count:), repeatForever(_:) |
| 控制 | wait(duration:), removeFromParentNode() |
action.timingMode = .linear // 默认
action.timingMode = .easeIn // 慢启动
action.timingMode = .easeOut // 慢结束
action.timingMode = .easeInEaseOut // 慢启动和慢结束
action.timingFunction = { t in // 自定义曲线
return t * t // 二次缓入
}
| 约束 | 用途 |
|---|---|
SCNLookAtConstraint | 节点始终面向目标 |
SCNBillboardConstraint | 节点始终面向相机 |
SCNDistanceConstraint | 保持最小/最大距离 |
SCNReplicatorConstraint | 复制目标的变换 |
SCNAccelerationConstraint | 平滑变换变化 |
SCNSliderConstraint | 锁定到轴 |
SCNIKConstraint | 反向运动学链 |
let lookAt = SCNLookAtConstraint(target: targetNode)
lookAt.isGimbalLockEnabled = true // 防止翻滚
lookAt.influenceFactor = 0.8 // 部分约束
node.constraints = [lookAt]
在 RealityKit 中:无直接的约束系统。通过 System 更新逻辑或 entity.look(at:from:relativeTo:) 实现。
| 属性 | 默认值 | 描述 |
|---|---|---|
antialiasingMode | .multisampling4X | MSAA 级别 |
preferredFramesPerSecond | 60 | 目标帧率 |
allowsCameraControl | false | 内置轨道/平移/缩放 |
autoenablesDefaultLighting | false | 如果没有光照则添加默认光照 |
showsStatistics | false | FPS/节点/绘制计数叠加层 |
isTemporalAntialiasingEnabled | false | TAA 平滑 |
isJitteringEnabled | false | TAA 的时间抖动 |
debugOptions | [] | .showPhysicsShapes, .showBoundingBoxes, .renderAsWireframe |
WWDC : 2014-609, 2014-610, 2017-604, 2019-612
文档 : /scenekit, /scenekit/scnscene, /scenekit/scnnode, /scenekit/scnmaterial, /scenekit/scnphysicsbody, /scenekit/scnaction
技能 : axiom-scenekit, axiom-realitykit, axiom-realitykit-ref
每周安装量
68
代码仓库
GitHub 星标数
601
首次出现
2026年2月5日
安全审计
安装于
opencode64
gemini-cli61
codex60
github-copilot59
cursor58
kimi-cli57
Complete API reference for SceneKit with RealityKit equivalents for every major concept.
Use this reference when:
| SceneKit | RealityKit | Notes |
|---|---|---|
SCNScene | RealityViewContent / Entity (root) | RealityKit scenes are entity hierarchies |
SCNNode | Entity | Lightweight container in both |
SCNView | RealityView (SwiftUI) | ARView for UIKit on iOS |
SceneView (SwiftUI) | RealityView | SceneView deprecated iOS 26 |
SCNRenderer | RealityRenderer | Low-level Metal rendering |
| Node properties | Components | ECS separates data from hierarchy |
SCNSceneRendererDelegate | System / SceneEvents.Update | Frame-level updates |
.scn files | .usdz / .usda files | Convert with xcrun scntool |
| SceneKit | RealityKit | Notes |
|---|---|---|
SCNGeometry | MeshResource | RealityKit generates from code or loads USD |
SCNBox, SCNSphere, etc. | MeshResource.generateBox(), .generateSphere() | Similar built-in shapes |
SCNMaterial | , |
| SceneKit | RealityKit | Notes |
|---|---|---|
node.position | entity.position | Both SCNVector3 / SIMD3 |
node.eulerAngles | entity.orientation (quaternion) | RealityKit prefers quaternions |
node.scale | entity.scale | Both SIMD3 |
node.transform |
| SceneKit | RealityKit | Notes |
|---|---|---|
SCNLight (.omni) | PointLightComponent | Point light |
SCNLight (.directional) | DirectionalLightComponent | Sun/directional light |
SCNLight (.spot) |
| SceneKit | RealityKit | Notes |
|---|---|---|
SCNCamera | PerspectiveCamera entity | Entity with camera component |
camera.fieldOfView | PerspectiveCameraComponent.fieldOfViewInDegrees | Same concept |
camera.zNear / camera.zFar | PerspectiveCameraComponent.near / |
| SceneKit | RealityKit | Notes |
|---|---|---|
SCNPhysicsBody | PhysicsBodyComponent | Component-based |
.dynamic | .dynamic | Same mode |
.static | .static | Same mode |
.kinematic |
| SceneKit | RealityKit | Notes |
|---|---|---|
SCNAction | entity.move(to:relativeTo:duration:) | Transform animation |
SCNAction.sequence | Animation chaining | Less declarative in RealityKit |
SCNAction.group | Parallel animations | Apply to different entities |
SCNAction.repeatForever | AnimationPlaybackController repeat |
| SceneKit | RealityKit | Notes |
|---|---|---|
hitTest(_:options:) | RealityViewContent.entities(at:) | Different API |
| Gesture recognizers on SCNView | ManipulationComponent | Built-in drag/rotate/scale |
allowsCameraControl | Custom implementation | No built-in orbit |
| SceneKit | RealityKit | Notes |
|---|---|---|
ARSCNView | RealityView + AnchorEntity | Legacy → modern |
ARSCNViewDelegate | AnchorEntity auto-tracking | Event-driven |
renderer(_:didAdd:for:) | AnchorEntity(.plane) |
// Loading
let scene = SCNScene(named: "scene.usdz")!
let scene = try SCNScene(url: url, options: [
.checkConsistency: true,
.convertToYUp: true
])
// Properties
scene.rootNode // Root of node hierarchy
scene.background.contents // Skybox (UIImage, UIColor, MDLSkyCubeTexture)
scene.lightingEnvironment.contents // IBL environment map
scene.fogStartDistance // Fog near
scene.fogEndDistance // Fog far
scene.fogColor // Fog color
scene.isPaused // Pause simulation
// Creation
let node = SCNNode()
let node = SCNNode(geometry: SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0))
// Transform
node.position = SCNVector3(x, y, z)
node.eulerAngles = SCNVector3(pitch, yaw, roll)
node.scale = SCNVector3(1, 1, 1)
node.simdPosition = SIMD3<Float>(x, y, z) // SIMD variants available
node.pivot = SCNMatrix4MakeTranslation(0, -0.5, 0) // Offset pivot point
// Visibility
node.isHidden = false
node.opacity = 1.0
node.castsShadow = true
node.renderingOrder = 0 // Lower = rendered first
// Hierarchy
node.addChildNode(child)
node.removeFromParentNode()
node.childNodes
node.childNode(withName: "name", recursively: true)
node.enumerateChildNodes { child, stop in }
| Model | Description | Use Case |
|---|---|---|
.physicallyBased | PBR metallic-roughness | Realistic rendering (recommended) |
.blinn | Blinn-Phong specular | Simple shiny surfaces |
.phong | Phong specular | Classic specular highlight |
.lambert | Diffuse only, no specular | Matte surfaces |
.constant | Unlit, flat color |
let mat = SCNMaterial()
mat.lightingModel = .physicallyBased
// Textures or scalar values
mat.diffuse.contents = UIImage(named: "albedo") // Base color
mat.metalness.contents = 0.0 // 0 = dielectric, 1 = metal
mat.roughness.contents = 0.5 // 0 = mirror, 1 = rough
mat.normal.contents = UIImage(named: "normal") // Normal map
mat.ambientOcclusion.contents = UIImage(named: "ao") // AO map
mat.emission.contents = UIColor.blue // Glow
mat.displacement.contents = UIImage(named: "height") // Height map
// Options
mat.isDoubleSided = false // Render both sides
mat.writesToDepthBuffer = true
mat.readsFromDepthBuffer = true
mat.blendMode = .alpha // .add, .subtract, .multiply, .screen
mat.transparencyMode = .aOne // .rgbZero for pre-multiplied alpha
// Dynamic body with custom shape
let shape = SCNPhysicsShape(geometry: SCNSphere(radius: 0.5), options: nil)
let body = SCNPhysicsBody(type: .dynamic, shape: shape)
body.mass = 1.0
body.friction = 0.5
body.restitution = 0.3 // Bounciness
body.damping = 0.1 // Linear damping
body.angularDamping = 0.1 // Angular damping
body.isAffectedByGravity = true
body.allowsResting = true // Sleep optimization
node.physicsBody = body
// Compound shapes
let compound = SCNPhysicsShape(shapes: [shape1, shape2],
transforms: [transform1, transform2])
// Concave (static only)
let concave = SCNPhysicsShape(geometry: mesh, options: [
.type: SCNPhysicsShape.ShapeType.concavePolyhedron
])
| Joint | Description |
|---|---|
SCNPhysicsHingeJoint | Single-axis rotation (door) |
SCNPhysicsBallSocketJoint | Free rotation around point (pendulum) |
SCNPhysicsSliderJoint | Linear movement along axis (drawer) |
SCNPhysicsConeTwistJoint | Limited rotation (ragdoll limb) |
| Category | Actions |
|---|---|
| Movement | move(by:duration:), move(to:duration:) |
| Rotation | rotate(by:around:duration:), rotateTo(x:y:z:duration:) |
| Scale | scale(by:duration:), scale(to:duration:) |
| Fade | fadeIn(duration:), fadeOut(duration:), |
action.timingMode = .linear // Default
action.timingMode = .easeIn // Slow start
action.timingMode = .easeOut // Slow end
action.timingMode = .easeInEaseOut // Slow start and end
action.timingFunction = { t in // Custom curve
return t * t // Quadratic ease-in
}
| Constraint | Purpose |
|---|---|
SCNLookAtConstraint | Node always faces target |
SCNBillboardConstraint | Node always faces camera |
SCNDistanceConstraint | Maintains min/max distance |
SCNReplicatorConstraint | Copies transform of target |
SCNAccelerationConstraint | Smooths transform changes |
SCNSliderConstraint |
let lookAt = SCNLookAtConstraint(target: targetNode)
lookAt.isGimbalLockEnabled = true // Prevent roll
lookAt.influenceFactor = 0.8 // Partial constraint
node.constraints = [lookAt]
In RealityKit : No direct constraint system. Implement with System update logic or entity.look(at:from:relativeTo:).
| Property | Default | Description |
|---|---|---|
antialiasingMode | .multisampling4X | MSAA level |
preferredFramesPerSecond | 60 | Target frame rate |
allowsCameraControl | false | Built-in orbit/pan/zoom |
autoenablesDefaultLighting |
WWDC : 2014-609, 2014-610, 2017-604, 2019-612
Docs : /scenekit, /scenekit/scnscene, /scenekit/scnnode, /scenekit/scnmaterial, /scenekit/scnphysicsbody, /scenekit/scnaction
Skills : axiom-scenekit, axiom-realitykit, axiom-realitykit-ref
Weekly Installs
68
Repository
GitHub Stars
601
First Seen
Feb 5, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode64
gemini-cli61
codex60
github-copilot59
cursor58
kimi-cli57
DOCX文件处理全指南:Python与JavaScript创建、编辑、分析Word文档的SEO优化技巧
102 周安装
AWS成本优化指南:FinOps实践、EC2/RDS规模调整与Savings Plans选择
10 周安装
AI流水线编排指南:构建可靠可观测的AI工作流,从文档摄取到模型训练
10 周安装
healthcheck API/Git 监控工具 - 实时健康检查与系统状态监测解决方案
10 周安装
FastAPI 异步 API 开发教程 - 从基础应用到依赖注入完整指南
10 周安装
qwen-image:通义千问图像处理API与Git集成工具,支持多平台安装
11 周安装
SimpleMaterialPhysicallyBasedMaterial| PBR-first in RealityKit |
SCNMaterial.lightingModel = .physicallyBased | PhysicallyBasedMaterial | Default in RealityKit |
SCNMaterial.diffuse | PhysicallyBasedMaterial.baseColor | Different property name |
SCNMaterial.metalness | PhysicallyBasedMaterial.metallic | Different property name |
SCNMaterial.roughness | PhysicallyBasedMaterial.roughness | Same concept |
SCNMaterial.normal | PhysicallyBasedMaterial.normal | Same concept |
| Shader modifiers | ShaderGraphMaterial / CustomMaterial | No direct port — must rewrite |
SCNProgram (custom shaders) | CustomMaterial with Metal functions | Different API surface |
SCNGeometrySource | MeshResource.Contents | Low-level mesh data |
entity.transform |
| 4×4 matrix |
node.worldTransform | entity.transform(relativeTo: nil) | World-space transform |
node.addChildNode(_:) | entity.addChild(_:) | Same hierarchy concept |
node.removeFromParentNode() | entity.removeFromParent() | Same concept |
node.childNodes | entity.children | Children collection |
node.parent | entity.parent | Parent reference |
node.childNode(withName:recursively:) | entity.findEntity(named:) | Named lookup |
SpotLightComponent |
| Cone light |
SCNLight (.area) | No direct equivalent | Use multiple point lights |
SCNLight (.ambient) | EnvironmentResource (IBL) | Image-based lighting preferred |
SCNLight (.probe) | EnvironmentResource | Environment probes |
SCNLight (.IES) | No direct equivalent | Use light intensity profiles |
.far| Clipping planes |
camera.wantsDepthOfField | Post-processing effects | Different mechanism |
camera.motionBlurIntensity | Post-processing effects | Different mechanism |
allowsCameraControl | Custom gesture handling | No built-in orbit camera |
.kinematic |
| Same mode |
SCNPhysicsShape | CollisionComponent / ShapeResource | Separate from body in RealityKit |
categoryBitMask | CollisionGroup | Named groups vs raw bitmasks |
collisionBitMask | CollisionFilter | Filter-based |
contactTestBitMask | CollisionEvents.Began subscription | Event-based contacts |
SCNPhysicsContactDelegate | scene.subscribe(to: CollisionEvents.Began.self) | Combine-style events |
SCNPhysicsField | PhysicsBodyComponent forces | Apply forces directly |
SCNPhysicsJoint | PhysicsJoint | Similar joint types |
| Different API |
SCNTransaction (implicit) | No direct equivalent | Explicit animations only |
CAAnimation bridge | entity.playAnimation() | Load from USD |
SCNAnimationPlayer | AnimationPlaybackController | Playback control |
| Morph targets | Blend shapes in USD | Load via USD files |
| Declarative anchoring |
ARWorldTrackingConfiguration | SpatialTrackingSession | iOS 18+ |
| UI elements, debug visualization |
.shadowOnly | Invisible, receives shadows | AR ground plane |
fadeOpacity(to:duration:)| Visibility | hide(), unhide() |
| Audio | playAudio(source:waitForCompletion:) |
| Custom | run { node in }, customAction(duration:action:) |
| Composition | sequence([]), group([]), repeat(_:count:), repeatForever(_:) |
| Control | wait(duration:), removeFromParentNode() |
| Locks to axis |
SCNIKConstraint | Inverse kinematics chain |
false| Add default light if none |
showsStatistics | false | FPS/node/draw count overlay |
isTemporalAntialiasingEnabled | false | TAA smoothing |
isJitteringEnabled | false | Temporal jitter for TAA |
debugOptions | [] | .showPhysicsShapes, .showBoundingBoxes, .renderAsWireframe |