<?xml version='1.0' encoding='utf-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"><channel><title>SpatialAPI.com — Spatial Field Notes</title><link>https://spatialapi.com/</link><description>Developer guides to spatial 3D APIs, VR, AR, spatial AI, and game assets.</description><language>en-us</language><lastBuildDate>Mon, 14 Sep 2026 05:48:45 +0000</lastBuildDate><atom:link href="https://spatialapi.com/rss.xml" rel="self" type="application/rss+xml" /><item><title>AR Hit Testing: From a Screen Tap to Stable Object Placement</title><link>https://spatialapi.com/blog/ar-hit-testing/</link><description>Turn geometric candidates into an understandable placement flow with previews, confirmation, adjustment, and recovery.</description><category>Augmented Reality</category><guid isPermaLink="true">https://spatialapi.com/blog/ar-hit-testing/</guid><pubDate>Mon, 10 Aug 2026 09:00:00 -0700</pubDate><content:encoded>&lt;p&gt;&lt;img src="https://spatialapi.com/assets/images/ar-hit-testing-spatialapi.png" width="1200" height="1200" alt="AR Hit Testing: From a Screen Tap to Stable Object Placement"&gt;&lt;/p&gt;&lt;p&gt;Placing a virtual object on a real surface feels like a small interaction: point the phone, tap, and the model appears. Behind that gesture is a sequence of decisions about geometry, coordinate spaces, tracking, and user intent. A convincing AR placement flow makes those decisions visible enough that the user understands both success and uncertainty.&lt;/p&gt;
&lt;p&gt;This guide focuses on hit testing as one part of that flow. It does not treat a detected intersection as proof that a location is suitable or safe. Start with the &lt;a href="https://spatialapi.com/spatial-ar-api/"&gt;spatial AR API hub&lt;/a&gt; for the broader learning path, then use the following design steps to build a more dependable placement experience.&lt;/p&gt;
&lt;h2 id="understand-what-the-hit-test-contributes"&gt;Understand what the hit test contributes&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://www.w3.org/TR/webxr-hit-test-1/"&gt;W3C WebXR Hit Test Module&lt;/a&gt; describes an interface for testing rays against real-world geometry and obtaining results relative to spaces. It is an additional capability around WebXR, not a promise that every immersive environment exposes the same environmental information.&lt;/p&gt;
&lt;p&gt;At the application level, think of the result as a placement candidate. Your interface still needs to decide whether to show a preview, allow confirmation, or ask the user to try another location. A geometric intersection does not carry all the product meaning of “a good place for this object.”&lt;/p&gt;
&lt;p&gt;For a tabletop game, the application might require a sufficiently usable play area. For a wall label, it might need an appropriate orientation. Those rules should be explicit and separate from the mechanism that obtains candidate geometry.&lt;/p&gt;
&lt;h2 id="define-the-interaction-before-the-reticle"&gt;Define the interaction before the reticle&lt;/h2&gt;
&lt;p&gt;Write the intended sequence in user language. A useful starting sequence is scan, aim, preview, confirm, and adjust. Each state should have one clear next action. Do not display a confirmation prompt while the application is still looking for a usable candidate.&lt;/p&gt;
&lt;p&gt;Make the preview visually different from a committed object. Use a labeled outline, a distinct surface treatment, or a visible placement instruction. Do not rely only on red and green. A visitor should understand whether the object is following their aim or already attached to the scene.&lt;/p&gt;
&lt;p&gt;Keep the model's scale understandable during preview. If the application allows resizing, explain whether the preview is life-size or illustrative. A beautiful object at an ambiguous scale can mislead users even when the underlying hit test is technically correct.&lt;/p&gt;
&lt;h2 id="keep-coordinate-conversions-in-one-place"&gt;Keep coordinate conversions in one place&lt;/h2&gt;
&lt;p&gt;A placement result and your scene object may not use the same parent space. Create a clear conversion boundary rather than applying ad hoc offsets throughout rendering code. Name the source space, destination space, and transform direction in your implementation notes.&lt;/p&gt;
&lt;p&gt;Use an asymmetric test model with a marked front and top. Place it on different candidate surfaces and check orientation from several viewpoints. This catches cases where the position appears plausible but the object's forward direction or pivot is wrong.&lt;/p&gt;
&lt;p&gt;Avoid correcting a bad import convention by adding unexplained rotation constants to placement code. Fix or document the asset conversion instead. Otherwise, the next model may arrive with a different convention and expose the hidden dependency.&lt;/p&gt;
&lt;h2 id="design-a-useful-not-yet-state"&gt;Design a useful “not yet” state&lt;/h2&gt;
&lt;p&gt;An empty set of usable candidates is a normal state, not an exceptional failure. The interface should explain what the user can do without pretending it knows exactly why geometry is unavailable. A calm instruction to aim at a clear surface is better than a technical error code.&lt;/p&gt;
&lt;p&gt;Do not leave a stale reticle visible indefinitely after the underlying candidate disappears. That can imply confidence the application no longer has. Define how long a preview remains valid and what visual treatment indicates that the user should reacquire a candidate.&lt;/p&gt;
&lt;p&gt;Keep the experience useful when placement never becomes available. A conventional model view, dimensions, or descriptive content can preserve the purpose of a product demonstration. A fallback should support the original task rather than simply announce that AR did not work.&lt;/p&gt;
&lt;h2 id="confirm-an-intentional-placement"&gt;Confirm an intentional placement&lt;/h2&gt;
&lt;p&gt;When the user confirms, make the transition obvious. The preview should stop following the aiming point, and the interface should acknowledge what happened. Provide a clear adjustment or undo path so the user does not need to restart the entire session after a mistaken tap.&lt;/p&gt;
&lt;p&gt;Treat a confirmation as an application event with its own validation. Recheck that a usable candidate still exists and that the task is in the correct state. This protects against rapid taps, delayed input handling, or a candidate disappearing between preview and selection.&lt;/p&gt;
&lt;p&gt;Keep repeated taps from creating unintended duplicate objects. If multiple placements are allowed, make that a deliberate mode. An accidental cluster of identical models is often an interaction-state problem rather than a rendering problem.&lt;/p&gt;
&lt;h2 id="separate-placement-from-ongoing-attachment"&gt;Separate placement from ongoing attachment&lt;/h2&gt;
&lt;p&gt;Finding a placement candidate and maintaining an object's relationship to the environment are different responsibilities. Your architecture should distinguish the initial placement transform from whatever mechanism keeps the committed object associated with the tracked scene.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://spatialapi.com/blog/spatial-anchors/"&gt;spatial anchors guide&lt;/a&gt; develops that second responsibility. For the placement flow, define the handoff: what information is retained, when the preview is removed, and what the user sees if the attachment step cannot be completed.&lt;/p&gt;
&lt;p&gt;Avoid promising permanent or cross-device placement merely because the object remains still during a short local test. Persistence, sharing, and relocalization introduce additional requirements. Describe only the behavior that your implementation has actually verified.&lt;/p&gt;
&lt;h2 id="work-through-a-tabletop-example"&gt;Work through a tabletop example&lt;/h2&gt;
&lt;p&gt;Imagine a hypothetical AR board-game preview. The user opens a product page, reads a short explanation, and chooses an AR view. The application begins with a transparent board outline and the instruction to aim at a tabletop.&lt;/p&gt;
&lt;p&gt;When a candidate is available, the outline becomes more defined and a placement action appears. On confirmation, the board remains at the selected location while the user can inspect it. A separate “place again” action returns to preview rather than adding another board by accident.&lt;/p&gt;
&lt;p&gt;This example is intentionally modest. It does not require a complicated inventory, multiplayer synchronization, or advanced game logic to test whether placement makes sense. Establish that interaction first, then introduce the additional features one by one.&lt;/p&gt;
&lt;h3 id="decide-what-counts-as-a-successful-test"&gt;Decide what counts as a successful test&lt;/h3&gt;
&lt;p&gt;A successful placement test should include more than a screenshot. Ask whether a new user knew when to confirm, understood the model's scale, could undo a mistake, and could recover when the candidate disappeared. These observations tell you whether the geometry has been translated into an understandable experience.&lt;/p&gt;
&lt;h2 id="test-the-messy-transitions"&gt;Test the messy transitions&lt;/h2&gt;
&lt;p&gt;Build a test script that moves through candidate acquisition, candidate loss, confirmation, repositioning, and session exit. Try a quick tap during a transition. Try returning to the page after an interruption. Keep the script short enough to repeat after every significant change.&lt;/p&gt;
&lt;p&gt;Use a small set of controlled environments and record their conditions. Then add less predictable real-world trials. Separate observations about geometric stability from observations about instructions and controls; both matter, but they require different fixes.&lt;/p&gt;
&lt;p&gt;When a test fails, record the state transition and the expected outcome. “Placement feels broken” is difficult to act on. “The confirm action remains enabled after the preview loses its candidate” gives a developer a reproducible behavior to investigate.&lt;/p&gt;
&lt;h2 id="questions-that-come-up-in-implementation"&gt;Questions that come up in implementation&lt;/h2&gt;
&lt;h3 id="is-hit-testing-the-same-as-object-recognition"&gt;Is hit testing the same as object recognition?&lt;/h3&gt;
&lt;p&gt;No. In this workflow, hit testing supplies geometric placement candidates. Recognizing what a surface or object represents is a separate problem. Do not label a candidate “table” merely because its orientation looks convenient for your application.&lt;/p&gt;
&lt;h3 id="should-every-tap-place-content-immediately"&gt;Should every tap place content immediately?&lt;/h3&gt;
&lt;p&gt;Not necessarily. An explicit preview and confirmation can be easier to understand, especially when scale or orientation matters. Choose the interaction based on the task and test it with unfamiliar users rather than assuming fewer taps always means a better experience.&lt;/p&gt;
&lt;h2 id="conclusion-build-the-whole-placement-conversation"&gt;Conclusion: build the whole placement conversation&lt;/h2&gt;
&lt;p&gt;Good AR hit testing is not just obtaining a transform. It is the complete conversation between candidate geometry and user intent: look, preview, confirm, adjust, and recover. Keep uncertain states visible, coordinate conversions explicit, and duplicate actions controlled.&lt;/p&gt;
&lt;p&gt;Once that conversation works, add the visual details that make the object feel present. Continue with the &lt;a href="https://spatialapi.com/blog/depth-and-occlusion/"&gt;depth and occlusion guide&lt;/a&gt; to consider how real objects can affect the appearance of virtual content without confusing geometric evidence with certainty.&lt;/p&gt;
</content:encoded></item><item><title>OpenXR vs WebXR: Choose the Right Layer for Your Spatial App</title><link>https://spatialapi.com/blog/openxr-vs-webxr/</link><description>Compare distribution, required features, rendering choices, and maintenance before choosing an XR application architecture.</description><category>Virtual Reality</category><guid isPermaLink="true">https://spatialapi.com/blog/openxr-vs-webxr/</guid><pubDate>Fri, 22 May 2026 09:00:00 -0700</pubDate><content:encoded>&lt;p&gt;&lt;img src="https://spatialapi.com/assets/images/openxr-vs-webxr-spatialapi.png" width="1200" height="1200" alt="OpenXR vs WebXR: Choose the Right Layer for Your Spatial App"&gt;&lt;/p&gt;&lt;p&gt;OpenXR and WebXR appear in many of the same conversations, but treating them as interchangeable tools creates confusion. A team can spend days debating the wrong question when its actual constraint is distribution, a required hardware feature, or an existing application architecture. The right decision begins with the product you need to deliver.&lt;/p&gt;
&lt;p&gt;This guide offers a project-level comparison rather than a winner. It separates the role of an XR interface from the choices surrounding rendering, assets, deployment, and support. Visit the &lt;a href="https://spatialapi.com/spatial-vr-api/"&gt;VR API topic hub&lt;/a&gt; for related guides, then turn the sections below into a short decision record for your team.&lt;/p&gt;
&lt;h2 id="start-with-the-layer-each-name-describes"&gt;Start with the layer each name describes&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://www.khronos.org/openxr/"&gt;Khronos OpenXR overview&lt;/a&gt; describes an open, royalty-free standard for accessing XR platforms and devices through a common API. Its portability goal concerns the interface between applications and XR runtimes. It does not eliminate the need to validate the features, extensions, and deployment requirements of a particular project.&lt;/p&gt;
&lt;p&gt;WebXR belongs to the web application's immersive-device interface. For the browser workflow, the important practical questions include how a visitor reaches the page, how immersive mode begins, and what remains available outside a session. Our &lt;a href="https://spatialapi.com/blog/webxr-vr-starter/"&gt;WebXR starter guide&lt;/a&gt; develops that lifecycle in more detail.&lt;/p&gt;
&lt;p&gt;Neither name is a complete product stack. You still need to decide how content is authored, how the scene is rendered, what users do, and how failures are handled. Avoid comparing a minimal interface on one side with an entire engine, hosting service, and content pipeline on the other.&lt;/p&gt;
&lt;h2 id="write-the-distribution-story-first"&gt;Write the distribution story first&lt;/h2&gt;
&lt;p&gt;Imagine two hypothetical projects. One is a short museum preview reached from a public link. The other is a managed training application deployed to a controlled fleet of devices. Their distribution stories are different even when both show the same machine model.&lt;/p&gt;
&lt;p&gt;For the public preview, evaluate the ordinary web page as part of the product. Can a visitor learn something without entering XR? Can the page explain unsupported features? How does a link shared in a message behave? Those questions may make a browser-first architecture attractive, but they are not a substitute for device testing.&lt;/p&gt;
&lt;p&gt;For managed training, evaluate installation, update control, offline requirements, and support procedures. A packaged application may fit that operating model. The conclusion should follow from deployment constraints rather than a blanket claim that one API is better for all serious applications.&lt;/p&gt;
&lt;h2 id="identify-the-non-negotiable-features"&gt;Identify the non-negotiable features&lt;/h2&gt;
&lt;p&gt;Create a short requirements table in your project notes. Name the feature, explain the user task it enables, mark whether it is required, and record the evidence that it works on your intended environment. Avoid entries such as “advanced tracking” that are too vague to test.&lt;/p&gt;
&lt;p&gt;A useful requirement might be “the user can select the labeled valve using the supported controller.” Another might concern environmental understanding or a particular interaction method. Express the result in user terms before mapping it to an API capability or extension.&lt;/p&gt;
&lt;p&gt;Prototype the riskiest requirement first. A working demonstration of an essential feature on the actual deployment setup is more valuable than a broad compatibility chart that nobody has verified for your application. Keep a fallback decision beside every optional feature.&lt;/p&gt;
&lt;h2 id="compare-development-effort-honestly"&gt;Compare development effort honestly&lt;/h2&gt;
&lt;p&gt;Your team's existing skills and codebase matter. A browser team may already have navigation, content delivery, and accessibility practices that suit a web experience. A team with an established engine project may already have tooling, assets, and device integration suited to a packaged application.&lt;/p&gt;
&lt;p&gt;Do not count only the first prototype. Include testing, release management, content updates, diagnostics, and support. A fast initial implementation can become expensive when every content revision requires an awkward handoff or when failures cannot be reproduced by the support team.&lt;/p&gt;
&lt;p&gt;Separate reusable work from platform-specific work. Scene identifiers, instructional content, asset validation rules, and task state may be shared even when rendering or device access differs. A clear shared core reduces the cost of changing your deployment strategy later.&lt;/p&gt;
&lt;h2 id="keep-rendering-separate-from-device-access"&gt;Keep rendering separate from device access&lt;/h2&gt;
&lt;p&gt;The choice of XR interface does not, by itself, settle the renderer. When discussing a stack, name both. Otherwise, a performance observation about one renderer may be incorrectly attributed to the XR interface, and a tooling preference may masquerade as a portability requirement.&lt;/p&gt;
&lt;p&gt;Build a representative scene with the content features you actually need. Include the materials, animation, labels, and selection behavior that define the task. A spinning cube can verify a connection, but it cannot answer whether the full training scene is maintainable or comfortable to use.&lt;/p&gt;
&lt;p&gt;Measure the same user journey across prototypes. Compare time to useful interaction, task completion, interruptions, and recovery. Keep environmental differences in the test report. A comparison is only informative when the reader can see what was held constant and what changed.&lt;/p&gt;
&lt;h2 id="treat-portability-as-a-test-plan"&gt;Treat portability as a test plan&lt;/h2&gt;
&lt;p&gt;Portability is not a sentence that ends with “supports XR.” Name the environments you intend to support and the behaviors you expect in each. Record which capabilities are essential and which can degrade gracefully.&lt;/p&gt;
&lt;p&gt;For every target, test entry, input, scene placement, suspension, exit, and content loading. Add a check for unavailable optional features. A platform can support the main interface while differing in the particular feature that makes your application useful.&lt;/p&gt;
&lt;p&gt;Keep a small compatibility fixture scene separate from the full experience. It should exercise the actions and data paths your project depends on. When a runtime, browser, engine, or device changes, the fixture gives you a quick way to isolate a platform issue from a content regression.&lt;/p&gt;
&lt;h2 id="plan-content-delivery-independently"&gt;Plan content delivery independently&lt;/h2&gt;
&lt;p&gt;Both deployment approaches benefit from explicit asset revisions and a repeatable handoff. Do not make the source of truth an artist's current export folder. Use a manifest that identifies the intended scene and the assets that belong to it.&lt;/p&gt;
&lt;p&gt;Decide which updates can occur independently and which need an application release. A text correction is different from changing a required interaction component. Document those boundaries so a content editor cannot accidentally publish a scene that depends on code users do not have.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://spatialapi.com/blog/game-asset-pipeline/"&gt;spatial game asset pipeline guide&lt;/a&gt; describes a practical validation and release workflow. Its central lesson applies regardless of the XR interface: repeatability is part of the product, not just a build-system preference.&lt;/p&gt;
&lt;h2 id="two-example-decision-records"&gt;Two example decision records&lt;/h2&gt;
&lt;h3 id="a-public-product-demonstration"&gt;A public product demonstration&lt;/h3&gt;
&lt;p&gt;For a hypothetical product demonstration, the team prioritizes access from a link and a useful non-immersive viewer. Its first experiment should therefore test the browser journey on the intended audience's environments. The record should also state which immersive features are optional and how the demonstration works without them.&lt;/p&gt;
&lt;p&gt;That is a reasoned starting point, not a guarantee of universal browser support. The team still needs evidence about loading, interaction, and session behavior before describing its compatibility publicly.&lt;/p&gt;
&lt;h3 id="a-controlled-instructional-deployment"&gt;A controlled instructional deployment&lt;/h3&gt;
&lt;p&gt;For a hypothetical training deployment, the team prioritizes controlled hardware, a known update process, and a specific input feature. Its first experiment should validate that feature within the intended runtime and application stack. The decision record should include operational support and recovery, not only visual quality.&lt;/p&gt;
&lt;p&gt;A later browser companion can still share documentation, task descriptions, or asset metadata. Choosing one delivery path for the immersive component does not require every related surface to use the same technology.&lt;/p&gt;
&lt;h2 id="conclusion-choose-the-operating-model"&gt;Conclusion: choose the operating model&lt;/h2&gt;
&lt;p&gt;OpenXR versus WebXR is most useful as a question about application boundaries and delivery. Start with the task, distribution model, required capabilities, and maintenance plan. Then test the risky assumptions on representative environments.&lt;/p&gt;
&lt;p&gt;Keep the resulting decision short enough to revisit. Record why the choice fits today and what evidence would justify changing it. A documented tradeoff gives a team more flexibility than an unsupported declaration that one spatial API is always the future.&lt;/p&gt;
</content:encoded></item><item><title>Build a WebXR VR Starter That Completes the Whole Journey</title><link>https://spatialapi.com/blog/webxr-vr-starter/</link><description>Plan browser support, deliberate session entry, clear interactions, recovery, and a useful non-immersive experience.</description><category>Virtual Reality</category><guid isPermaLink="true">https://spatialapi.com/blog/webxr-vr-starter/</guid><pubDate>Fri, 23 Jan 2026 09:00:00 -0700</pubDate><content:encoded>&lt;p&gt;&lt;img src="https://spatialapi.com/assets/images/webxr-vr-starter-spatialapi.png" width="1200" height="1200" alt="Build a WebXR VR Starter That Completes the Whole Journey"&gt;&lt;/p&gt;&lt;p&gt;The most useful first WebXR VR project is not a sprawling virtual world. It is a small scene that enters cleanly, communicates what the user can do, and exits without losing the surrounding page. A polished starter teaches the lifecycle of an immersive application while keeping content and device complexity under control.&lt;/p&gt;
&lt;p&gt;This guide outlines a development sequence for a browser-based VR prototype. The goal is an experience you can explain, test, and extend, not a promise that every browser or headset supports the same features. Use the &lt;a href="https://spatialapi.com/spatial-vr-api/"&gt;spatial VR API hub&lt;/a&gt; to connect this workflow to the broader architecture choices.&lt;/p&gt;
&lt;h2 id="define-one-task-before-choosing-a-scene"&gt;Define one task before choosing a scene&lt;/h2&gt;
&lt;p&gt;Pick an action that can be completed without artificial walking. A user might inspect an object, select a labeled hotspot, or compare two assemblies. Write the completion condition in ordinary language. “The user selects the correct component and sees an explanation” is more useful than “the scene feels immersive.”&lt;/p&gt;
&lt;p&gt;Keep the first scene deliberately small. Use one central object, a calm environment, and one clear instruction. Additional rooms and dramatic effects create more places for lifecycle and interaction problems to hide. A small prototype is not merely faster to build; it gives you a clearer account of why the task succeeds or fails.&lt;/p&gt;
&lt;h2 id="treat-browser-support-as-a-question"&gt;Treat browser support as a question&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://immersiveweb.dev/"&gt;Immersive Web developer resource&lt;/a&gt; introduces WebXR as a route to immersive experiences on the web and provides learning resources and examples. Browser, runtime, and device combinations still need to be checked in the environment where the application will run. A platform name alone is not a sufficient test result.&lt;/p&gt;
&lt;p&gt;For the starter, show an ordinary page first. Include the task description, a visual preview, and a meaningful non-immersive path. When immersive support is not available, the visitor should still understand the content rather than encounter a disabled page with no explanation.&lt;/p&gt;
&lt;p&gt;Keep capability detection separate from entering a session. Checking availability should not be presented as a successful hardware test, and a positive result should not remove error handling from the entry action. A device can become unavailable between those steps, so the interface needs a recoverable failure state.&lt;/p&gt;
&lt;h2 id="make-the-entry-action-a-real-transition"&gt;Make the entry action a real transition&lt;/h2&gt;
&lt;p&gt;Entering VR should follow a deliberate action with an understandable label. Explain what the session will contain before the transition. Avoid vague labels such as “launch experience” when a more concrete phrase, such as “inspect the engine in VR,” tells the user what to expect.&lt;/p&gt;
&lt;p&gt;Use a small state model: ready, entering, active, exiting, and failed. Disable duplicate entry attempts while the transition is in progress. On failure, return the interface to a state where the user can retry or continue on the ordinary page. A transient failure should not require reloading the entire website.&lt;/p&gt;
&lt;p&gt;When the session ends, restore a sensible place in the document. The person may have completed the task or may have left because something was uncomfortable or confusing. In either case, they should be able to read the result, adjust the experience, or move on without searching for their previous position.&lt;/p&gt;
&lt;h2 id="give-scene-coordinates-a-clear-owner"&gt;Give scene coordinates a clear owner&lt;/h2&gt;
&lt;p&gt;Do not scatter world-placement assumptions through interaction code. Define a scene origin, a content root, and the intended relationship between the user and the first object. Keep the model’s authoring pivot distinct from the application's placement transform so the asset can be replaced without rewriting the whole scene.&lt;/p&gt;
&lt;p&gt;Build a test scene with an obvious floor reference and a labeled orientation marker. Review it from different heights and viewpoints. A scene that looks correct in a desktop camera preview can still put an important label behind the person or leave a control outside comfortable reach.&lt;/p&gt;
&lt;p&gt;Document whether the experience is intended for seated use, standing use, or both. Treat these as interaction requirements rather than visual presets. The same task may need different object positions or selection methods to remain usable across those situations.&lt;/p&gt;
&lt;h2 id="map-intentions-instead-of-controller-names"&gt;Map intentions instead of controller names&lt;/h2&gt;
&lt;p&gt;Write application actions such as select, cancel, inspect, and continue. Then map available input methods to those actions. This keeps the task model understandable when a device uses a different controller arrangement or when you add an alternative interaction path.&lt;/p&gt;
&lt;p&gt;Make the currently targeted object obvious without relying on color alone. Combine a visible outline or shape change with a readable label. Confirm a completed action using more than a fleeting animation. The user should be able to tell what happened even after the initial feedback has passed.&lt;/p&gt;
&lt;p&gt;For a first prototype, avoid requiring two simultaneous precise gestures. Start with a single selection and an explicit way to reverse it. Complex hand choreography is difficult to debug because a failed action can reflect tracking, timing, discoverability, or an unclear mental model.&lt;/p&gt;
&lt;h2 id="use-a-performance-budget-as-a-design-constraint"&gt;Use a performance budget as a design constraint&lt;/h2&gt;
&lt;p&gt;Choose a representative device early and measure the actual task on it. Do not select a universal polygon allowance from an unrelated demo. Content complexity, materials, transparency, animation, and the surrounding application all influence the practical budget.&lt;/p&gt;
&lt;p&gt;Build a simple baseline, then add one feature at a time. Compare the experience before and after that change. Record the scene revision and test conditions so an apparent improvement is not merely the result of a different environment or a lighter content variant.&lt;/p&gt;
&lt;p&gt;Prepare a reduced-quality version that preserves the task. Removing decorative particles is different from removing the labels required to complete an exercise. A useful quality ladder protects interaction and comprehension first, then spends remaining resources on atmosphere.&lt;/p&gt;
&lt;h2 id="handle-interruptions-without-guessing"&gt;Handle interruptions without guessing&lt;/h2&gt;
&lt;p&gt;Write down what should happen when focus changes, input disappears, or the session ends unexpectedly. Should the exercise pause? Should a selection remain highlighted? Should the user repeat a confirmation after returning? These are product choices, and they deserve explicit answers.&lt;/p&gt;
&lt;p&gt;Keep task state outside temporary rendering objects. An object can be rebuilt while its completion status remains available to the ordinary page. This separation also makes it easier to test the lesson or inspection workflow without launching an immersive session for every small change.&lt;/p&gt;
&lt;p&gt;Create a recovery drill during development. Enter the experience, interrupt it, return, and finish the task. Repeat after changing input methods or reloading a nonessential asset. Recovery should be part of the starter, not an emergency patch near release.&lt;/p&gt;
&lt;h2 id="test-the-explanation-as-carefully-as-the-scene"&gt;Test the explanation as carefully as the scene&lt;/h2&gt;
&lt;p&gt;Ask a new tester to begin without verbal coaching. Observe whether they understand the entry action, identify the interactive object, complete the task, and find the exit. Record where they hesitate rather than explaining away the hesitation as unfamiliarity with VR.&lt;/p&gt;
&lt;p&gt;Use the same short test script across participants so observations are comparable. Then change one confusing element and repeat. A more elaborate environment is rarely the best response to an unclear instruction or an invisible selection state.&lt;/p&gt;
&lt;p&gt;For accessibility planning, continue with &lt;a href="https://spatialapi.com/blog/accessible-xr-design/"&gt;XR beyond the default headset user&lt;/a&gt;. Alternative input and non-immersive content should support the task, not simply decorate a compliance checklist.&lt;/p&gt;
&lt;h2 id="frequently-asked-starter-questions"&gt;Frequently asked starter questions&lt;/h2&gt;
&lt;h3 id="should-the-first-version-include-multiplayer"&gt;Should the first version include multiplayer?&lt;/h3&gt;
&lt;p&gt;Usually, keep the first acceptance test local and deterministic. Shared state introduces questions about ownership, synchronization, and recovery that are easier to answer after a single-user task works. This is a sequencing recommendation, not a claim that multiplayer is inherently unsuitable for the web.&lt;/p&gt;
&lt;h3 id="is-a-support-check-enough-for-release"&gt;Is a support check enough for release?&lt;/h3&gt;
&lt;p&gt;No. Treat it as one input to the interface. Release testing should exercise entry, interaction, interruption, exit, and the fallback path on your stated target environments. Keep the tested combinations in your project records rather than implying universal compatibility.&lt;/p&gt;
&lt;h2 id="conclusion-finish-the-loop"&gt;Conclusion: finish the loop&lt;/h2&gt;
&lt;p&gt;A good WebXR VR starter completes the entire user journey. It explains the task, offers an appropriate entry path, presents clear interactions, survives interruption, and returns to useful content. That complete loop is a better foundation than a larger scene that only works on the developer’s desk.&lt;/p&gt;
&lt;p&gt;After the starter is reliable, compare its distribution and runtime requirements with the &lt;a href="https://spatialapi.com/blog/openxr-vs-webxr/"&gt;OpenXR versus WebXR decision guide&lt;/a&gt;. Choose the next layer because it serves the project, not because a particular acronym sounds more advanced.&lt;/p&gt;
</content:encoded></item><item><title>Depth and Occlusion: Make Virtual Objects Belong in the Real World</title><link>https://spatialapi.com/blog/depth-and-occlusion/</link><description>Use depth evidence thoughtfully, test visual boundaries, and preserve useful interactions when information is missing.</description><category>Augmented Reality</category><guid isPermaLink="true">https://spatialapi.com/blog/depth-and-occlusion/</guid><pubDate>Mon, 17 Nov 2025 09:00:00 -0700</pubDate><content:encoded>&lt;p&gt;&lt;img src="https://spatialapi.com/assets/images/depth-and-occlusion-spatialapi.png" width="1200" height="1200" alt="Depth and Occlusion: Make Virtual Objects Belong in the Real World"&gt;&lt;/p&gt;&lt;p&gt;A virtual object can be perfectly positioned and still look wrong. When it draws over a real chair that should be in front of it, the illusion breaks. Depth and occlusion address that visual relationship, but adding them is not simply a matter of turning on a realism switch.&lt;/p&gt;
&lt;p&gt;A useful implementation must handle missing information, uncertain boundaries, and the interaction between visual effects and task clarity. This guide proposes a development workflow for those decisions. Start with the &lt;a href="https://spatialapi.com/spatial-ar-api/"&gt;spatial AR API hub&lt;/a&gt; and keep the &lt;a href="https://spatialapi.com/spatial-ai-api/"&gt;spatial AI hub&lt;/a&gt; nearby when considering the difference between geometry and semantic understanding.&lt;/p&gt;
&lt;h2 id="distinguish-depth-from-occlusion"&gt;Distinguish depth from occlusion&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://developers.google.com/ar/develop/depth"&gt;ARCore Depth API overview&lt;/a&gt; describes depth images as information about the size and shape of real objects and discusses uses including occlusion and interaction. Occlusion is an application of that information: virtual content is rendered so nearer real surfaces can hide parts of it.&lt;/p&gt;
&lt;p&gt;For design purposes, keep the evidence separate from the effect. A depth estimate is input. The visual decision about whether to hide a virtual fragment is output. That distinction gives you somewhere to inspect errors instead of treating the final image as an unexplained result.&lt;/p&gt;
&lt;p&gt;Do not infer object meaning from distance alone. A nearer region may affect rendering without telling your application whether it is a chair, a person, or a temporary obstruction. Semantic labels and geometric evidence answer different questions.&lt;/p&gt;
&lt;h2 id="begin-with-a-scene-that-exposes-mistakes"&gt;Begin with a scene that exposes mistakes&lt;/h2&gt;
&lt;p&gt;Choose a simple virtual object with a clear silhouette and place it near a real object with an obvious boundary. Avoid starting with transparent materials, particles, or complex shadows. Those effects can make it hard to determine whether a visual problem comes from depth handling or from the material itself.&lt;/p&gt;
&lt;p&gt;Create a development mode that alternates between the normal view, a depth visualization, and a no-occlusion view. The comparison should be easy to trigger during testing. It helps a developer see whether an object vanished because of the mask or because it was never rendered correctly.&lt;/p&gt;
&lt;p&gt;Keep the test asset and placement repeatable. A controlled fixture does not replace real-world trials, but it gives you a baseline when a renderer, content asset, or preprocessing step changes.&lt;/p&gt;
&lt;h2 id="align-the-data-before-tuning-the-effect"&gt;Align the data before tuning the effect&lt;/h2&gt;
&lt;p&gt;Check that the depth information and the rendered view refer to the intended perspective, timing, and coordinates. Write down the transformations involved. A small alignment error can look like a bad threshold even when the actual problem is that the two inputs do not correspond.&lt;/p&gt;
&lt;p&gt;Use a diagnostic overlay with simple edges or a conspicuous boundary. Move the viewpoint and observe whether the relationship stays consistent. Test both a stationary view and motion. The goal is not to produce a flattering screenshot; it is to expose disagreement between the inputs.&lt;/p&gt;
&lt;p&gt;Do not compensate for a structural mismatch by applying increasingly complicated smoothing. First verify the conventions and the path from source data to the renderer. Tuning is easier when the underlying comparison is meaningful.&lt;/p&gt;
&lt;h2 id="define-behavior-for-missing-information"&gt;Define behavior for missing information&lt;/h2&gt;
&lt;p&gt;A missing or unusable depth sample needs an explicit policy. Your application might render the virtual content without environmental occlusion, fade a preview, or temporarily suspend a precision-dependent action. The right choice depends on the task, not on a universal rule.&lt;/p&gt;
&lt;p&gt;For a decorative scene, a graceful visual fallback may be sufficient. For an instruction that relies on identifying a specific physical relationship, continuing with an apparently precise overlay could be misleading. Separate these cases in the design document.&lt;/p&gt;
&lt;p&gt;Make the fallback consistent. A user should not see an unexplained sequence of disappearing and reappearing content as individual samples fluctuate. At the same time, avoid hiding uncertainty behind a stable-looking image that suggests more reliable knowledge than the system has.&lt;/p&gt;
&lt;h2 id="treat-boundary-quality-as-a-product-decision"&gt;Treat boundary quality as a product decision&lt;/h2&gt;
&lt;p&gt;Most attention naturally goes to the edges where virtual and real content meet. Test thin objects, moving obstructions, and partial overlap as distinct cases. Record what a tester notices and whether it interferes with the task.&lt;/p&gt;
&lt;p&gt;A slightly imperfect decorative boundary may be acceptable in a playful scene. The same defect may make a technical annotation confusing. Define an acceptance criterion in terms of readability and task completion, not simply whether a screenshot looks impressive.&lt;/p&gt;
&lt;p&gt;When evaluating visual filtering, compare several controlled cases rather than tuning to one favorite view. A change that improves one edge can create lag or loss of detail elsewhere. Keep before-and-after captures linked to the exact content and settings used.&lt;/p&gt;
&lt;h2 id="preserve-the-readability-of-important-content"&gt;Preserve the readability of important content&lt;/h2&gt;
&lt;p&gt;Not every interface element should be treated like a physical object inside the scene. A critical instruction may need a stable presentation layer or an alternative text location so the user can still understand the task when scene content is obscured.&lt;/p&gt;
&lt;p&gt;Distinguish world-attached labels from application controls. Then decide which may be hidden by the environment, which should remain available, and how the user can recover a lost label. These rules should be deliberate and visible in the interaction design.&lt;/p&gt;
&lt;p&gt;For example, a virtual exhibit may use realistic occlusion for a decorative model while keeping a clearly separate instruction panel available. That separation avoids forcing the user to hunt for basic controls behind real-world objects.&lt;/p&gt;
&lt;h2 id="measure-the-whole-rendering-change"&gt;Measure the whole rendering change&lt;/h2&gt;
&lt;p&gt;Introducing depth handling changes more than the final appearance. Evaluate the full experience after adding the feature: loading, preparation, rendering, interaction, and sustained use on representative hardware. Do not assume an effect is free because its code is short.&lt;/p&gt;
&lt;p&gt;Build quality tiers that preserve the task. A simpler mask or a non-occluded fallback may be preferable to an experience that becomes difficult to interact with. Keep the selection of a tier explicit so a tester can identify which path was active.&lt;/p&gt;
&lt;p&gt;Record measurements with scene and device context. Avoid publishing universal performance claims based on a single scene. Your purpose during development is to find a reliable operating envelope for the application you actually intend to ship.&lt;/p&gt;
&lt;h2 id="use-a-room-scale-test-script"&gt;Use a room-scale test script&lt;/h2&gt;
&lt;p&gt;Write a repeatable sequence: acquire the scene, place the test object, move around it, introduce an obstruction, remove it, interrupt the experience, and return. Keep observations about geometry, visual stability, and instructions in separate columns.&lt;/p&gt;
&lt;p&gt;Then vary one environmental condition at a time where practical. This makes a failure easier to interpret. If the camera path, lighting, object arrangement, and asset all change together, an apparent improvement tells you very little.&lt;/p&gt;
&lt;p&gt;Do not describe the result as a safety assessment. A visual depth effect is not evidence that an application can reliably identify hazards or guide a person through an environment. Keep the feature's purpose bounded to the tested visual and interaction task.&lt;/p&gt;
&lt;h2 id="questions-to-resolve-before-release"&gt;Questions to resolve before release&lt;/h2&gt;
&lt;h3 id="does-depth-automatically-recognize-objects"&gt;Does depth automatically recognize objects?&lt;/h3&gt;
&lt;p&gt;No. Distance-related information and semantic recognition are separate inputs. A visual occlusion effect can be useful without naming the obstructing object. When object categories matter, evaluate a suitable scene-understanding approach separately and account for its uncertainty.&lt;/p&gt;
&lt;h3 id="should-occlusion-always-be-enabled"&gt;Should occlusion always be enabled?&lt;/h3&gt;
&lt;p&gt;Use it when it improves the intended experience and can be supported with a meaningful fallback. A complex effect that hides essential information or creates unstable transitions may make the task worse. Compare the complete user journey with and without it rather than treating realism as the only goal.&lt;/p&gt;
&lt;h2 id="conclusion-make-depth-useful-not-merely-impressive"&gt;Conclusion: make depth useful, not merely impressive&lt;/h2&gt;
&lt;p&gt;Depth becomes valuable when its evidence is aligned, its uncertainty is handled, and its visual consequences support the task. Start with a controlled fixture, define missing-data behavior, and protect important instructions from disappearing without explanation.&lt;/p&gt;
&lt;p&gt;The next step is the &lt;a href="https://spatialapi.com/blog/spatial-ai-scene-understanding/"&gt;spatial AI scene-understanding guide&lt;/a&gt;. It explores how semantic predictions can complement geometry while preserving the distinction between what the system measures, what it infers, and what the application is justified in doing.&lt;/p&gt;
</content:encoded></item><item><title>Spatial 3D APIs: A Practical Guide to Scenes, Spaces, and Data</title><link>https://spatialapi.com/blog/spatial-3d-api-guide/</link><description>Build clearer 3D data contracts with named coordinate spaces, durable object identities, and a testable scene-loading workflow.</description><category>3D Foundations</category><guid isPermaLink="true">https://spatialapi.com/blog/spatial-3d-api-guide/</guid><pubDate>Sun, 14 Sep 2025 09:00:00 -0700</pubDate><content:encoded>&lt;p&gt;&lt;img src="https://spatialapi.com/assets/images/spatial-3d-api-guide-spatialapi.png" width="1200" height="1200" alt="Spatial 3D APIs: A Practical Guide to Scenes, Spaces, and Data"&gt;&lt;/p&gt;&lt;p&gt;A spatial 3D API connects an application to information that has position, orientation, scale, or shape. That sounds simple until a model arrives sideways, a virtual chair appears enormous, or two clients disagree about where an object belongs. The challenge is rarely drawing the first triangle. It is making the meaning of three-dimensional data survive every boundary between tools, services, and devices.&lt;/p&gt;
&lt;p&gt;This guide proposes a practical architecture for that problem. Treat it as a design worksheet, not a specification for a hosted SpatialAPI.com endpoint. Start with the &lt;a href="https://spatialapi.com/spatial-3d-api/"&gt;3D API topic hub&lt;/a&gt; for the learning path, then use the questions below to define a small, testable contract before adding immersive features.&lt;/p&gt;
&lt;h2 id="separate-the-three-meanings-of-spatial-api"&gt;Separate the three meanings of “spatial API”&lt;/h2&gt;
&lt;p&gt;Teams often use the same phrase for three different layers. A rendering interface creates and displays a scene. A tracking interface describes a device or input source relative to a reference space. A content interface supplies assets, metadata, and application state. A system may need all three, but one should not silently substitute for another.&lt;/p&gt;
&lt;p&gt;For example, downloading a model does not tell an application where a physical table is. Receiving a tracked pose does not tell a renderer which material belongs on an object. Keeping these boundaries explicit makes failures easier to diagnose. Ask which layer owns each decision, what its inputs mean, and what the application does when the layer is unavailable.&lt;/p&gt;
&lt;h2 id="begin-with-a-coordinate-contract"&gt;Begin with a coordinate contract&lt;/h2&gt;
&lt;p&gt;Write down the meaning of one unit, the axis directions, and the origin before exchanging positions. A coordinate without a named space is incomplete. The same numerical position can describe a point relative to a camera, a room, an object, or a map. Those interpretations are not interchangeable.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://www.w3.org/TR/webxr/"&gt;WebXR Device API specification&lt;/a&gt; defines poses relative to spaces and provides reference-space interfaces for immersive applications. That distinction is useful even outside WebXR: carry the reference-space identity alongside spatial values rather than asking another component to infer it.&lt;/p&gt;
&lt;p&gt;For your own data model, make a deliberate choice about units and document it. A furniture prototype might use meters internally and convert measurements at the import boundary. Keep the original dimensions in an audit record so a developer can distinguish a bad conversion from a correctly imported but incorrectly authored asset.&lt;/p&gt;
&lt;h3 id="test-a-deliberately-asymmetric-object"&gt;Test a deliberately asymmetric object&lt;/h3&gt;
&lt;p&gt;A cube is a poor first orientation test because its sides look alike. Use a model with a labeled front, a visibly different top, and an off-center marker. Move it along each axis and rotate it around a known pivot. This simple fixture exposes swapped axes, mirrored transforms, and incorrect rotation order before attractive artwork hides the mistakes.&lt;/p&gt;
&lt;h2 id="define-scene-identity-independently-of-geometry"&gt;Define scene identity independently of geometry&lt;/h2&gt;
&lt;p&gt;A scene object needs an identity that survives a visual revision. Suppose a training room contains an emergency switch. Replacing its mesh should not erase its instructional text, permissions, or completion state. Use one application identifier for the switch and another versioned reference for the visual asset.&lt;/p&gt;
&lt;p&gt;Consider keeping transform data, asset references, and behavior configuration as separate fields. This makes a change easier to review: a content update can replace geometry without unexpectedly moving an object. It also supports a useful debugging question: did the object change, did its appearance change, or did the coordinate frame change?&lt;/p&gt;
&lt;p&gt;Avoid putting every property into a single unstructured metadata blob. Flexible metadata has a place, but core application behavior should depend on fields whose meaning and allowed values are clear. Unknown decorative properties may be ignored; unknown collision or interaction requirements should trigger an explicit decision.&lt;/p&gt;
&lt;h2 id="make-loading-a-visible-part-of-the-experience"&gt;Make loading a visible part of the experience&lt;/h2&gt;
&lt;p&gt;Plan for at least four user-visible states: waiting, usable, degraded, and unavailable. A model can be usable before every optional texture is ready. Conversely, a network request can finish while the experience remains unusable because parsing or preparation has failed. Model those differences instead of showing an indefinite spinner.&lt;/p&gt;
&lt;p&gt;For a product viewer, a useful fallback is a labeled still image with dimensions and a retry action. For a training exercise, continuing without an essential control might be misleading. Classify each asset by whether the task depends on it. Then define what happens when that asset fails independently of the others.&lt;/p&gt;
&lt;p&gt;Do not claim a loading percentage represents the whole experience unless its denominator is meaningful. A phase label such as “preparing the model” can be more honest than a precise-looking number. Record the time to the first useful interaction as well as the time to finish optional downloads.&lt;/p&gt;
&lt;h2 id="design-an-api-response-for-questions-not-decoration"&gt;Design an API response for questions, not decoration&lt;/h2&gt;
&lt;p&gt;Before inventing endpoints, list what the client needs to decide. Which scene revision should it load? Which asset variant fits the selected quality level? What are the bounds? Can this object be selected? What text explains it without the visual model? Those questions suggest a smaller and more stable response than exporting every authoring-tool property.&lt;/p&gt;
&lt;p&gt;In a hypothetical scene manifest, include a schema version, scene identifier, named coordinate space, unit convention, asset list, and object list. Give optional features explicit defaults. Make required fields easy to validate. Treat examples as examples rather than publishing a fictional production endpoint that readers could mistake for a working service.&lt;/p&gt;
&lt;p&gt;Versioning should reflect meaning, not only field names. Changing the unit from centimeters to meters while keeping the same JSON shape is still a breaking change. Include a migration test that loads an older fixture and compares the resulting placement against a known reference scene.&lt;/p&gt;
&lt;h2 id="keep-the-smallest-prototype-observable"&gt;Keep the smallest prototype observable&lt;/h2&gt;
&lt;p&gt;Your first prototype should answer one end-to-end question: can an identified object arrive, appear at the intended size and orientation, and respond to one interaction? Use a neutral scene and simple lighting so unrelated art decisions do not complicate that answer.&lt;/p&gt;
&lt;p&gt;Capture a compact diagnostic record containing the scene revision, asset revision, selected quality tier, load outcome, and relevant error category. Avoid collecting raw camera imagery or continuous movement traces merely because they might be useful later. Operational visibility can begin with task-level events and synthetic fixtures.&lt;/p&gt;
&lt;p&gt;Add a developer overlay that shows object identifiers and coordinate axes. Keep it separate from the public interface. A readable diagnostic view often saves more time than another layer of abstraction, especially when content authors and application developers need to discuss the same failure.&lt;/p&gt;
&lt;h2 id="choose-boundaries-that-match-your-team"&gt;Choose boundaries that match your team&lt;/h2&gt;
&lt;p&gt;An asset author should be able to validate scale and naming before handing off a model. An application developer should be able to reproduce a load failure without the authoring project. A designer should be able to review instructional text without navigating a giant scene hierarchy. These are useful acceptance criteria for the pipeline itself.&lt;/p&gt;
&lt;p&gt;Define ownership for conversion, validation, hosting, rendering, and interaction. In a small team, one person may own several stages, but the stages should still be named. Otherwise, every defect becomes “a 3D problem,” which makes prioritization and regression testing unnecessarily difficult.&lt;/p&gt;
&lt;h2 id="questions-to-settle-before-implementation"&gt;Questions to settle before implementation&lt;/h2&gt;
&lt;h3 id="does-a-spatial-api-require-a-headset"&gt;Does a spatial API require a headset?&lt;/h3&gt;
&lt;p&gt;Not for the architecture described here. A conventional browser viewer can exercise scene identity, loading, transforms, and object selection. Use that simpler surface to validate data contracts before adding a device-dependent experience. The &lt;a href="https://spatialapi.com/spatial-vr-api/"&gt;VR API guide collection&lt;/a&gt; explains the next layer of decisions.&lt;/p&gt;
&lt;h3 id="should-geometry-live-inside-every-response"&gt;Should geometry live inside every response?&lt;/h3&gt;
&lt;p&gt;Consider separating reusable asset files from scene state. That lets an application refer to a known model revision while changing its placement or instructions independently. Very small examples may combine them for convenience, but the choice should be deliberate rather than accidental.&lt;/p&gt;
&lt;h2 id="conclusion-make-spatial-meaning-explicit"&gt;Conclusion: make spatial meaning explicit&lt;/h2&gt;
&lt;p&gt;A dependable spatial 3D API begins with shared meaning: named spaces, documented units, durable identifiers, and visible failure states. Rendering is one consumer of that meaning, not a replacement for it. Build an asymmetric test object, a small manifest, and one complete interaction before scaling the scene.&lt;/p&gt;
&lt;p&gt;Next, read the &lt;a href="https://spatialapi.com/blog/gltf-glb-assets/"&gt;glTF and GLB delivery guide&lt;/a&gt; to turn the visual side of that contract into a repeatable asset handoff. A modest pipeline that is understandable and testable is a stronger foundation than an impressive scene whose assumptions nobody can explain.&lt;/p&gt;
</content:encoded></item><item><title>Spatial AI APIs: Scene Understanding Without False Certainty</title><link>https://spatialapi.com/blog/spatial-ai-scene-understanding/</link><description>Design scene-understanding features that preserve context, confidence, and the distinction between inference and fact.</description><category>Spatial AI</category><guid isPermaLink="true">https://spatialapi.com/blog/spatial-ai-scene-understanding/</guid><pubDate>Tue, 26 Aug 2025 09:00:00 -0700</pubDate><content:encoded>&lt;p&gt;&lt;img src="https://spatialapi.com/assets/images/spatial-ai-scene-understanding-spatialapi.png" width="1200" height="1200" alt="Spatial AI APIs: Scene Understanding Without False Certainty"&gt;&lt;/p&gt;&lt;p&gt;A spatial AI API becomes useful when it helps an application reason about a scene without pretending that every prediction is a fact. A label, a depth estimate, and a tracked pose can complement one another, but they have different meanings and different failure modes. Combining them carelessly creates confident-looking interfaces built on uncertain evidence.&lt;/p&gt;
&lt;p&gt;This guide proposes a practical contract for scene-understanding features. It is intended for developers planning AR overlays, interactive environments, and spatial tools, not for safety-critical navigation. Begin with the &lt;a href="https://spatialapi.com/spatial-ai-api/"&gt;spatial AI API hub&lt;/a&gt; and use the following workflow to keep observations, predictions, and application actions separate.&lt;/p&gt;
&lt;h2 id="distinguish-three-kinds-of-information"&gt;Distinguish three kinds of information&lt;/h2&gt;
&lt;p&gt;Geometry describes relationships such as position, shape, and distance. Semantics assigns meaning, such as a predicted category for part of an image. Application state records what your product has decided or what a user has confirmed. A robust design does not collapse all three into one field called “understanding.”&lt;/p&gt;
&lt;p&gt;For a concrete example, the &lt;a href="https://developers.google.com/ar/develop/scene-semantics"&gt;ARCore Scene Semantics documentation&lt;/a&gt; describes pixel labels, confidence values, and label prevalence for outdoor scenes. Its documented scope is outdoor use in the device's default portrait orientation, not general indoor room understanding. That limitation matters when choosing a tool for a particular task.&lt;/p&gt;
&lt;p&gt;An application could use an appropriate semantic signal to propose a visual treatment. It should not silently reinterpret a category prediction as verified object identity or as proof that an area is safe to enter.&lt;/p&gt;
&lt;h2 id="define-the-decision-before-collecting-the-data"&gt;Define the decision before collecting the data&lt;/h2&gt;
&lt;p&gt;Write down the smallest decision the feature needs to support. A creative camera effect might ask whether a region is likely to be sky. A placement assistant might need a candidate region and a user confirmation. A general instruction to “understand the environment” is too broad to produce a useful test plan.&lt;/p&gt;
&lt;p&gt;For each decision, identify the inputs, the acceptable uncertainty, and the consequence of being wrong. A decorative recoloring can tolerate different errors than an annotation tied to a specific component. Keep the consequence visible while choosing thresholds and fallback behavior.&lt;/p&gt;
&lt;p&gt;Do not collect every available signal merely because the API exposes it. Start with the minimum information needed for the chosen task. Smaller data flows are easier to debug, explain, and evaluate.&lt;/p&gt;
&lt;h2 id="give-every-observation-a-context"&gt;Give every observation a context&lt;/h2&gt;
&lt;p&gt;For an application-level observation record, consider including the source, timestamp, coordinate-space identifier, predicted category, confidence representation, and validity state. These are proposed design fields, not a universal vendor response format. Adapt them to the actual API and document the meaning of each.&lt;/p&gt;
&lt;p&gt;A timestamp is useful only when the consumer knows what it refers to. Does it describe image capture, processing completion, or receipt by the application? Likewise, a position needs a named frame. A semantically correct label attached to stale geometry can still produce the wrong action.&lt;/p&gt;
&lt;p&gt;Separate “not observed” from “observed as absent.” Those states lead to different decisions. If a signal is unavailable, your interface should not convert the missing value into a confident negative conclusion.&lt;/p&gt;
&lt;h2 id="keep-confidence-honest"&gt;Keep confidence honest&lt;/h2&gt;
&lt;p&gt;Confidence is not a universal probability scale across unrelated models. Before comparing values, understand what the chosen system exposes and how your application has validated it. A convenient number does not automatically justify a precise claim about correctness.&lt;/p&gt;
&lt;p&gt;For your own interface, use confidence to support bounded decisions. You might show a suggestion only after it meets a tested criterion, require confirmation for an important action, or decline to label an uncertain region. Document why that behavior is appropriate for the task.&lt;/p&gt;
&lt;p&gt;Avoid presenting raw confidence percentages to users unless the number has a clear, useful interpretation. A phrase such as “suggested region” can communicate uncertainty more effectively than an impressive-looking decimal that nobody can explain.&lt;/p&gt;
&lt;h2 id="design-for-disagreement-between-signals"&gt;Design for disagreement between signals&lt;/h2&gt;
&lt;p&gt;Suppose a semantic result suggests a useful region while geometric evidence is incomplete. Your application needs a policy for that disagreement. It might retain a visual suggestion but disable placement confirmation, or it might request another observation. The policy should be explicit rather than whichever signal happens to arrive last.&lt;/p&gt;
&lt;p&gt;Keep fusion logic separate from rendering. A visible overlay should consume a decision that can be inspected and tested, not independently combine several asynchronous inputs in an animation callback. This makes it easier to replay a failure without the full device environment.&lt;/p&gt;
&lt;p&gt;Use a small set of recorded or synthetic test cases that deliberately disagree. Include stale data, missing confidence, an unsupported category, and mismatched coordinate-space identifiers. A system that handles these fixtures predictably is easier to trust than one that only succeeds on ideal demonstrations.&lt;/p&gt;
&lt;h2 id="stabilize-the-interface-without-hiding-changes"&gt;Stabilize the interface without hiding changes&lt;/h2&gt;
&lt;p&gt;A rapidly changing prediction can create a flickering interface. Consider a deliberate transition policy: acquire a suggestion, maintain it while evidence remains adequate, and withdraw it when it becomes unreliable. The exact policy should be tested against your task.&lt;/p&gt;
&lt;p&gt;Do not equate visual stability with correctness. Holding a label on screen after its supporting evidence has disappeared can create false confidence. Distinguish a retained user selection from a current model observation in both the data model and the interface.&lt;/p&gt;
&lt;p&gt;Give the user a way to correct a suggestion when the workflow permits it. Preserve that correction as application input, not as proof that the model originally recognized the scene correctly. Keeping provenance clear makes later evaluation more meaningful.&lt;/p&gt;
&lt;h2 id="evaluate-mistakes-by-their-consequences"&gt;Evaluate mistakes by their consequences&lt;/h2&gt;
&lt;p&gt;Build an evaluation set around the actual environments and actions your product supports. Include ordinary failures rather than only attractive examples. Record the expected application behavior, not just the model's output label.&lt;/p&gt;
&lt;p&gt;Separate false suggestions, missed opportunities, unstable transitions, and stale overlays. These categories point to different fixes. A single aggregate success score can hide an error that is rare but particularly disruptive to the user.&lt;/p&gt;
&lt;p&gt;Use task-level review alongside technical measurements. Ask whether the person understood what was suggested, knew how to correct it, and could continue when the feature abstained. A model can improve on a numerical metric while the surrounding interaction becomes less understandable.&lt;/p&gt;
&lt;h2 id="minimize-sensitive-spatial-data"&gt;Minimize sensitive spatial data&lt;/h2&gt;
&lt;p&gt;Scene information can reveal more than a developer intends. Design the flow so the application retains only what the task requires. Prefer short-lived processing and derived task state when raw imagery or detailed spatial traces are unnecessary.&lt;/p&gt;
&lt;p&gt;Write down where processing occurs, what leaves the device, and what is retained. Verify those statements against the actual implementation and service configuration before making public privacy claims. A conceptual architecture diagram is not evidence that a deployment behaves that way.&lt;/p&gt;
&lt;p&gt;Use synthetic or deliberately prepared scenes for routine debugging when possible. Do not turn a tester's personal environment into a default development dataset. This recommendation also improves reproducibility because controlled fixtures can be shared without unrelated private details.&lt;/p&gt;
&lt;h2 id="a-bounded-example-creative-outdoor-overlays"&gt;A bounded example: creative outdoor overlays&lt;/h2&gt;
&lt;p&gt;Imagine a hypothetical visual-effects app that proposes decorative changes to suitable regions in an outdoor scene. The user chooses the effect, reviews the suggestion, and can dismiss it. The application does not provide route guidance, hazard detection, or object identity claims.&lt;/p&gt;
&lt;p&gt;Its acceptance test can focus on whether the suggestion is understandable, whether unsuitable scenes lead to a graceful refusal, and whether the user can recover from an incorrect region. This bounded task is easier to evaluate than a promise that the app “understands the world.”&lt;/p&gt;
&lt;h2 id="conclusion-let-the-application-abstain"&gt;Conclusion: let the application abstain&lt;/h2&gt;
&lt;p&gt;A good spatial AI contract preserves context, uncertainty, and provenance. It distinguishes geometry from semantics, and both from a user's confirmed choice. Most importantly, it gives the application a useful way to decline an action when evidence is insufficient.&lt;/p&gt;
&lt;p&gt;Continue with the &lt;a href="https://spatialapi.com/blog/depth-and-occlusion/"&gt;depth and occlusion guide&lt;/a&gt; for the geometric side of this architecture, or the &lt;a href="https://spatialapi.com/blog/spatial-3d-api-guide/"&gt;3D data-contract guide&lt;/a&gt; to connect observations to named coordinate spaces. The objective is not maximum apparent intelligence. It is behavior that remains understandable when the scene becomes ambiguous.&lt;/p&gt;
</content:encoded></item><item><title>Accessible XR: Design Beyond the Default Headset User</title><link>https://spatialapi.com/blog/accessible-xr-design/</link><description>Make spatial tasks work through more than one input, viewpoint, or sensory channel, from session entry to exit.</description><category>Virtual Reality</category><guid isPermaLink="true">https://spatialapi.com/blog/accessible-xr-design/</guid><pubDate>Sat, 28 Jun 2025 09:00:00 -0700</pubDate><content:encoded>&lt;p&gt;&lt;img src="https://spatialapi.com/assets/images/accessible-xr-design-spatialapi.png" width="1200" height="1200" alt="Accessible XR: Design Beyond the Default Headset User"&gt;&lt;/p&gt;&lt;p&gt;An XR experience should not assume that every person stands comfortably, uses two tracked hands, hears every cue, sees every label, or wants artificial motion. Those assumptions can become hidden requirements long before a team begins an accessibility review. By then, the task itself may depend on an interaction that excludes some of its intended audience.&lt;/p&gt;
&lt;p&gt;Accessible XR design starts by separating the goal from the physical method used to reach it. This guide proposes practical design and testing exercises for that work. Begin with the &lt;a href="https://spatialapi.com/spatial-vr-api/"&gt;spatial VR API hub&lt;/a&gt; and keep a useful non-immersive path in mind throughout development.&lt;/p&gt;
&lt;h2 id="define-the-task-independently-of-the-gesture"&gt;Define the task independently of the gesture&lt;/h2&gt;
&lt;p&gt;Write the outcome without naming a device action. “Choose the correct component” is a task. “Reach above your head and pinch the component with both hands” is one possible implementation. The distinction gives you room to support alternative methods without changing the lesson or product goal.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://www.w3.org/TR/xaur/"&gt;W3C XR Accessibility User Requirements&lt;/a&gt; discusses varied input and output modalities, customization, and challenges around interacting with immersive environments. It is a useful requirements resource, not a certificate that a particular application is accessible. Your actual implementation still needs review and testing with relevant users.&lt;/p&gt;
&lt;p&gt;Create a task map before a gesture map. For each task, list what the user must perceive, decide, and confirm. This exposes places where the experience currently relies on one sensory channel or one physical movement.&lt;/p&gt;
&lt;h2 id="make-entry-and-exit-understandable"&gt;Make entry and exit understandable&lt;/h2&gt;
&lt;p&gt;The ordinary page before immersion is part of the experience. Explain what will happen, what interaction methods are expected, and how the person can leave. Do not hide basic instructions inside the environment that the user has not yet entered.&lt;/p&gt;
&lt;p&gt;Provide an alternative way to access the content when immersion is unnecessary or unavailable. A product's dimensions, a lesson's explanation, or an exhibit's description should not disappear simply because the user cannot use the primary XR path.&lt;/p&gt;
&lt;p&gt;After exit, return focus and task context to a sensible place. A person who leaves to adjust something should not lose their progress or have to rediscover the entry point. Treat exit as a normal transition, not as a failure state.&lt;/p&gt;
&lt;h2 id="support-a-useful-range-of-reach-and-posture"&gt;Support a useful range of reach and posture&lt;/h2&gt;
&lt;p&gt;Review essential controls from seated and standing viewpoints. Place task-critical targets where the intended users can reach or select them without assuming a particular body size or arm movement. Alternative selection should accomplish the same task where feasible.&lt;/p&gt;
&lt;p&gt;Avoid making physical movement the only way to reveal essential information. A label that can only be read by crouching behind an object may be an unnecessary barrier. Offer an inspection view, a repositionable panel, or another route to the same information.&lt;/p&gt;
&lt;p&gt;Separate viewpoint convenience from competitive or instructional meaning. If moving a panel closer does not change the task's purpose, there is little reason to lock it to a difficult position. Make that flexibility part of the design rather than an undocumented workaround.&lt;/p&gt;
&lt;h2 id="communicate-through-more-than-one-channel"&gt;Communicate through more than one channel&lt;/h2&gt;
&lt;p&gt;A sound can enrich confirmation, but the result should remain understandable when sound is unavailable. A color change can highlight a selection, but it should not be the only signal. Combine visual shape, text, or persistent state where those alternatives fit the task.&lt;/p&gt;
&lt;p&gt;Keep instructions available long enough to be used. A brief floating message may vanish before a person has located or read it. Important information should have a stable place or a deliberate way to reopen it.&lt;/p&gt;
&lt;p&gt;When adding captions or text equivalents, review their placement in the actual experience. A technically present caption is not useful if it is behind the user, too difficult to find, or obscured by a virtual object. Accessibility features need interaction design, not merely implementation.&lt;/p&gt;
&lt;h2 id="offer-control-over-motion-and-timing"&gt;Offer control over motion and timing&lt;/h2&gt;
&lt;p&gt;Identify motion that is essential to the task and motion that is decorative. Provide ways to reduce or avoid unnecessary movement. A quieter version of a scene can preserve its meaning without reproducing every animated effect.&lt;/p&gt;
&lt;p&gt;Avoid using a short timer as the only way to confirm a choice unless timing is truly part of the task. Give users enough opportunity to understand instructions and act deliberately. Where a timed challenge is central, consider a practice or untimed mode that explains the same content.&lt;/p&gt;
&lt;p&gt;Make transitions predictable. Sudden movement of the viewpoint, interface, or selected object can make it difficult to maintain context. A clear transition with an explicit user action often serves the task better than a surprise visual flourish.&lt;/p&gt;
&lt;h2 id="design-alternative-input-as-a-first-class-path"&gt;Design alternative input as a first-class path&lt;/h2&gt;
&lt;p&gt;Start from application actions such as select, cancel, continue, and inspect. Map available input methods to those actions. This is easier to maintain than embedding a specific hand gesture directly into every part of the task logic.&lt;/p&gt;
&lt;p&gt;Test an alternative path from beginning to end. Supporting one button press is not sufficient if the next step still requires an unavailable gesture. The whole task must remain navigable, including settings, error messages, and the exit route.&lt;/p&gt;
&lt;p&gt;Keep the current target and action state understandable when input changes. A person should not lose a selection or trigger an accidental confirmation merely because they switch methods. Treat that transition as an explicit scenario in the test plan.&lt;/p&gt;
&lt;h2 id="preserve-meaning-outside-immersion"&gt;Preserve meaning outside immersion&lt;/h2&gt;
&lt;p&gt;A non-immersive companion should carry the content's purpose, not just a promotional screenshot. For a learning experience, include the explanations, key relationships, and an appropriate way to review the outcome. For a product view, include descriptive information that does not depend on manipulating the model.&lt;/p&gt;
&lt;p&gt;Do not promise that every spatial task has an identical flat-screen substitute. Instead, identify which parts can be represented meaningfully and where the alternative differs. Clear expectations are better than declaring equivalence without testing it.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://spatialapi.com/blog/webxr-vr-starter/"&gt;WebXR starter guide&lt;/a&gt; uses the ordinary page as the foundation of the immersive journey. That architecture makes it easier to preserve useful content when device access or the immersive interaction is unsuitable.&lt;/p&gt;
&lt;h2 id="test-complete-journeys-with-relevant-participants"&gt;Test complete journeys with relevant participants&lt;/h2&gt;
&lt;p&gt;Include people whose needs and interaction methods reflect the audience you intend to support. A developer simulating a constraint can reveal obvious problems, but that exercise should not be mistaken for a substitute for informed user participation.&lt;/p&gt;
&lt;p&gt;Use a short task script and observe where users lose context, miss information, or encounter an unavailable action. Ask what they expected to happen. Separate defects in the task design from defects in a particular input implementation so the fixes address the right problem.&lt;/p&gt;
&lt;p&gt;Make the test environment accessible too. Instructions, scheduling, equipment setup, and feedback collection can all create barriers before the product test begins. Plan accommodations with participants rather than making assumptions about what they need.&lt;/p&gt;
&lt;h2 id="turn-findings-into-release-criteria"&gt;Turn findings into release criteria&lt;/h2&gt;
&lt;p&gt;Write acceptance criteria that describe behavior. “The essential explanation can be reopened without completing the timed interaction” is testable. “The scene is inclusive” is an aspiration, not a check.&lt;/p&gt;
&lt;p&gt;Keep a regression set for the alternative journeys you support. Re-run it after changes to input, panel placement, scene motion, or task sequencing. Accessibility can regress when a visual redesign moves a control or when a new transition discards focus.&lt;/p&gt;
&lt;p&gt;Document limitations plainly in the experience's support information. Do not describe a feature as universally accessible because one checklist was completed. Specific, tested capabilities help people decide whether the experience will work for them.&lt;/p&gt;
&lt;h2 id="conclusion-make-the-goal-flexible"&gt;Conclusion: make the goal flexible&lt;/h2&gt;
&lt;p&gt;Accessible XR design keeps the task understandable while allowing different ways to perceive, select, move, and recover. It considers the ordinary page, the immersive session, and the return journey as one product.&lt;/p&gt;
&lt;p&gt;Begin with one complete task and support it through more than one practical path. Then test those paths with the people they are intended to serve. The result is not merely a collection of settings; it is a spatial experience whose essential meaning does not depend on one assumed body, device, or sensory channel.&lt;/p&gt;
</content:encoded></item><item><title>glTF vs GLB: Prepare 3D Models for Reliable Spatial Delivery</title><link>https://spatialapi.com/blog/gltf-glb-assets/</link><description>Check packaging, scale, pivots, materials, dependencies, and the first useful interaction before publishing a 3D model.</description><category>3D Foundations</category><guid isPermaLink="true">https://spatialapi.com/blog/gltf-glb-assets/</guid><pubDate>Sun, 20 Apr 2025 09:00:00 -0700</pubDate><content:encoded>&lt;p&gt;&lt;img src="https://spatialapi.com/assets/images/gltf-glb-assets-spatialapi.png" width="1200" height="1200" alt="glTF vs GLB: Prepare 3D Models for Reliable Spatial Delivery"&gt;&lt;/p&gt;&lt;p&gt;Choosing between glTF and GLB is less important than knowing what your delivery package actually contains. A model can have the expected filename extension and still arrive with missing textures, an awkward pivot, an unsuitable scale, or a material feature the intended viewer does not handle as expected.&lt;/p&gt;
&lt;p&gt;This guide treats the format decision as part of a repeatable asset handoff. The goal is not to declare one extension universally better. It is to make a model predictable from export to first interaction. Start at the &lt;a href="https://spatialapi.com/spatial-3d-api/"&gt;3D API hub&lt;/a&gt; for scene architecture, or the &lt;a href="https://spatialapi.com/spatial-game-assets/"&gt;spatial game assets hub&lt;/a&gt; for the broader content pipeline.&lt;/p&gt;
&lt;h2 id="understand-the-format-and-its-packaging"&gt;Understand the format and its packaging&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html"&gt;Khronos glTF 2.0 specification&lt;/a&gt; describes an API-neutral runtime asset-delivery format for scenes and models. A .gltf asset uses a JSON representation and can reference buffers and images. GLB is a binary container that can package JSON and binary content together. A GLB can still reference external resources, so the extension alone does not prove that a file is self-contained.&lt;/p&gt;
&lt;p&gt;For a delivery decision, inspect the resource graph rather than assuming it. List every dependency the model needs and verify that the intended hosting arrangement supplies it. The practical question is whether the package loads reliably in your target application, not whether the filename sounds more convenient.&lt;/p&gt;
&lt;h2 id="choose-a-handoff-that-fits-the-workflow"&gt;Choose a handoff that fits the workflow&lt;/h2&gt;
&lt;p&gt;A separate-resource package can be useful when your team wants to inspect components independently or reuse some resources across assets. A consolidated package can simplify certain handoffs. Neither arrangement excuses missing dependency checks or an unclear release process.&lt;/p&gt;
&lt;p&gt;Consider who receives the asset. A developer debugging a material issue may benefit from easily inspectable source exports and a clear resource list. A publishing workflow may prefer a single verified delivery artifact. You can retain one arrangement internally and publish another, provided the conversion is reproducible.&lt;/p&gt;
&lt;p&gt;Document the chosen convention. The next person should not have to discover by trial and error whether an export folder, one file, or a manifest defines the release. Ambiguous packaging is a process defect even when the model itself is valid.&lt;/p&gt;
&lt;h2 id="make-scale-and-orientation-acceptance-criteria"&gt;Make scale and orientation acceptance criteria&lt;/h2&gt;
&lt;p&gt;Before reviewing visual polish, verify dimensions, up direction, forward direction, and the pivot. Use a reference object with a known size. A model that looks attractive in an authoring viewport can still be unsuitable for placement when these conventions are unclear.&lt;/p&gt;
&lt;p&gt;For a hypothetical product model, record the expected physical dimensions separately from the geometry. Compare the imported bounds with that record. This lets a reviewer distinguish an authoring error from an import conversion or application-placement error.&lt;/p&gt;
&lt;p&gt;Choose pivots according to the intended interaction. A model that rotates around its visual center has different needs from one placed on a floor or attached to a component. Do not bury a pivot correction inside unrelated application code unless the reason is documented and tested.&lt;/p&gt;
&lt;h2 id="review-materials-under-controlled-lighting"&gt;Review materials under controlled lighting&lt;/h2&gt;
&lt;p&gt;Use a neutral test scene before evaluating the asset inside a dramatic environment. Strong colored lighting can hide missing textures or make two different material mistakes appear equally plausible. Keep a known lighting setup as part of your regression fixtures.&lt;/p&gt;
&lt;p&gt;Compare important surfaces from several viewing angles. Check that transparency, reflective appearance, and normal detail support the intended presentation. Record differences between the export and the target application without assuming the application must reproduce every authoring-tool preview exactly.&lt;/p&gt;
&lt;p&gt;When a material depends on an optional feature or extension, include that requirement in the handoff. Decide what the application should do when it cannot support the feature. A fallback material may be acceptable for decoration but inappropriate when surface appearance is central to the task.&lt;/p&gt;
&lt;h2 id="inspect-the-resource-graph"&gt;Inspect the resource graph&lt;/h2&gt;
&lt;p&gt;Make an inventory of referenced images, buffers, and optional dependencies. Verify filenames with their actual letter case. A package that loads in one development environment can still fail when a deployment treats a path differently or when a resource was never included in the release.&lt;/p&gt;
&lt;p&gt;Test from a clean directory containing only the intended deliverables. This prevents a model from succeeding because the developer's machine happens to contain an untracked texture. The same principle applies when checking an archive before upload.&lt;/p&gt;
&lt;p&gt;Keep asset revisions immutable during a test cycle. Replacing a file at the same path while reviewers compare results makes observations difficult to reproduce. Use a clear revision identifier in the manifest and retain the exact package that was approved.&lt;/p&gt;
&lt;h2 id="optimize-for-the-task-not-a-single-number"&gt;Optimize for the task, not a single number&lt;/h2&gt;
&lt;p&gt;Do not use file size as the only quality metric. Evaluate download cost, preparation time, memory behavior, visual clarity, and the interaction the model supports. A small file is not useful if the required label or component becomes unreadable.&lt;/p&gt;
&lt;p&gt;Start by removing content that the application never uses. Then review geometry density, texture dimensions, duplicate materials, and unnecessary animation. Make one change at a time and compare against a reference capture or task-based acceptance test.&lt;/p&gt;
&lt;p&gt;Create quality variants deliberately. Each should preserve the model's identity, important interaction points, and required text. A lower-quality version should feel like the same object, not a different asset whose components have shifted or disappeared.&lt;/p&gt;
&lt;h2 id="validate-both-structure-and-appearance"&gt;Validate both structure and appearance&lt;/h2&gt;
&lt;p&gt;Structural validation and visual review answer different questions. A structurally acceptable asset can still have a poor pivot or an unsuitable scale. A convincing preview can still hide a dependency that is missing from the final package. Keep both checks in the release workflow.&lt;/p&gt;
&lt;p&gt;Build a validation report that names the asset revision, the checks performed, the target application version, and any accepted limitations. Avoid a bare “approved” label with no context. The report should make it possible to repeat the same review later.&lt;/p&gt;
&lt;p&gt;For automated checks, start with simple invariants: required files exist, bounds are plausible for the project, expected object identifiers are present, and the package uses the agreed conventions. Add more sophisticated rules only when they address a recurring failure.&lt;/p&gt;
&lt;h2 id="test-the-first-useful-interaction"&gt;Test the first useful interaction&lt;/h2&gt;
&lt;p&gt;A model appearing on screen is not the end of the loading test. Confirm that the intended user can rotate, inspect, select, or place it as required. Include the state before the model is ready and the fallback when it cannot be prepared.&lt;/p&gt;
&lt;p&gt;For a product viewer, verify that an ordinary image and dimensions remain available while the model loads. For a training asset, verify that required interactive components are present before enabling the exercise. Loading completeness should reflect the task rather than the mere absence of network activity.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://spatialapi.com/blog/game-asset-pipeline/"&gt;game asset pipeline guide&lt;/a&gt; expands this into release management, diagnostics, and rollback. The format decision becomes much easier when it sits inside that larger, explicit process.&lt;/p&gt;
&lt;h2 id="common-delivery-questions"&gt;Common delivery questions&lt;/h2&gt;
&lt;h3 id="is-glb-always-a-single-self-contained-file"&gt;Is GLB always a single self-contained file?&lt;/h3&gt;
&lt;p&gt;No. Inspect the actual dependencies rather than relying on the extension. When your publishing process requires self-contained delivery, make that a validation rule and test the artifact from a clean environment before release.&lt;/p&gt;
&lt;h3 id="should-every-model-use-the-highest-detail-export"&gt;Should every model use the highest-detail export?&lt;/h3&gt;
&lt;p&gt;Choose detail according to the intended view and interaction. A distant decorative object and a close inspection model have different needs. Preserve a high-quality source asset, but publish variants whose tradeoffs have been reviewed in the actual application.&lt;/p&gt;
&lt;h2 id="conclusion-make-the-package-reproducible"&gt;Conclusion: make the package reproducible&lt;/h2&gt;
&lt;p&gt;glTF and GLB are packaging choices within a larger spatial-delivery contract. The dependable handoff includes documented scale and pivots, known dependencies, tested materials, explicit revisions, and a successful first interaction.&lt;/p&gt;
&lt;p&gt;Choose the arrangement your team can inspect and reproduce reliably. A well-understood package with a modest visual budget is more useful than an impressive export whose dependencies, assumptions, and deployment behavior remain a mystery.&lt;/p&gt;
</content:encoded></item><item><title>Spatial Game Assets: Build a Pipeline That Survives Real Devices</title><link>https://spatialapi.com/blog/game-asset-pipeline/</link><description>Create a repeatable content handoff with asset budgets, import checks, quality variants, release manifests, and rollback.</description><category>Game Assets</category><guid isPermaLink="true">https://spatialapi.com/blog/game-asset-pipeline/</guid><pubDate>Sun, 09 Feb 2025 09:00:00 -0700</pubDate><content:encoded>&lt;p&gt;&lt;img src="https://spatialapi.com/assets/images/game-asset-pipeline-spatialapi.png" width="1200" height="1200" alt="Spatial Game Assets: Build a Pipeline That Survives Real Devices"&gt;&lt;/p&gt;&lt;p&gt;A spatial game asset pipeline is the system that turns creative source material into content a real application can load, display, interact with, and replace safely. The pipeline is not finished when a model looks good on an artist's machine. It is finished when another person can reproduce the delivery without relying on hidden files or undocumented fixes.&lt;/p&gt;
&lt;p&gt;This guide proposes a practical workflow for small teams building browser, AR, or VR experiences. It focuses on ownership, budgets, validation, and release behavior rather than a particular marketplace. Use the &lt;a href="https://spatialapi.com/spatial-game-assets/"&gt;spatial game assets hub&lt;/a&gt; as the starting point and adapt the process to your actual content and deployment constraints.&lt;/p&gt;
&lt;h2 id="give-every-asset-a-clear-job"&gt;Give every asset a clear job&lt;/h2&gt;
&lt;p&gt;Classify content by what it does in the experience. A hero object may support close inspection. A background prop may establish scale. An interaction target may carry task-critical behavior. These roles justify different levels of detail, testing, and fallback handling.&lt;/p&gt;
&lt;p&gt;Write the role in the asset record. Include the owner, source location, intended use, and delivery status. The record should also identify any permissions or usage restrictions that need review. Do not assume that possession of a model file establishes the rights needed for a particular deployment.&lt;/p&gt;
&lt;p&gt;Make required behavior explicit. If the user must select a valve, the handoff should identify that component reliably. A visually correct model with renamed or merged interaction parts can still break the application.&lt;/p&gt;
&lt;h2 id="separate-source-intermediate-and-published-assets"&gt;Separate source, intermediate, and published assets&lt;/h2&gt;
&lt;p&gt;Keep editable source material distinct from converted test exports and approved delivery files. Each stage serves a different purpose. An artist should be able to revise the source without silently changing the artifact currently being tested or served to users.&lt;/p&gt;
&lt;p&gt;Use a manifest to define a published scene. It should identify the scene revision and the exact asset revisions it expects. Avoid treating the newest file in a shared folder as an implicit release process.&lt;/p&gt;
&lt;p&gt;Retain the conversion settings that produced the delivery artifact. When a defect appears, the team should be able to reproduce the export before attempting a fix. Reproducibility turns content debugging into an engineering process rather than a sequence of guesses.&lt;/p&gt;
&lt;h2 id="set-budgets-around-representative-scenes"&gt;Set budgets around representative scenes&lt;/h2&gt;
&lt;p&gt;Choose a few scenes that reflect the real application: a typical scene, a demanding scene, and a constrained fallback. Evaluate content in those contexts rather than approving every asset in isolation.&lt;/p&gt;
&lt;p&gt;Track several dimensions of cost. Transfer size, decoded memory, material complexity, animation, and the number of independently rendered pieces can matter in different ways. A single polygon target is not a substitute for testing the full experience.&lt;/p&gt;
&lt;p&gt;Use simple arithmetic to make estimates understandable. For example, an uncompressed 2048 by 2048 image with four one-byte channels contains 16,777,216 bytes, or 16 MiB, before considering other allocations. That calculation is not a measurement of a particular renderer; it illustrates why compressed download size and working memory are different questions.&lt;/p&gt;
&lt;h2 id="build-a-repeatable-import-gate"&gt;Build a repeatable import gate&lt;/h2&gt;
&lt;p&gt;At the import gate, verify scale, orientation, pivot, naming, and required components. Use a neutral scene with a known reference object. Reject ambiguous conventions early rather than compensating for them later with scattered application offsets.&lt;/p&gt;
&lt;p&gt;Check the dependency package from a clean location. The approved export should not rely on an image or buffer that exists only on the author's machine. Record the inventory so missing files can be detected automatically.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://spatialapi.com/blog/gltf-glb-assets/"&gt;glTF and GLB guide&lt;/a&gt; explains why a filename extension is not enough to establish the packaging arrangement. Make your own delivery convention explicit and validate the actual resource graph.&lt;/p&gt;
&lt;h2 id="give-loading-its-own-user-experience"&gt;Give loading its own user experience&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://threejs.org/docs/pages/LoadingManager.html"&gt;Three.js LoadingManager documentation&lt;/a&gt; describes a manager for coordinating loading activity, including callbacks for progress, completion, and errors. Such mechanisms can help organize a client-side loading workflow, but your application still needs to decide what those events mean for the user’s task.&lt;/p&gt;
&lt;p&gt;Distinguish essential content from optional decoration. A scene may be ready for a useful interaction before every nonessential asset arrives. Conversely, it may be unable to start a task even when most files have loaded because one required component failed.&lt;/p&gt;
&lt;p&gt;Use meaningful phases and recovery actions. “Preparing the exhibit” followed by an explicit retry can be more useful than a progress bar that never reaches its final value. Keep a still image or text description available when the content's purpose can be served without the full scene.&lt;/p&gt;
&lt;h2 id="design-quality-variants-as-a-family"&gt;Design quality variants as a family&lt;/h2&gt;
&lt;p&gt;Create lower-cost variants with shared identity and interaction semantics. A simplified object should retain the selection points and essential parts the task depends on. Otherwise, the quality system introduces a second set of application behaviors to maintain.&lt;/p&gt;
&lt;p&gt;Compare variants in the same scene and from the same viewpoints. Review both appearance and usability. A reduced-detail mesh may look acceptable from a distance while making a close inspection task impossible.&lt;/p&gt;
&lt;p&gt;Document what changes between tiers. Remove decorative effects before removing essential instructions or controls. A quality ladder is a product decision about priorities, not simply an export slider set to several positions.&lt;/p&gt;
&lt;h2 id="make-asset-errors-diagnosable"&gt;Make asset errors diagnosable&lt;/h2&gt;
&lt;p&gt;Use asset and scene identifiers in diagnostic messages. A report that names the revision and failed stage is more actionable than “the model did not load.” Separate transport errors, preparation errors, validation failures, and missing interaction components.&lt;/p&gt;
&lt;p&gt;Capture only the operational information needed to investigate. Routine content debugging rarely requires a recording of a person's room or continuous movement. Start with revision identifiers, phase outcomes, and synthetic reproduction scenes.&lt;/p&gt;
&lt;p&gt;Keep a minimal reproduction package for recurring defects. A single problematic material or animation is easier to investigate than the entire game. Once fixed, add that fixture to the regression set so the same defect is less likely to return unnoticed.&lt;/p&gt;
&lt;h2 id="publish-with-rollback-in-mind"&gt;Publish with rollback in mind&lt;/h2&gt;
&lt;p&gt;Before release, confirm that the manifest and its assets agree. Test the exact package intended for publication, not a neighboring development folder. A release candidate should be a concrete artifact that can be copied and verified.&lt;/p&gt;
&lt;p&gt;Retain the previous approved revision and define how to return to it. Rollback should restore a coherent scene, not a mixture of old geometry and new behavior metadata. Avoid changing the contents of a supposedly immutable revision after it has been published.&lt;/p&gt;
&lt;p&gt;Review cache behavior as part of deployment testing. The user should not receive incompatible pieces of different revisions because some paths changed and others did not. Use a versioning convention that your hosting arrangement can serve predictably.&lt;/p&gt;
&lt;h2 id="assign-ownership-across-the-handoff"&gt;Assign ownership across the handoff&lt;/h2&gt;
&lt;p&gt;A small team still benefits from explicit responsibility. Name who approves visual quality, who checks interaction requirements, and who validates the delivery package. One person may hold several roles, but the checks should remain distinct.&lt;/p&gt;
&lt;p&gt;Provide a concise handoff record with known limitations and the intended use. An asset accepted for a distant environment should not silently become the hero inspection model in a later scene. Context helps future teams reuse content responsibly.&lt;/p&gt;
&lt;p&gt;Schedule maintenance when the application or content conventions change. A successful import from an earlier release is not permanent evidence that every future renderer configuration or interaction change will behave the same way.&lt;/p&gt;
&lt;h2 id="conclusion-optimize-the-handoff-not-only-the-mesh"&gt;Conclusion: optimize the handoff, not only the mesh&lt;/h2&gt;
&lt;p&gt;A strong spatial game asset pipeline gives content a clear job, preserves reproducible sources, validates conventions, and publishes coherent revisions. It also explains loading failures and provides a way to recover from a bad release.&lt;/p&gt;
&lt;p&gt;Start with one representative scene and one complete handoff. Then expand the validation rules as real failures teach you what matters. The &lt;a href="https://spatialapi.com/blog/spatial-3d-api-guide/"&gt;spatial 3D API architecture guide&lt;/a&gt; connects these delivery practices to scene identity, coordinate spaces, and application state so the pipeline remains understandable as the project grows.&lt;/p&gt;
</content:encoded></item><item><title>Spatial Anchors: Keep AR Content Attached to the Right Place</title><link>https://spatialapi.com/blog/spatial-anchors/</link><description>Separate object identity from tracking resources and design reliable attachment, repositioning, and cleanup behavior.</description><category>Augmented Reality</category><guid isPermaLink="true">https://spatialapi.com/blog/spatial-anchors/</guid><pubDate>Fri, 07 Feb 2025 09:00:00 -0700</pubDate><content:encoded>&lt;p&gt;&lt;img src="https://spatialapi.com/assets/images/spatial-anchors-spatialapi.png" width="1200" height="1200" alt="Spatial Anchors: Keep AR Content Attached to the Right Place"&gt;&lt;/p&gt;&lt;p&gt;A virtual object that appears stable for a moment is not the same thing as a dependable spatial attachment. The application must decide what the object is attached to, how related objects move together, and what happens when tracking becomes uncertain. Those decisions become especially important when a scene contains more than one item.&lt;/p&gt;
&lt;p&gt;Spatial anchors are part of that architecture. This guide explains how to reason about them without treating an anchor as a magical permanent coordinate. Use the &lt;a href="https://spatialapi.com/spatial-ar-api/"&gt;AR API learning hub&lt;/a&gt; alongside this article, and begin with a small placement task before adding persistence or shared experiences.&lt;/p&gt;
&lt;h2 id="start-with-the-role-of-an-anchor"&gt;Start with the role of an anchor&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://developers.google.com/ar/develop/anchors"&gt;ARCore anchor documentation&lt;/a&gt; explains that anchors help virtual content appear to remain in place as the system updates its understanding of the environment. Objects attached to an anchor follow changes to its pose. The documentation also distinguishes local, Cloud, and Geospatial anchors and recommends reusing anchors for nearby related objects when appropriate.&lt;/p&gt;
&lt;p&gt;For application design, the important question is not merely “where is this object?” It is “what relationship should remain stable?” A collection of puzzle pieces may need to stay aligned with one another. A label may need to remain associated with a particular surface. Those are different attachment requirements.&lt;/p&gt;
&lt;p&gt;Write that relationship in plain language before choosing an anchor strategy. Doing so prevents a low-level implementation choice from silently deciding how the user expects the scene to behave.&lt;/p&gt;
&lt;h2 id="separate-object-identity-from-anchor-identity"&gt;Separate object identity from anchor identity&lt;/h2&gt;
&lt;p&gt;A lesson object, product model, or annotation should have an application identity independent of its current anchor. Replacing or recreating an anchor should not necessarily create a new logical object. Likewise, deleting a virtual object should not leave unrelated application state attached to an obsolete tracking resource.&lt;/p&gt;
&lt;p&gt;Consider a hypothetical maintenance label. Its identity describes the instruction and the component it refers to. Its placement describes the current relationship to the tracked scene. Keeping these separate lets the application preserve the instruction when it needs to ask the user to place the label again.&lt;/p&gt;
&lt;p&gt;Document the ownership rule: which component creates an anchor, which objects use it, and which component releases it. Shared ownership without a clear lifecycle can turn a small scene into a difficult resource-management problem.&lt;/p&gt;
&lt;h2 id="group-content-according-to-intended-behavior"&gt;Group content according to intended behavior&lt;/h2&gt;
&lt;p&gt;Imagine a miniature solar-system exhibit on a table. The planets, labels, and decorative orbit rings should maintain their arrangement relative to the exhibit root. They do not each need an unrelated placement decision merely because they are separate meshes.&lt;/p&gt;
&lt;p&gt;Now imagine a label on a wall and another on a freestanding display. Those objects may have different spatial relationships and may need separate attachment handling. The grouping should follow the meaning of the scene, not the number of imported files.&lt;/p&gt;
&lt;p&gt;Create a scene diagram showing logical roots, local transforms, and attachment boundaries. This diagram can be simple enough for a designer or content author to review. If nobody can explain why two objects share an attachment, revisit the grouping before adding more content.&lt;/p&gt;
&lt;h2 id="make-placement-and-attachment-separate-states"&gt;Make placement and attachment separate states&lt;/h2&gt;
&lt;p&gt;Before commitment, the object may follow a preview candidate. After commitment, it should follow the application's attachment model. Use explicit states for those phases. Otherwise, a model can accidentally keep following the aiming ray after the user believes it has been placed.&lt;/p&gt;
&lt;p&gt;Define the failure path between the two states. The preview might be valid while the requested attachment cannot be completed. In that case, keep the user informed and offer another attempt. Do not freeze the preview and label it successful merely to avoid showing an error.&lt;/p&gt;
&lt;p&gt;Our &lt;a href="https://spatialapi.com/blog/ar-hit-testing/"&gt;AR hit-testing guide&lt;/a&gt; covers the earlier placement interaction. Connect the two workflows with a clear handoff rather than letting preview code and anchor code both write the object's transform at the same time.&lt;/p&gt;
&lt;h2 id="treat-tracking-uncertainty-as-a-user-experience"&gt;Treat tracking uncertainty as a user experience&lt;/h2&gt;
&lt;p&gt;When tracking is uncertain, the user needs to understand what remains reliable. A label that continues to look authoritative while its placement is questionable can be more confusing than an openly paused experience. Decide how your task should respond before uncertainty occurs.&lt;/p&gt;
&lt;p&gt;For a decorative object, a subdued visual state may be enough. For a precise alignment exercise, pausing confirmation and asking for reacquisition may be more appropriate. These are product-level judgments. They should follow the consequences of a misplaced object rather than a desire to keep the screen busy.&lt;/p&gt;
&lt;p&gt;Avoid dramatic motion as a recovery cue. Instead, explain the state in calm language and provide a deliberate repositioning action. The application should not make the person guess whether an object moved because they touched it, the environment changed, or tracking was re-established.&lt;/p&gt;
&lt;h2 id="do-not-confuse-local-attachment-with-persistence"&gt;Do not confuse local attachment with persistence&lt;/h2&gt;
&lt;p&gt;A local experience can look stable during one session without proving anything about the next session. Before promising persistence, define what must survive: the object identity, the user's arrangement, the physical relationship, or all three. Each requirement needs its own evidence.&lt;/p&gt;
&lt;p&gt;A saved application transform is not a complete persistence strategy when its reference frame cannot be reconstructed. Store the meaning of the placement and the information your chosen system needs, not just three coordinates whose origin may be gone later.&lt;/p&gt;
&lt;p&gt;Similarly, shared placement needs a shared interpretation. Two clients displaying the same numerical position are not necessarily referring to the same physical point. Treat multi-device alignment as a separate feature with its own testing and recovery plan.&lt;/p&gt;
&lt;h2 id="design-a-clean-lifecycle"&gt;Design a clean lifecycle&lt;/h2&gt;
&lt;p&gt;Create resources when the task needs them and release them when the relationship is no longer used. Make the lifecycle visible in a development overlay: active logical objects, attachment roots, and objects waiting for placement. This is more useful than a single count with no context.&lt;/p&gt;
&lt;p&gt;Test repeated placement, deletion, reset, and session exit. A prototype that works once can still accumulate stale state after several cycles. Use a scripted sequence to expose that behavior while the scene is still small.&lt;/p&gt;
&lt;p&gt;Keep cleanup idempotent where possible: calling it twice should not produce a second failure that obscures the first. Separate application cleanup from the disappearance of a particular rendering object so a partial scene teardown does not leave hidden ownership behind.&lt;/p&gt;
&lt;h2 id="build-an-anchor-regression-scene"&gt;Build an anchor regression scene&lt;/h2&gt;
&lt;p&gt;A useful fixture contains two related objects under one logical root and another object with an independent relationship. Give each a clear label and visible axes. This makes relative movement easier to observe than a complex artistic scene.&lt;/p&gt;
&lt;p&gt;Test from different viewpoints, after interruption, and after deliberate repositioning. Record whether the expected relationships remain understandable. Do not turn a single successful trial into a universal accuracy claim; keep the conditions and limitations attached to the observation.&lt;/p&gt;
&lt;p&gt;When a regression appears, compare the scene revision, attachment logic, and imported pivots. A visible placement change may come from a content update rather than the tracking system. A fixture with known geometry helps isolate that difference.&lt;/p&gt;
&lt;h2 id="practical-questions"&gt;Practical questions&lt;/h2&gt;
&lt;h3 id="should-every-object-have-its-own-anchor"&gt;Should every object have its own anchor?&lt;/h3&gt;
&lt;p&gt;Choose attachment boundaries based on intended spatial relationships. A scene made of many meshes can still represent one logical assembly. Conversely, two visually similar objects can have independent placement requirements. Start with the relationship diagram rather than a one-object, one-anchor rule.&lt;/p&gt;
&lt;h3 id="can-users-correct-placement-without-starting-over"&gt;Can users correct placement without starting over?&lt;/h3&gt;
&lt;p&gt;They should have a deliberate recovery path when the task allows it. Preserve the object's application identity and relevant task state while returning its placement to a preview phase. This makes correction feel like part of the experience rather than a failure that erases progress.&lt;/p&gt;
&lt;h2 id="conclusion-preserve-relationships-not-illusions-of-certainty"&gt;Conclusion: preserve relationships, not illusions of certainty&lt;/h2&gt;
&lt;p&gt;A strong spatial-anchor design names what should stay together, separates logical identity from tracking resources, and explains uncertain states. It also has a complete lifecycle, including repositioning and cleanup. Those choices make a scene easier to understand and maintain.&lt;/p&gt;
&lt;p&gt;Build a small regression fixture before adding persistent or shared placement. Then explore the &lt;a href="https://spatialapi.com/blog/spatial-3d-api-guide/"&gt;spatial 3D architecture guide&lt;/a&gt; for the broader data contracts that keep coordinate spaces, object identity, and asset revisions from becoming entangled.&lt;/p&gt;
</content:encoded></item><item><title>SpatialAPI.com | Spatial 3D, VR, AR &amp; AI APIs</title><link>https://spatialapi.com/</link><description>Explore spatial 3D APIs, VR, AR, spatial AI, and game assets. Read practical developer guides, test browser capabilities, and build clearer workflows.</description><guid isPermaLink="true">https://spatialapi.com/</guid></item><item><title>Spatial 3D API Guides</title><link>https://spatialapi.com/spatial-3d-api/</link><description>Learn spatial 3D API architecture, coordinate systems, scene graphs, and glTF or GLB delivery with practical developer guides.</description><guid isPermaLink="true">https://spatialapi.com/spatial-3d-api/</guid></item><item><title>Spatial VR API Guides</title><link>https://spatialapi.com/spatial-vr-api/</link><description>Explore spatial VR APIs, WebXR sessions, OpenXR tradeoffs, accessible interactions, and practical browser-based development workflows.</description><guid isPermaLink="true">https://spatialapi.com/spatial-vr-api/</guid></item><item><title>Spatial AR API Guides</title><link>https://spatialapi.com/spatial-ar-api/</link><description>Learn spatial AR API concepts including hit testing, anchors, depth, occlusion, placement previews, and tracking recovery.</description><guid isPermaLink="true">https://spatialapi.com/spatial-ar-api/</guid></item><item><title>Spatial AI API Guides</title><link>https://spatialapi.com/spatial-ai-api/</link><description>Understand spatial AI APIs, scene semantics, confidence, geometry, and responsible workflows for AR and 3D application development.</description><guid isPermaLink="true">https://spatialapi.com/spatial-ai-api/</guid></item><item><title>Spatial Game Assets Guides</title><link>https://spatialapi.com/spatial-game-assets/</link><description>Plan spatial game asset pipelines with 3D model validation, glTF delivery, quality variants, loading states, and release management.</description><guid isPermaLink="true">https://spatialapi.com/spatial-game-assets/</guid></item><item><title>Spatial Field Notes: 3D, VR, AR &amp; AI Guides</title><link>https://spatialapi.com/blog/</link><description>Read ten practical Spatial Field Notes on 3D APIs, WebXR, OpenXR, AR placement, spatial AI, glTF models, game assets, and accessible XR.</description><guid isPermaLink="true">https://spatialapi.com/blog/</guid></item><item><title>Spatial Developer Guides: Start Here</title><link>https://spatialapi.com/guides/</link><description>Follow four spatial development learning paths covering 3D API foundations, VR and AR interaction, spatial AI, and reliable game asset delivery.</description><guid isPermaLink="true">https://spatialapi.com/guides/</guid></item><item><title>Scene Lab: Coordinates &amp; WebXR Capability Check</title><link>https://spatialapi.com/lab/</link><description>Rotate a local coordinate-study cube and check WebXR session support in your browser. No accounts, hosted endpoints, or immersive sessions required.</description><guid isPermaLink="true">https://spatialapi.com/lab/</guid></item><item><title>Official Spatial API Developer Resources</title><link>https://spatialapi.com/resources/</link><description>Find official WebXR, OpenXR, glTF, ARCore, Three.js, and XR accessibility references alongside related SpatialAPI.com developer guides.</description><guid isPermaLink="true">https://spatialapi.com/resources/</guid></item><item><title>About SpatialAPI.com</title><link>https://spatialapi.com/about/</link><description>Learn about SpatialAPI.com, an independent resource for spatial 3D APIs, VR, AR, spatial AI, game assets, and practical developer workflows.</description><guid isPermaLink="true">https://spatialapi.com/about/</guid></item></channel></rss>