UE4 · Zbrush · Maya · SubstancePainter
D i g i t a l W i l l e m D a f o e

The First Digital Actor Project Using Real Time Apple Facial AR Tracking

With Unreal Engine 4.

Software Used

Sculpting / Modeling / Rigging / Animation / Texturing / Rendering / Facial Tracking



An interview about The Lighthouse, remade using the Apple AR Kit.

Willem Dafoe was interviewed about the movie The Lighthouse, in which he appeared.

I used the footage of this interview to track his face and reimagine it in real time using Unreal Engine 4. This is the final result of that process, after I superimposed his voice on the reconstructed scene.


This video summarizes the process involved in creating this scene. More detailed explanations will be posted on the blog as soon as possible.

Image Title

Apple Facial AR Tracking

The TrueDepth Front-facing Camera System for iPhone X (and onwards) enables real-time recognition and tracking of a subject’s face.

Image Title

I registered for the Apple developer program to use their facial AR tracking software in UE4. To install the app on my iPhone 11 and track the face in real time, I had to generate a provisioning profile that consists of the certificate, app ID, and device information.

Especially when you enter the bundle ID in the iOS project settings, be careful not to misspell it; it should be the same as the one you entered when creating your app ID.

Image Title

Once the necessary files were generated, I installed the app on my iPhone, after which I was able to track the face of my subject and check the changes in weight for each specified area.

Image Title
Image Title
Image Title
Image Title
Image Title
Image Title
Image Title
Image Title

Facial Modeling & Sculpting

Next, I modeled a low poly facial mesh in Maya, which I transferred to Zbrush for sculpting the high poly mesh. Characteristic of Dafoe’s face are his protruding chin and pronounced cheek bones, so I was particularly careful to get those shapes right (in all dimensions)

Image Title
Image Title

The subdivision level was raised to 8 in order to increase the density of the model’s skin and wrinkles. It’s helpful to divide the facial mesh to poly groups in advance so it becomes easier to express fine shapes and details such as the eyelids and the corners of the mouth.

Image Title
Image Title

Skin Texturing

The first thing I did in substance painter was bake a high poly mesh on top of the low poly mesh. After that, I was able to create the maps that have information such as light, roughness, curvature . These were used to paint the skin and express wrinkles.

Image Title

example, the curvature map was used for expressing pores and roughness as the face emotes. By adding a paint layer, I was able to exclude unnecessary areas. A thickness map was used to paint scattering areas such as eyelids, ears and the tip of his nose.

Image Title
Image Title
Image Title

Willem Dafoe's face was painted layer by layer, based on the structure of his skin.

Image Title
Image Title

There are several settings for activating subsurface scattering in Substance Painter. First, a scattering channel has to be added. Then, you need to check the enable box in the Shader and Display Settings.

Image Title
Image Title

Facial Rigging & Blendshape

I created the rigging and blendshape to be able to animate Willem’s facial expressions. First, I made 50 poses based on the Apple blendshape list in Zbrush. Afterwards, I continued in Maya by using a Zbrush plugin that can convert the layers in Zbrush to Maya blendshape data.

Image Title

After creating the bones and binding the skin in Maya, the affected areas of the skin were painted white according to the movement of each bone.

Image Title
Image Title

If you import the FBX file in Unreal Engine, you can check and verify the bone animation as animation sequence data and the blend shape as morph target data.

Image Title

If you create a pose asset using an animation sequence, you can use each keyframe as one pose. Once the name of each pose is the same as the blendshapes, the weights are added. We then have the final animation.

The first mistake I made was to just make the lacrimal meniscus mesh on a blendshape basis, so it wasn't in the right place. After fixing it for the final animation, I was able to confirm that it worked properly.

Image Title
Image Title

Hair, Eyebrow & lids, PeachFuzz

Maya XGen was used to create the hair, eyebrows, lashes and stubble. I've created collections of each area and added descriptions (i.e. quantity of “fur”) in the guidelines.

Image Title
Image Title
Image Title
Image Title
Image Title
Image Title

After converting the grooms to Maya’s interactive grooms, they were exported as an alembic file (.abc).

Before importing alembic files to UE4, I had to set up something that could import this type of file using the Plugin and Project Settings.

I've tried to render the scene in real time on a Mac, but it didn’t work on UE4.25. That’s why I decided to export the animation and record it on PC.

Image Title
Image Title
Image Title

Skin Material & Wrinkle

When Dafoe’s face animates in UE4, wrinkles should appear in the appropriate areas lest you end up in the uncanny valley. This is why I made 13 wrinkle masks and about 3 wrinkle maps. Just like the skin textures previously, I applied the textures of the affected areas on each channel as RGBA layers.

Image Title

In this case, there are 3 facial expressions for wrinkle maps, them being collections of expressions that generate wrinkles on the model, such as browInnerUp, jawOpen, eyeBrowDown, noseSneer, eyeSquint, and mouthSmile.

Image Title
Image Title

Nodes were created so that facial expressions and wrinkle maps can operate every frame. Particularly, the wrinkle map is implemented when the tick function is executed by creating a function that outputs a map suitable for each area for each animation.

Next Project
SubstancePainter · Maya · UE4
C a p t a i n C r u n c h