92 lines
5.8 KiB
Markdown
92 lines
5.8 KiB
Markdown
# 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 2–3 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 (15–30 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 3–4 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) |