This live walkthrough is new. Please report bugs or issues to max1@mit.edu.
Constructing Printable Surfaces with View-Dependent Appearance

Design tool

Design your own view-dependent surface

Pick up to four viewing directions and an image for each. Press Optimize to run the optimizer from the paper, then download the result as a printable mesh. The settings below are the arguments of grad_descent().

Each image is turned to face its camera, so it looks upright from that view. The Python code does not do this.

Pick views and pictures, then press Optimize.

loss per view height steps bars split rays doubled

Optimizer settings (grad_descent arguments)

After step 300 the bars are not split any further. The Python code keeps splitting them every 100 steps.

How to use it

  1. Views. Each card is one viewing direction and the image you want to see from it. Pick an image from the list or upload your own. Use two to four views, at least 40° apart.
  2. Step 1: Optimize. Runs the optimizer. The chart shows the loss for each view.
  3. Step 2: Project. Projects each image onto the sides of the bars its camera sees, and builds a closed, textured mesh.
  4. Step 3: Download printable mesh. Saves the mesh (OBJ, MTL and PNG) and the optimized heights and colours, which reproject.py can read.
  5. Look from view on a card shows the surface from that camera.

Everything runs in your browser, and your images are not uploaded. We ported the code from Python to JavaScript for this page. The method is explained in the walkthrough.