Blending Physical and Digital Worlds

Crystal Loop Series

znmatl

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).

ComfyUI · FLUX.1-schnell · custom LoRA (kohya) · img2img material pass · RIFE · custom nodes

grow_b (part 04)

Grown from part 04 of the hand-picked parts bin.

grow_c (part 08)

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.

Side-by-side frames 1, 5 and 9 for grow, grow_b, grow_c and grow_e

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 source chunkgrow_e_rise: Parts-bin pick (part 06), hand-picked.
t10 source chunkt10: New txt2img chunk, seed 285059601108378 (batch of 4, image 2).
t12 source chunkt12: New txt2img chunk, seed 285059601108378 (batch of 4, image 4).
t14 source chunkt14: New txt2img chunk, seed 716456748917029 (batch of 4, image 2).
t15 source chunkt15: 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.

chunkframe 1frame 5frame 9
part 06part 06, frame 1part 06, frame 5part 06, frame 9
t10t10, frame 1t10, frame 5t10, frame 9
t12t12, frame 1t12, frame 5t12, frame 9
t14t14, frame 1t14, frame 5t14, frame 9
t15t15, frame 1t15, frame 5t15, frame 9
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)

  1. Candidates. 32 generations with LoRA v1, then 9 picked by eye.
  2. Parts bin. The picks are cut out with a PZ Void Black mask. Parts bin: 9 hand-picked crystals cut out from 32 generations
  3. Train LoRA v2 on the 9 picks. v1 vs v2 at the same seed: v2 holds the look. LoRA v1 vs v2 at the same seed
  4. Storyboard. The motion is planned first: the chosen chunk is placed and scaled across 9 frames, like a flipbook sketch.
  5. 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.
  6. 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)
Text encoders / VAE
clip_l + t5xxl_fp16 / ae.safetensors
LoRA
znmatl_material_v2 (step 1200), strength 1.0, trigger “znmatl”
KSampler
seed 421337 (fixed), 4 steps, CFG 1.0, euler, simple, denoise 0.40
Negative
none (FLUX; negative zeroed with ConditioningZeroOut)
Post
PZ Void Black → RIFE v4.9 (rife49) x8 (fast mode + ensemble on, scale 1.0) → H.264, 24 fps, ping-pong

Prompt

znmatl, a single large faceted chunk floating in a pure black void

Candidates

32 txt2img runs with LoRA v1 at strength 1.0: 1024×1024, 4 steps, CFG 1, euler / simple, same prompt, random seed per candidate.

LoRA training (kohya sd-scripts, FLUX.1-schnell base, fp8 during training only)

producer@phyxyzin.com · LinkedIn