Patrick Mardy3D assets / Unreal Engine 5

Modelling · Materials · Blueprint interaction

3D asset portfolio

Selected work

Objects, surfaces and systems.

Blink camera and doorbell presentation01 / ASSET BUILD

Blink Security ↗

Hard-surface modelling, mesh checks and interactive devices.

Liquid Death can and water study02 / SURFACE & FORM

Liquid Death ↗

Metal finishes, component construction and baked fluid motion.

Soundcore Sport X20 earbuds03 / ASSEMBLY & MOTION

Soundcore Sport X20 ↗

Separate components, controlled pivots and coordinated movement.

Liquid Death

A study in cylindrical form, metal finishes and fluid motion.

Engine
Unreal Engine 5
Video output
1920 × 1080, 30 fps
Loop
6 s, 180 frames, seamless
Blueprints
2 Actor Blueprints
Frame 000 / 179 Orbit loop · 6 s

Inside the build

  • Can. A lathe profile (a shape spun around its centre) built to real size. It is split into CanBody, CanLid, CanTab, CanAluminium and CanDrops under one CanSpin pivot.
  • Materials. M_Metal is a parent material with parameters. MI_Gold and MI_Aluminium are instances of it, so a finish changes without touching the graph.
  • Water. A particle fluid simulation baked to 180 meshes, SM_Water_000 to SM_Water_179. The Blueprint shows one mesh per frame on a single Water component. The simulation used the same spin as the can, so the water drags with it.
  • Camera. A CineCamera on a yaw pivot, set to a 16:9 digital film back, 50 mm and f/8. Orbit, push-in and height are exposed as settings.
Motion & Blueprint breakdownExplore the build +
BP_LiquidDeathSplash2Can and water

Spins the can and plays the simulation frames. The graph has three commented sections: Loop Clock, Can and Simulated Water.

Event Tick → Time → LoopT = Time ÷ LoopDuration → Phase = LoopT × 360 → Make Rotator → Set Relative Rotation (CanSpin)

Fraction(LoopT) × frame count → Truncate → Get (Water Frames) → Set Static Mesh (Water)

Settings
Loop Duration6.0 s
Water FramesArray of simulation meshes
Full graph: Loop Clock, Can and Simulated Water.
Loop Clock and Can.
Simulated Water: frame lookup.
BP_CanOrbitCameraCamera rig

Orbits the camera around the can, pushes in and rises on a cycle, then aims at the can every frame. Each motion runs off the same loop clock as the can and the water, so the three stay in step.

Phase → CameraYaw turns OrbitDegrees · distance eases in by PushIn, PushCycles times per loop · height rises and dips by HeightSwing once per loop · Find Look at Rotation → Set World Rotation (CineCamera)

Variables
  • LoopDuration
  • OrbitDegrees
  • Distance
  • PushIn
  • PushCycles
  • Height
  • HeightSwing
  • FocusHeight
Full graph: Loop Clock, Orbit, Dolly and Height, Apply.
Orbit, dolly, height and aim.

Review log

Problems I caught
ProblemChange
The label read mirroredUVs corrected so the artwork reads the right way round.
The water didn't act like liquidThe first version's procedural swirls and droplets were replaced with a particle fluid simulation, baked to 180 frames.
The lighting was blown outLighting reworked in its own review round.

Soundcore Sport X20

A component-based earbud assembly with coordinated motion.

Engine
Unreal Engine 5
Video output
1920 × 1080, 30 fps
Loop
16 s, 480 frames, four 4 s cycles
Blueprints
2 Actor Blueprints
Frame 000 / 479 Crossing loop · 16 s

Inside the build

  • Earbuds. Modelled from photos, with collision. Each bud is split into nine named parts (Collar, CollarTrim, Eartip, Faceplate, Grille, Hook, Logo, Nozzle and Shell), so every part keeps its own material slot and pivot.
  • Rig. A CrossPivot carries Arm_L and Arm_R, and each arm carries one bud. A single eased value, Alpha, drives both the swing and the spin, so the parts can't drift out of step.
  • Timing. Alpha runs 0 → 1 → 0 every 2 × Cross Duration. At the default of 2.0 s that is a 4-second cycle, four cycles in the 16-second render.
  • Dynamic version. BP_X20_CrossingGate2 adds a float, a camera orbit, a dolly zoom and a height swing. Every motion is a whole number of cycles per loop, so the loop is seamless.

Motion starts with the assembly. Separate components and a shared motion value keep the two earbuds coordinated while exposing timing and rotation as editable settings.

Motion & Blueprint breakdownExplore the build +
BP_X20_CrossingGateCrossing motion

The buds swing across each other around CrossPivot while spinning, then swing back.

Event Tick → Time ÷ CrossDuration × 180 → cos → Alpha = 0.5 − 0.5 × cos · Swing = Alpha × CrossDegrees · Spin = Alpha × SpinDegrees, with negated copies for the counter motions → Set Relative Rotation on CrossPivot, Arm_L, Arm_R, Bud_L and Bud_R

Settings
Cross Duration2.0 s
Cross Degrees180.0°
Spin Degrees360.0°
Alpha easing, swing and spin.
Rotation applied to pivot, arms and buds.
BP_X20_CrossingGate2Dynamic loop

The crossing motion plus a float, a camera orbit, a dolly zoom and a height swing, all tied to one loop clock. At the defaults that is three crossings in a 12-second loop, the same 4-second rhythm as the first version.

Settings
Loop Duration12.0 s
Crossings Per Loop3.0
Cross Degrees180.0°
Spin Degrees360.0°
Float Height4.0
Orbit Degrees360.0°
Camera Distance560.0
Zoom In0.45
Zoom Cycles Per Loop2.0
Camera Height20.0
Camera Height Swing45.0
Focus Height14.0
Crossing, float, orbit, zoom and height.
Apply earbud motion.
Apply camera and aim.

The details behind the result

Real references, real size

The Blink breakdown compares reference dimensions with model bounds. Raised lenses and sensor domes are called out separately so depth differences stay visible.

See the mesh table

LODs, UVs and collision

Every Blink mesh has three LODs, one UV channel and one simple collision box, checked in wireframe, UV and collision views. Pivots sit where the object moves, like the XT2 head on its ball joint.

See asset checks

Editable materials

A parent material exposes parameters and each finish is an instance: MI_Gold and MI_Aluminium, the doorbell in black and white. LEDs are driven at runtime through material parameters.

See material instances

Event-driven Blueprints

The Blink devices expose PressButton and SetArmed commands. Motion detection responds to overlap events; shared device logic lives in a base class.

See system Blueprints

Readable graphs

Blueprint screenshots show the logic in labelled sections, with exposed settings and motion formulas alongside the graphs.

See the graphs

Asset organisation

Meshes, materials, instances, Blueprints and textures use distinct SM_, M_, MI_, BP_ and T_ prefixes. Named components make assemblies easier to inspect.

Troubleshooting

Reproduce the problem, then narrow it down: empty material slots, the Reference Viewer for missing textures or parents, breakpoints on the node that misbehaves. Black renders on one project came down to an unsaved level.