znmatl is a locked crystal material: saturated pink hard-candy facets, picked by eye and then held in place with a custom-trained LoRA, so every frame and every animation renders the same material.
Grow
Not the morphing crystal yet, but an interesting step on the way there: the znmatl material, grown four ways. The material, prompt, seed and settings are the same in every variation; only the scripted storyboard changes.
grow (plain)
A locked crystal material, “znmatl” (saturated pink hard-candy facets), grows from a seed to full size in a seamless loop. I picked the look by eye, locked it with a custom-trained LoRA, and then ran every animation frame through that same material so the crystal stays consistent from seed to full size. The whole pipeline is local and commercial-safe: FLUX.1-schnell (Apache 2.0), kohya sd-scripts, RIFE, and custom ComfyUI nodes I wrote for this project (PZ Void Black, PZ Save Pair).
Grown from part 08 of the parts bin, which gives a lumpier, more clustered silhouette.
grow_e (rise)
The crystal rises in from the bottom of the frame while it grows. This render opens the Rise set below, where it plays next to four other chunks on the same path.
All variations side by side
Frames 1, 5 and 9 of each variation.
Rise set
Five different znmatl chunks travel the identical rise path and get the identical material pass. The shapes change but the material doesn’t, which shows the v2 LoRA holding the look across new shapes.
Rise path (same for all five): 9 frames at 768 px, ease-in-out; center moves from 0.80 to 0.50 of frame height, size from 0.12 to 0.78 of the frame, rotation from 0° to 8°. Material pass: v2 LoRA at 1.0, seed 421337, 4 steps, CFG 1, euler / simple, denoise 0.40, then RIFE x8. New chunks come from txt2img with FLUX.1-schnell + znmatl v2 LoRA (step 1200) at 1.0, shape prompt “a single large faceted chunk”.
grow_e_rise: Parts-bin pick (part 06), hand-picked.t10: New txt2img chunk, seed 285059601108378 (batch of 4, image 2).t12: New txt2img chunk, seed 285059601108378 (batch of 4, image 4).t14: New txt2img chunk, seed 716456748917029 (batch of 4, image 2).t15: New txt2img chunk, seed 716456748917029 (batch of 4, image 3).
Planned direction (not built yet): cut the rise into a fast grow-and-recede cycle synced to the beat.
Rise set side by side
Each row is a different crystal chunk, and each column is the same moment in the rise. All five follow the same path and come out in the same material, so they grow at the same rate and keep the same pink hard-candy look.
chunk
frame 1
frame 5
frame 9
part 06
t10
t12
t14
t15
startfull size
Every cell uses the same crop of the frame, so the size growth is to scale.
How It Was Made (shared by every znmatl piece)
Candidates. 32 generations with LoRA v1, then 9 picked by eye.
Parts bin. The picks are cut out with a PZ Void Black mask.
Train LoRA v2 on the 9 picks. v1 vs v2 at the same seed: v2 holds the look.
Storyboard. The motion is planned first: the chosen chunk is placed and scaled across 9 frames, like a flipbook sketch.
Material pass. Each frame is lightly re-rendered with the custom LoRA (denoise 0.40). The goal is that nothing visibly changes: every frame comes out as the same material instead of drifting, which is what keeps the animation from flickering.
Finish. PZ Void Black, then RIFE x8 in-betweens, then a forward-and-back loop at 24 fps.
Material pass (img2img, 768×768, 9 frames per variation)
Base model
flux1-schnell.safetensors (full precision, no quantization at inference)