This is a C++ implementation of the SIGGRAPH paper "Apperance Mimicking Surfaces" on Geometry Processing, by C. Shüller, D. Panozzo and O. Sorkine-Hornung. In addition to recreating the paper’s application for generating relief-like meshes, I explored a variation for generating relief on spherical surfaces.

Because light reflections are determined by the angles between incoming light and the normal vectors along the surface, if we can re-parameterize the surface normals of the mesh by their vertices’ positions, then we can optimize for these vertex positions to make the lighting effect appear as close as possible to the original mesh, while constraining the original model to a much shallower (relief) depth.

My Role

Solving Math, Coding, Debugging and Rendering

Tools

C++, Eigen, libIGL, CLion, Blender

Team

Myself

Duration

April - May 2019

Project Outcomes

Implementation With C++ and libIGL

I first wrote the C++ implementation of the algorithms, before applying it to a few open-source OBJ models I found online, such as the infamous Stanford Bunny, horses and teapot.

The algorithm calculates and produces the relief versions of those models as matrices, and I then used libIGL to write the vertices into OBJ files.

Application on Product Design

The output relief models are exported in OBJ format, and I used Blender to render these OBJ models using colors and textures that mimic porcelain.

Implementation

Brainstorm on Project Ideas

While searching for ideas for my final project for the Geometric Modeling class at NYU, I came across an interesting paper about generating Bash-Relief from 3D models, written by my professor during his postdoc.

The technique reminded me of Jasperware from the 18th Century and their subtle yet vivid decorative style. I wondered if I could implement the paper in such way that generates Bas-relieves not just on flat surfaces, but on curved surfaces as well.

Implementation with C++ and Eigen

After closely reading the original research paper, I looked for ways to replicate the authors' constrained convex optimization algorithm by using C++ and Eigen.

While the paper discussed the high-level mathematical principles of the algorithm, not a word was mentioned about how they coded it in a finite state machine. It was my job to figure out how to process the mesh, allocate memory, work around rounding errors of floating point numbers, avoid mesh intersections, etc.

* Source code for this project can be found at: https://github.com/yuepingwang/relief/tree/master/src