SceneView¶
3D & AR for every platform — native Android, native iOS, React Native, Flutter, and beyond.
Android Native iOS Native v4.1 XR Headsets React Native Flutter TV · Auto · Desktop
Start building Try the demo View on GitHub
See what you can build¶
SceneView powers production apps in e-commerce, automotive, healthcare, and more. Same composable API — from a 5" phone to a 65" TV to XR headsets.
E-commerce
3D product viewers with 360° rotation and AR try-on. Drop a Scene {} where you'd use an Image().
AR navigation
Augmented reality walking directions, indoor wayfinding, street-level AR overlays — built with ARScene {}.
Automotive HUD
Heads-up displays, 3D navigation arrows, speed overlays on Android Automotive. Multiple Scene {} on one screen.
XR spatial computing
Floating 3D models with Compose UI panels in spatial space. XRScene {} + ViewNode for cards, buttons, pickers.
Healthcare & education
Interactive 3D anatomy models, molecular structures, and mechanical assemblies. Students control everything with standard Compose UI — sliders, buttons, toggles.
Real estate
Walk through 3D floor plans, preview renovations in AR, compare lighting conditions. PortalNode lets users peek through doors into furnished rooms.
Gaming & entertainment
Build 3D mobile games without a game engine. PhysicsNode for collisions, dynamic lighting, Compose UI overlays for HUD — all at 60fps on mid-range devices.
Education & STEM
Interactive globes, solar system explorers, chemistry lab simulations. Students control 3D models with standard Compose sliders, buttons, and quiz overlays via ViewNode.
How it works¶
Write a Scene { } the same way you write a Column { }. Nodes are composables.
State drives the scene. Lifecycle is automatic.
@Composable
fun ProductViewer() {
val engine = rememberEngine()
val modelLoader = rememberModelLoader(engine)
val shoe = rememberModelInstance(modelLoader, "models/shoe.glb")
Scene(
modifier = Modifier.fillMaxWidth().height(300.dp),
engine = engine,
cameraManipulator = rememberCameraManipulator()
) {
shoe?.let {
ModelNode(modelInstance = it, scaleToUnits = 1.0f, autoAnimate = true)
}
LightNode(type = LightManager.Type.SUN, apply = { intensity(100_000.0f) })
}
}
Ten lines. Your users can rotate, zoom, and inspect a product in 3D — inside your existing Compose layout.
@Composable
fun FurniturePlacement() {
var anchor by remember { mutableStateOf<Anchor?>(null) }
val engine = rememberEngine()
val modelLoader = rememberModelLoader(engine)
val sofa = rememberModelInstance(modelLoader, "models/sofa.glb")
ARScene(
modifier = Modifier.fillMaxSize(),
engine = engine,
planeRenderer = true,
onSessionUpdated = { _, frame ->
if (anchor == null) {
anchor = frame.getUpdatedPlanes()
.firstOrNull { it.type == Plane.Type.HORIZONTAL_UPWARD_FACING }
?.let { frame.createAnchorOrNull(it.centerPose) }
}
}
) {
anchor?.let { a ->
AnchorNode(anchor = a) {
sofa?.let {
ModelNode(modelInstance = it, scaleToUnits = 0.5f, isEditable = true)
}
}
}
}
}
Tap to place. Pinch to scale. Two-finger rotate. All built in.
@Composable
fun SpatialShowroom() {
XRScene(modifier = Modifier.fillMaxSize()) {
ModelNode(
modelInstance = furniture,
position = Position(0f, 0f, -2f)
)
ViewNode(position = Position(0.5f, 1.5f, -1.5f)) {
Card {
Text("Tap to customize")
ColorPicker(onColorSelected = { /* update material */ })
}
}
}
}
Same composable API — now in spatial computing headsets.
Ask AI, get a 3D scene¶
The most AI-friendly 3D library. Ships with an MCP server and llms.txt API reference — so Claude, Cursor, and Copilot always have the current API.
@Composable
fun ProductDetail(modelPath: String) {
var showAR by remember { mutableStateOf(false) }
val engine = rememberEngine()
val modelLoader = rememberModelLoader(engine)
val model = rememberModelInstance(modelLoader, modelPath)
if (showAR) {
ARScene(modifier = Modifier.fillMaxSize(), engine = engine, planeRenderer = true,
onSessionUpdated = { _, frame -> /* anchor placement */ }
) { /* AR content */ }
} else {
Scene(modifier = Modifier.fillMaxWidth().height(350.dp), engine = engine,
cameraManipulator = rememberCameraManipulator()
) {
model?.let { ModelNode(modelInstance = it, scaleToUnits = 1.0f) }
}
}
Button(onClick = { showAR = !showAR }) { Text(if (showAR) "Back to 3D" else "View in AR") }
}
MCP server included llms.txt API reference Works with Claude · Cursor · Copilot
Install¶
dependencies {
implementation("io.github.sceneview:sceneview:3.2.0")
}
dependencies {
implementation("io.github.sceneview:arsceneview:3.2.0")
}
dependencies {
implementation("io.github.sceneview:sceneview-xr:4.0.0")
}
That's it
No XML layouts. No fragments. No OpenGL boilerplate. Just add the dependency and start composing.
What you get¶
26+ composable node types — visual overview¶
-
3D Models
ModelNodeloads glTF/GLB with animations, gestures, and automatic scaling. Geometry primitives —CubeNode,SphereNode,CylinderNode,PlaneNode— need no asset files. -
Lighting & Atmosphere
LightNode(sun, point, spot, directional),DynamicSkyNode(time-of-day),FogNode,ReflectionProbeNode. All driven by Compose state. -
Media & UI in 3D
ImageNode,VideoNode(with chromakey), andViewNode— render any Composable directly inside 3D space. Text, buttons, cards — floating in your scene. -
Physics
PhysicsNode— rigid body simulation with gravity, collision, and tap-to-throw. Interactive 3D worlds without a game engine. -
Drawing & Text
LineNode,PathNodefor 3D polylines and animated paths.TextNode,BillboardNodefor camera-facing labels. -
AR & spatial
AnchorNode,AugmentedImageNode,AugmentedFaceNode,CloudAnchorNode,StreetscapeGeometryNode. Plane detection, geospatial, environmental HDR. -
Production rendering — Filament
Built on Google Filament — PBR, HDR environment lighting, bloom, depth-of-field, SSAO. 60fps on mid-range devices.
See it in action¶
Real app screenshots
Made with SceneView
Made with SceneView
Made with SceneView
Made with SceneView
Feature previews
Same composable API — XRScene { } for spatial computing. Floating Compose UI via ViewNode.
Kotlin Multiplatform + Filament Metal backend. Share your scene graph across Android and iOS.
Compose Multiplatform opens the door to Android TV, Desktop JVM, and every screen Kotlin reaches.
Get started¶
-
3D with Compose
Build your first 3D scene with a rotating glTF model, HDR lighting, and orbit camera gestures.
~25 minutes
-
AR with Compose
Place 3D objects in the real world using ARCore plane detection and anchor tracking.
~20 minutes
Samples¶
15 working sample apps ship with the repository:
| Sample | What it demonstrates |
|---|---|
model-viewer |
3D model, HDR environment, orbit camera, animation playback |
ar-model-viewer |
Tap-to-place, plane detection, pinch/rotate gestures |
camera-manipulator |
Orbit / pan / zoom camera with gesture hints |
dynamic-sky |
Time-of-day sun, turbidity, fog controls |
physics-demo |
Tap-to-throw balls, collision, gravity |
post-processing |
Bloom, depth-of-field, SSAO, fog toggles |
ar-augmented-image |
Real-world image detection + overlay |
ar-cloud-anchor |
Persistent cross-device anchors |
ar-point-cloud |
ARCore feature point visualisation |
autopilot-demo |
Autonomous driving HUD |
gltf-camera |
Cameras imported from a glTF file |
line-path |
Animated sine/Lissajous curves with PathNode |
text-labels |
Camera-facing 3D text labels (TextNode) |
reflection-probe |
Zone-based IBL overrides + material picker |
sceneview-demo |
Full showcase: Explore, Showcase, Gallery tabs |
Switching from another library?¶
-
Coming from Sceneform?
Sceneform was archived by Google in 2021. SceneView is the successor — modern Compose API, active development, full ARCore support.
-
Evaluating options?
Side-by-side comparison with Sceneform, Unity, raw ARCore, Rajawali, and other alternatives.