Turn any 2D video into 3D for your Quest, on a Mac, for free

One film frame flipping between the left and right eye: the pillar, the man and the soldier shift by different amounts, which is the depth
Left eye, right eye, flipping. Tears of Steel © Blender Foundation, CC-BY 3.0

I wanted to watch a regular 2D film in 3D, in my Quest. My agent converted it on my MacBook with open-source depth models, no paid service, and copied it to the headset. Here’s how it works, what it costs in time, and the settings that matter.

🤖 Want an agent to just set this up for you? Copy the prompt and paste it into your AI agent.

Prompt for your coding agentclick to open
I want my coding agent to convert any 2D video to side-by-side 3D on my Mac and copy it to my Quest.

The non-obvious part: an open-source depth model (Video Depth Anything) guesses the depth of every pixel, and iw3 warps it into left and right eyes locally on the Mac GPU. Fast and quality settings differ about 4x in render time.

Full instructions are here:

https://strangenewworld.net/turn-any-2d-video-into-3d-for-your-quest-on-a-mac/

Read that page first, then build it.

⚙️ Requirements

  • 🤖 A coding agent with shell access
    Example: Claude Code, Codex
  • 🍎 An Apple Silicon Mac
    The depth models run on the GPU through Metal. Fast mode takes about 1 hour per 4 minutes of video
  • 🥽 A Quest 3, or any headset player that plays side-by-side 3D
    USB or wireless adb

How a flat video becomes 3D

A depth model, Video Depth Anything, guesses how far away every pixel is. Then the image is warped into a left and a right eye, shifted by an amount that depends on that depth. iw3 does the whole thing locally and runs on the Mac’s GPU.

The result is a side-by-side video: left eye on the left half, right eye on the right half. Any headset player that understands that layout plays it as 3D.

One frame alternating between the left and right eye. The pillar, the man and the soldier shift by different amounts, and that difference is the depth. Tears of Steel © Blender Foundation, CC-BY 3.0.
One frame alternating between the left and right eye. The pillar, the man and the soldier shift by different amounts, and that difference is the depth. Tears of Steel © Blender Foundation, CC-BY 3.0.

Fast or quality

Two settings, measured at 2560×1080 per eye on an M2 Max:

  • Fast: about 0.6 seconds per frame. A 4-minute film took about an hour.
  • Quality: a bigger depth model plus filling in what’s revealed behind objects. About 2.7 seconds per frame, with visibly cleaner edges around moving things.

Render the first minute first, judge it in the headset, then do the rest. If the source is 4K, scale it down to 2560×1080 first, since the render gets much faster and the Quest screen is the limit anyway.

python -m iw3.cli \
  -i film.mp4 \
  -o film_LR_SBS.mp4 --yes \
  --depth-model VDA_S \
  --scene-detect \
  --ema-normalize \
  --video-codec \
    hevc_videotoolbox

That’s fast mode. For quality, swap in the bigger model and the inpainting method:

--depth-model VDA_L \
--resolution 518 \
--method mlbw_l2_inpaint \
--divergence 2.5 \
--convergence 0.5 \
--edge-dilation 2 2 \
--ema-decay 0.9 \
--ema-buffer 30

Three flags do most of the work. --scene-detect and --ema-normalize stop the depth from flickering between frames, and --video-codec hevc_videotoolbox uses the Mac's hardware encoder, which made the whole render 3.4 times faster than the software one. The bigger depth models are non-commercial licence, which is fine for watching a film at home.

Watching it on the Quest

Copy the file into the headset’s video library, and put _LR_SBS in the name so the player knows it’s side-by-side 3D:

quest push-wearer \
  film_LR_SBS.mp4 --movies

Then open it in Skybox VR. Everything runs on my MacBook, with no paid service and nothing uploaded.

What else my agent does with the headset

The same agent installs games on the Quest, screenshots what it’s rendering and taps through menus while nobody is wearing it. That write-up is coming next.