Prism ARDocsGet the SDK
Core ConceptsEnvironment Understanding

Core Concepts

Environment Understanding

How Prism AR reads the physical world to decide where ads can exist — and where they cannot.

What Is Environment Understanding?

Before a dimensional ad can be placed, the device needs to understand the geometry of the space around the user. On visionOS this is handled by ARKit; on Android XR it uses ARCore's Scene Semantics API. The Prism AR SDK listens to the platform's scene understanding feed and uses it to find valid surfaces, classify them by type, and determine whether a placement makes sense in the current context.

Plane Detection

Identifies horizontal (floor, table) and vertical (wall, door) planes large enough to host a placement.

Surface Classification

Labels planes by semantic type — floor, ceiling, table, seat, wall — so placements can be context-matched.

Occlusion & Depth

Placement rendering respects real-world depth, hiding behind objects that are physically in front of the ad.

Scene Analysis Pipeline

StageWhat Happens
1. ScanPlatform spatial APIs scan the scene for planes over a configurable threshold area (default 0.5 m²).
2. ClassifyEach detected plane is classified by semantic type using on-device ML.
3. ScorePrism AR scores each candidate plane by size, stability, visibility angle, and current user gaze direction.
4. SelectThe highest-scoring plane above the confidence threshold is chosen as the ad anchor.
5. RenderThe creative is composited into the scene at the anchor position, respecting depth and occlusion.

Privacy & User Consent

Scene understanding data — meshes, plane coordinates, semantic labels — is processed entirely on-device and is never transmitted to Prism AR servers. The only data that leaves the device is the surface type(e.g. “wall”) used for contextual targeting, not the geometry itself. Camera and world-tracking permissions must be granted by the user before any scene analysis begins.

Configuration

You can tune environment understanding behavior via PrismConfig:

Swift
PrismAR.initialize(
    appId: "YOUR_APP_ID",
    config: PrismConfig(
        minPlaneArea: 0.5,           // m² — ignore planes smaller than this
        preferredSurface: .wall,     // bias scoring toward walls
        enableOcclusion: true        // hide ad behind real objects
    )
)