Transformers: Dark of the Moon VFX Recreation

This semester, I had the opportunity to work on a big individual project of recreating the shot in Transformers 3: Dark of the Moon, in which Sentinel Prime sliding down a building in the battle in Chicago. Rigid Body Dynamic is the hero effect of the shot, which is the main focus of me for 12 weeklong.

SOFTWARE:

HOUDINI | NUKE

I. Fracture RBD

I began with a grid aligned to the building's geometry. The fracture pattern is created based on a number of points scattered across the grid, utilizing Optimus's movement and feeding it into the Solver to initialize the area. I divided the grid into two parts: the wall and the 'impact point,' where Optimus makes the kick at the end of his fall.

Using the RBD Material Fracture, I generated a fracture pattern across the grid, adding some tiny chipping pieces.

The Dop Network for the Fracture RBD is structured as follows:

  • RBD Object: the fracture grid.

  • Static Objects: the building and the ground, and an additional wall in the back to prevent fracture pieces from falling backward.

  • Deforming objects: Optimus Prime and his blade (Proxy)

After initializing all necessary components, the simulation is complete! To further direct the shot artistically, certain pieces are removed post-simulation to:

  • prevent coverage of Optimus Prime

  • avoid excessively large pieces

  • prevent pieces from falling too close to the camera.


II. Debris


Sourcing the Material:

I started by extracting the inner faces from two previously set up fracture configurations. Next, I scattered a copious number of points, setting the stage for the mathematical magic to come.

According to the wisdom shared by Gabriel Neville, an FX Lead at MPC FILM, the method of sourcing points for debris emission is demonstrated below:

  • This code is responsible for finding neighboring points within a specified maximum distance (MaxDist). It iterates through the list of neighboring points and checks if the point's name (@name) is different from the current point's name. If they are different, it sets the color (@Cd) of the current point to red (1, 0, 0) and assigns the index of the neighboring point to i@neighbourPoint.

    Additionally, it calculates the distance between the current point and the neighboring point and stores it in f@distance. If this distance is less than a specified minimum distance (MinDistance), it sets the distance to the MinDistance.

    This part is like a detective looking for nearby points. It checks if any points are close to each other. If it finds a point nearby, it marks it as a "neighbor." It also measures how far these points are from each other. If they're too close, it makes sure they're at least a certain distance apart.

  • This code calculates the actual distance between the current point and its neighbor using the previously calculated distance. It then checks if the actual distance is greater than the distance multiplied by a distance multiplier (DistanceMult). If it is, it sets the color to yellow (1, 1, 0) and sets i@active to 1, indicating that this point is active.

    Here, it checks if a point is far enough from its neighbor. If it is, it gives the point a special color and says, "Hey, you're active!" Imagine it as giving a high-five to points that are far apart.

  • This sets a specific frame number. In simpler terms, it's like telling the program to remember that on frame 100, something important will happen.

  • Inside a SOP solver, this code checks if the point is active (i@active == 1). If it is, it sets i@activeFrame to the current frame number (@Frame).

    Then, it ensures that i@activeFrame does not exceed the activeFrame value of the previous frame by using min().

    This is like having a notebook to remember things. It notes sown which frame something became active. It’s saying, “Hey, on this frame, you became important!”

  • If i@activeFrame is not equal to the current frame (@Frame), it removes the current point.

    If a point is no longer needed, it's removed from the program.

  • If i@activeFrame is greater than 36, it removes the current point.

    If a point has been active for an extended period, it's cleared from the scene.

Particle System Play:

With a plethora of emitting points at my disposal, I fed them into the particle system, generating a generous supply of debris pieces. This step was pivotal in bringing life to the simulation.

Fine-tuning the concrete touch:

To add that extra touch of realism, I introduced refined concrete pieces. Employing the same procedural modeling setup that breathed life into my two main fracture RBDs, I infused them with an aesthetic charm, elevating the overall visual appeal.

To optimize the render, I used LOP Instancer to assign these pieces into Solaris with random sizes at random points to create the variety.

Here is the first test for my debris set up

And here is the result after using the Instancer in Solaris and rendered with motion blur

III. Particles

Using the same Particle System of Debris, I sorted out the 95% amount of point to make them into tiny particles to polish the shot. These particles did not have any instance geometry on them, and their appearance is driven by pscale only.


IV. Concrete Dust

I find this to be the most challenging aspect of the project for me, as I lack extensive experience in Pyro.

For sourcing, I used the same method as with Debris and Particles to emit points for the Pyro Source. I then segregated the wall and impact point, assigning each its own POP Network to generate points.

Shaping constitutes the primary focus of this phase. After visualizing the dust cloud's direction by tracing lines from these particles, I generated the dust's age, causing it to fade out from its active frame to a certain distance traveled. Leveraging the 'curveu' attribute, I allocated more points to the tip of each emitter, resulting in fewer emitting points the further they travel along the trail. Additionally, I linked the dust's density to its age, causing it to decrease as the dust ages.


After feeding them into the simulation and adjusting the look by Pyro Bake Volume, here are two dust clouds I got

IV. Contact Sheet

After refining all elements, here are the result of them in render.