Files
splat-indoor-navigation/prototyping-session.md
T
2026-08-03 17:14:38 +00:00

5.8 KiB
Raw Blame History

Prototyping Session: Pose → Splat Rendering

Context

Part of the cruise ship AR indoor navigation project. This session isolates and de-risks the rendering half of the pipeline (position + direction vector → correct camera view in a Gaussian Splat), independent of the indoor positioning problem. Indoor positioning accuracy is a separate, harder problem — here we assume we have a pose and just need to prove we can turn it into a convincing live AR view.

Core Hypothesis

Given a 3D position vector and a direction (viewing) vector, we can render the corresponding camera view inside a pre-captured splat of a real space, live, at a frame rate and visual fidelity good enough to feel like "AR navigation" rather than a static 3D viewer.

Goal for the Session

By the end, have a working demo: move a virtual camera through a splat of a real room/corridor using manually or programmatically fed (position, direction) pairs, and confirm the rendered view matches what a person standing there and looking that way would actually see.

In Scope

  • Defining the pose representation (position vector + direction vector, or quaternion)
  • Capturing or reusing one small real-world splat (a room, hallway, or stairwell — not the whole ship)
  • Aligning the splat's internal coordinate system to a real-world/metric coordinate system
  • Feeding pose data into a splat viewer/renderer and rendering the correct view
  • Validating rendered view vs. reality at a few reference points
  • Simulating a "live navigation" feel by animating/interpolating pose along a path

Out of Scope (for this session)

  • Actual indoor positioning tech (assume pose is given/manually set)
  • Full ship-scale splat capture
  • Route computation / pathfinding
  • Production mobile app integration
  • Gyroscope fusion (optional stretch only, see below)

Pose Representation

Decide and document early — this is the contract between "positioning" and "rendering":

  • Position vector: (x, y, z) in a fixed world/ship coordinate frame, metric units
  • Direction vector: either
    • a normalized forward vector (dx, dy, dz), or
    • yaw/pitch (+ fixed roll) if you want to lean on the phone's gyroscope later, or
    • a full quaternion if you need roll too
  • Decide now whether "up" is world-up or splat-native up (splats often come with an arbitrary up axis — needs alignment)

Tooling Options to Test

  • Splat capture: Polycam, Luma AI, or a quick Postshot/nerfstudio run from a phone video of a real room
  • Splat rendering/viewer:
    • Web: three.js gsplat viewers (e.g. antimatter15 splat viewer, @mkkellogg/GaussianSplats3D, or Luma's web SDK) — easiest to script custom camera poses into
    • Engine: Unity/Unreal with a Gaussian Splatting plugin, if you want mobile deployment sooner
  • Pick web-based first for this session — fastest to iterate on "set camera pose programmatically."

Session Agenda (half-day, ~4 hrs)

1. Setup (30 min)

  • Pick/capture one small real space (a room or corridor you can physically walk into)
  • Get it into a splat viewer that accepts programmatic camera pose input

2. Coordinate alignment (45 min)

  • Establish 23 known reference points in the real space (measured with tape measure/laser) and their pixel/splat coordinates
  • Compute the transform (scale, rotation, offset) between splat space and real-world metric space
  • Sanity check: does a known real position map to the expected point in the splat?

3. Pose → render pipeline (45 min)

  • Write the small script/function: renderView(position, direction) → camera frame
  • Manually feed in a handful of (position, direction) pairs corresponding to places you can physically stand
  • Render and screenshot each

4. Validation (45 min)

  • Stand in the real space at those same points, facing the same direction, take a phone photo
  • Compare rendered splat view vs. real photo side by side
  • Note: does it match well enough? Where does it break (occlusion, splat artifacts, alignment drift)?

5. Fake "live" navigation (45 min)

  • Define a short path as a sequence of (position, direction) waypoints
  • Interpolate between them (linear position, slerp direction) and animate the camera through the splat
  • Does it feel smooth and directionally correct, like walking through the space?

6. Stretch goal (remaining time, optional)

  • Pipe live phone gyroscope data into the direction vector while position stays fixed/manual
  • Test whether looking around live in the splat feels responsive enough

7. Wrap-up (1530 min)

  • Debrief: what worked, what didn't, what's the biggest open risk
  • Capture screenshots/video of best result as a demo artifact

Success Criteria

  • Rendered splat view at a given pose is recognizably the same as the real view (same landmarks, correct orientation) to a human comparing them
  • Camera can be moved through a sequence of poses smoothly enough to read as "navigation," not a slideshow
  • Coordinate alignment error is small enough to be usable at ~1m positioning accuracy (i.e. rendering error doesn't dominate over positioning error)

Key Risks / Open Questions to Surface

  • How much manual calibration does each splat capture need before poses map correctly? (Ship-wide, this needs to scale — can't hand-align every room.)
  • Splat rendering performance on-device (mobile GPU) at usable frame rates
  • How splat quality degrades in low-light, mirrored/repetitive ship corridors (relevant to capture quality later, not this session)
  • Whether direction vector alone is enough, or roll/tilt from gyroscope is needed for a convincing AR feel

Deliverables

  • Short demo video: real photo vs. rendered splat view at 34 poses
  • Video of interpolated "walk" through the splat along a path
  • One-page write-up of the coordinate alignment method and error observed
  • List of blockers/questions for the next session (likely: scaling capture+alignment to full ship, and integrating with actual positioning data)