top of page

THESIS
 BOSS BATTLE WITH ORGANIC DESTRUCTION AND DYNAMIC VFX

UNREAL ENGINE 5 
BLENDER
HOUDINI

ZBRUSH
ADOBE SUBSTANCE PAINTER & DESIGNER

DISCLAMER: This is project is a work in progress, new features may be added and existing features will be polished

DYNAMIC VFX

EFFECTS THAT INTERACT WITH AND EFFECT CHARACTERS VISUALLY

ENEMY FOLLOWING PROCEDURAL SNAKES +  ENEMY POISONING
 

FollowingSnakes.gif
coilingsnakes.gif

Snake particles generated with GPU ribbons use the enemy location as a parameter and follow them based on a line force originating at the enemy feet which scales vertically when snakes collide with the target thus allowing an additional climbing and coiling motion on the enemy.

snakeheads.gif

Snake heads are rendered as low poly mesh particles which generate location events and collision events.

snakeribbons.gif

Snake Bodies are rendered as GPU Ribbons that use the Snake head location events as source, One tube Ribbon is generated per Head.

snakepoisontrails.gif

Toxic Fumes are rendered as GPU Particles using a simple smoke texture created using Photoshop and a sprite material. These sprites also use the Snake Head location events as source.

RANDOM ARC FOLLOWING FIREBALLS  + ENEMY BURNING
 

HighresScreenshot00070.png
randomarcfireballs.gif

Fireballs are Blueprint based projectiles emitting Niagara particles. These fireballs are emitted randomly from the magic hands sockets and their various parameters such as Number, Speed, Arc Radius, Max/ Min Curve Variation can be tweaked by the user. 

The Niagara particles use the same Particle Material as the Snake Head Toxin fumes and are tweaked to give a smoke and fire visual.

The trajectory of these particles are calculated using two vector based equations explained below: 

#1

Mid-Point determines the center of origin of the arc. 

It is calculated by getting the directional vector from the Player's location to the enemy location, multiplying it by a random float to add variation to the point then adding it to the Player's Location.

The Blueprint Implementation of the equation is given below:

#2

Curve-Points are multiple points drawn along the trajectory of the arc created around the Mid-Point.

 

It is calculated by first getting the Look At Rotation (This gives us a vector which tells us which XYZ directions a specified vector has to be rotated to point towards a target vector) of the Target projectile location from the previously calculated Mid-Point, we then get just the Y vector of the Look At rotation and multiply it by a random Curve Radius which determines how far the fireball will arc. We then rotate this point by a user determined random Angle, along the perpendicular X Vector. Doing so gives us a curving trajectory which can then be used to generate points which the projectile can follow.

The Blueprint Implementation of the equation is given below:

Finally when the projectile is instantiated the curved trajectory is calculated and the projectile is interpolated towards consecutive points drawn along the trajectory. A Niagara particle fire and smoke trail is also activated when the particle spawns and de-activated when it collides with the enemy character.

skm_burning.png

Finally when the enemy takes damage by the fireballs an additional skeletal mesh location Niagara emitter is attached to the Enemy mesh thus giving it a burning effect for a specified duration.

ICE ATTACK + ENEMY FREEZING
 

HighresScreenshot00071.png
randomarcfireballs.gif

The ice attack happens in 3 stages:

#1 Attack Charge

Freeze1.gif
spiralmesh.png

The attack charges up in a spiral of wind while additional high velocity wind particles surround the central system.

The central system and high velocity wind is achieved by using a single texture created in photoshop used for the particle sprite.

The whirlwind system is created using a mesh renderer and applying a stretched and masked noise texture on the same. These mesh particles are then rotated and scaled down over time with some linearly randomized variance.

#2 Release Attack Energy

Freeze2.gif
auranoise.jpeg
iceaura.gif

Immediately after the charge, the attack energy release FX is played. This is achieved by using a tiling caustic texture in a material which uses particle material parameters to pan and scale the textures inwards thus giving us control over texture speed and RGBA.

