Thunderous
Devlog

Rings you can see, and three tries at a necklace

Four passes (70 to 73) to make rings and an amulet you can see, on the mannequins and on my own gauntlets, plus two revisions of Astra's mannequins. The tests kept passing on things that were wrong, and the headset kept …

Four passes (70 to 73) to make rings and an amulet you can see, on the mannequins and on my own gauntlets, plus two revisions of Astra's mannequins. The tests kept passing on things that were wrong, and the headset kept catching them.

Mannequins that look like people

I'd asked Astra for "the average human form, with all of the features smoothed off". The first mannequins were jointed wooden lay figures, and they looked strange. Revision 2 starts from a CC0 human base mesh and smooths it into warm plaster figures: male 1.79 meters, female 1.65. The hands and forearms are kept as exact copies of my gauntlet's rig, so armor still fits. Each pose now also carries a corrective blend shape that fixes the body where it bends. A test checks each pose turns on its own shape and no other, because a reimport could drop them and no bone measurement would notice. Pass 70: they "read as people".

Pass 70 also found a seam on both forearms, and the twisted wrists looked odd. Revision 3 shares the body's and forearm's normals at the elbow, so the shading no longer breaks there, and spreads the wrist twist up the forearm. Her first export wouldn't load in Unity at all ("File is corrupted"), though Blender read it fine. Her rewrite had stored 73 shading flags as the wrong FBX type, which Blender tolerates and Autodesk's reader doesn't. She fixed it and now checks her files with the same reader Unity uses. A new test measures the seam: revision 2 was 10.5 degrees off at the elbow, revision 3 is 0.00. Pass 73: the seam is "gone". The wrists are better, but the arms are a bit thin, so the twist still doesn't quite sell. That's noted for later.

Rings you can see

The rings and amulet use the same Quaternius models as their icons. They mount at a bone name that the mannequins and my gauntlets share, PT_LeftHandRing1 for the left ring finger, so one rule covers all of them. That rule is my tenth piece, AccessoryMounts.BoneFor. The rings sit on the ring finger at its base.

Nothing is sized by hand. The game measures the finger and the ring's hole and fits one to the other. The first version measured the finger from the vertices its bone mostly moves. On the gauntlet that was right. On Astra's figures those vertices weren't the visible finger at all: their middle sat 14 mm toward the palm, so every ring went behind its finger. The test passed anyway, because it compared the ring with that same wrong measurement. Now the finger is measured by casting rays across it against the real surface. The test also checks that no part of the ring is inside the hand, and that check fails on the old method.

Pass 70: rings too big, with "a visible gap round the finger". Sizing to the finger's average thickness helped, but pass 71 still showed a gap. A finger is wider than it is deep, about 32 by 23 mm on the figures, so no round ring can fit it. Claude had suggested ovals early on and I'd turned them down. I came back to it: "you were right about possibly making the rings more ovals". Now each ring is stretched to the finger's own width and depth, centered on it. The plate finger is thicker on the back, so centering mattered. The Ring of Renewal's hole turned out to be off-center in its own model, so holes are measured wall by wall too. Result: about a millimeter of gap on every side. Pass 72: "snug, no gap", and the ovals "look right".

Three tries at a necklace

The charm's cord first went "through the shoulders", with the crystal "pointing straight out". The test passed because it only checked the cord's vertices. The cord is a few long straight segments, so a segment between two vertices outside the body can still cut through a shoulder. Now the game builds its own cord: a thin tube laid on the body around the neck at 72 points. The test checks every triangle of it, not just its corners. In pass 71 the cord was right, but hanging the crystal straight down put its point into the chest, because the chest bulges forward below the collarbones. Now the crystal tilts about its clasp until its top and tip sit the same distance off the chest. Pass 72: it "lies along the chest".

A slow test that was also a stutter

The test suite had gone from about 2 minutes to 11 after the new figures went in. I assumed the heavier figures were to blame, and halving the suite by class name didn't find it. Adding a timing for every test found it in one run: my own charm tests, which checked every point against all 13,000 of a figure's triangles. The same code was running in the game, so every pose change on a dressed figure froze for about two-thirds of a second. Now the triangles are sorted into a grid once, and each check only looks at the few near its point. A test confirms the grid gives the same answers as the slow way. A charm fit takes about 130 ms now, and the whole suite runs in under 2 minutes.

Still rough

  • The arms are a bit thin.
  • A charm fit still takes about 130 ms, which may be three times longer on the Quest.
  • Nothing is drawn for the amulet on me, since you never see your own neck.
  • The off-hand and armor slots are still to come.