Similarly a second refractive particle material was created for a refractive effect.

The particle material is as given below:

#3 Freezing Mist

Freeze3.gif

The freezing mist effect is spawned from a random socket location on the magic hands component. This effect comprises sub UV animated particle sprites that take the enemy location as a user parameter if the enemy is within a specified radius and are forced towards the enemy with a point force thus giving the effect a more varied motion.

SIMULATED BLOOD SPLATTER + ANIMATED DECALS

HighresScreenshot00072.png
bloodeffect.gif

The Blood VFX was simulated in Houdini and composited onto a plane to generate flipbook textures to be used in Unreal Engine as a sub UV animated particle.

HOUDINI:

Objects

objectshoudini.png

The objects for this simulation to bake process consisted of a spherical FLIP source, a FLIP DOP net, a fluid surface SOP, a baking setup for a plane and a compositing net to create flipbooks from rendered textures.

Source

For the simulation source object a sphere was created. This surface was given more variation using attribute noise.

DOP Net

houdnidynamics.png
houdnisrc.png

The Blood Splatter uses a FLIP fluids solver to generate the particle fluid simulation.

Fluid Geometry

To create the geometry from the simulated particle data I used a particle fluid surface node. I also cast a mask by feature to the generated surface in order to generate occlusion quickly. Then, I cached the resulting geometry and added vertex color and a principled shader to give it various physical rendering values.

houdinisrc.png

Baking Setup

houdinibake.png

I used an object merge to group the attributes of the generated fluid geometry then computed its normal. The next step was copying the occlusion data generated by the mask by feature to the AO attribute of the geometry.

I then deleted the occlusion attribute as we no longer need it in the output renders.

I created a plane with a flat UV map and then baked the Normals, AO and Vertex Color.

Compositing Setup

For compositing I first setup file nodes for each rendered attribute, these renders were then renamed and grouped in order to be tiled as 6x6 sprite textures using a mosaic node. These textures were then scaled to a 2K resolution and assigned to the RGBA channels of a singular texture.

houdinicomposite.png

UNREAL ENGINE:

The same flipbook texture was used in 2 Ways:

Particles and Decals

For the particles I used the flipbook to make a sprite material and used subUV animation to play the animated flipbook on a single sprite. This sprite has random rotational and non-uniform scale variation every time it spawns thus reducing repetition.

For the decals I exposed the animation phase of the flipbook thus allowing the flipbook to be animated through blueprints when spawned. This also allows us to play the animation only once and stop at random phases to give more splatter variation. These decals were then spawned in tandem with the Niagara particles giving a combined visual feedback of Attack Splatter and Ground Splatter.

BloodSplatter.png

ADVANCED MATERIALS

TRIGGER WARNING:  LOTS OF EYEBALLS

HighresScreenshot00074.png

This eye material is based on Snell's Lens Law Approximation Equation for Real-Time rendering applications. All refractive properties and depth of the eye are calculated from the camera vector and used in the Diffuse. This allows for a cheap non refractive material while giving us UV offset controls of the following:

 Iris Depth 

 Iris Diameter 

Index of Refraction

Pupil Size

Edge Sharpness

eye_edgesharpness.gif

Iris Texture

This equation is used to calculate the refractive depth of the Iris, we use the Camera Vector WS as the incident ray and Pixel Normal WS as the surface normal for Snell's law to get a "refracted" vector which offsets the normals for the iris region of the eye thus giving us the illusion of depth.

Blueprint Implementation:

refractedray.png

Additional masking and UV offset transforms were parameterized for the material to make it more dynamic and customizable. All of these operations are also performed on the albedo only thus keeping the shader complexity optimized.

The Iris and Sclera textures were also made non-destructively in Substance Designer. This gives us control over the Fiber and Vein Counts, Color Variations, Fiber Shapes and Normal Intensities.

veins_RESULT.png
iris_RESULT.png
veins_graph.png
iris_graph.png

SINGLE MATERIAL PHYSIOLOGICAL DAMAGES

Each VFX attack damages the character visually through different texture sets. These are combined into a single material which grows  organically over the character over a specified duration.

HighresScreenshot00076.png

Blend Value 0.5

MaterialLerping.gif
HighresScreenshot00077.png

Blend Value 1

To achieve this, first 3 different damage type texture sets are created by hand using Substance Painter, these textures are then used by a single material from a shared sampler source thus allowing for an optimized instancing of textures through the GPU. 

We first use switches to decide which Texture Set will be used in case of the specific attack and then the set is Blended To and From the main undamaged texture set using World Aligned Blend.

Both the Switch Value and Blend Values are controlled using Global Material Parameter Collections thus preventing creation of Dynamically Instanced Materials for each damage type. 

mpc.png
singlemateriallerp.png

REALISTIC CHARACTERS

GAME READY REALISTIC CHARACTERS BASED ON THE LIKENESS OF TOM HARDY & ANYA CHALOTRA

ZBrush Document3.jpg

TRIGGER WARNING:  INTERNAL HUMAN ANATOMY (GUTS & STUFF)

fbody.png

GIB DESTRUCTION SYSTEM

The gib destruction system created for this project allows for swapping out different skeletal mesh parts existing on the same skeleton in real-time.

OrganicDestruction.gif

For each destroyable intact part, e.g. the Arm, there's a corresponding destroyed part that can be swapped out based on any desirable parameters such as damage or hit-count.

When a part is destroyed, it is simulated with force thus giving the illusion of being cut-off with force.

Additional properties such as soft-bodies or cloth simulation can be added to the destroyed part to give it a more natural fleshy effect. Here I used a cloth-sim on the destroyed arm mesh to represent hanging tissue.

The leader pose component in Unreal Engine allows for combining multiple skeletal meshes if said meshes are using the skeleton or rig-hierarchy. This gives us the ability to animate multiple skeletal mesh parts together seamlessly (Given the corresponding parts are skinned together first and then separated).

bodyxray.png
Rig.png
RigOct.png

RIGGING & ANIMATION ENGINEERING

Because of the nature of the destruction system, the enemy character for this project was first skinned as a whole and then separated into pieces based on the nature of destruction. 

Additionally custom physics assets were made for the various props for the waistbelt of the character as well as cloth simulation painting was done for the various fabrics and destroyed flesh tissue.

For the player character I wanted to go for a floating style locomotion which feels smooth and doesn't snap on rotation, to achieve this I created an idle floating animation in Blender, then made additional directional animations using a Control Rig inside Unreal Engine. I baked these animations to sequences and used them inside a 2 Dimensional Speed VS Direction Blendspace.

FloatingBlendspace.gif

Additionally I made floating Dodge and Attack animations in Blender, These animations and animation sets have the following features:

Equip and Unequip State Locomotion

Directional Dodge

Quick Animation Cancelling

Triple Attack Combos 

To achieve these different states I made modifications to the Mannequin an Animation Blueprint, by using cached posed slots for the Upper Body bone group I could reuse the lower body floating locomotion while using both Equip and Unequip Animations. This allowed for a more modular approach to combining and slotting animations.

Additionally this system also allows me to use different kinds of animation sets for different weapons and quickly iterate it on the same character blueprint.

This is achieved by creating cached posed states for different animation sets which entails creating different locomotion blend spaces for different kinds of weapons. For this project I only had one kind of weapon and animation set.

For the Attack Combo system I created an Animation Notify event which communicates with a state manager and saves or unloads attacks based on the duration between them. This Notify can be added at any point in the Animation Sequencer where the combat designer wants to achieve the combo to continue from in the event of consecutive inputs.

continueattack.png

AI BEHAVIOR TREES

For this project I made my own Boss AI tailored to the scope of this project. The following behavior trees showcase the following behaviors:

Patrolling

Enter Combat

Exit Combat

Chase Player

Ranged Attack

Chanced Melee Attacks

bottom of page