[BUG] Casino: MiuTang (鄧妙婷) dealer bow is wrong — head rises, dress lifts/swings #2
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Service / Project
casino (Node:
pve01, LXC19019/ casino-lxc)Public: https://casino.theforwardway.com
Description
During dealer handover, 鄧妙婷 / MiuTang's bow animation is incorrect. The model is now rigged with 4 bones (Hips/Spine/Spine1/Head) and feet stay planted, but the live bow still fails: the head moves up instead of down, and dress/leg-adjacent meshes lift and swing in Z. Project test
tests/test_miutang_bow_fix.mjsFAILS: "Head must move down at least 10 units" (actual Δy ≈ +37.4). Live top-down camera can show legs behind the table, but the bow peak was not captured in screenshots; code-level FAIL stands.Earlier unrigged-fallback root cause (04:12) is superseded — current path is spine bones (
hasSpine=true); preferred remaining fix is bone-axis / bind-pose correction (or invert Spine rotX sign and re-weight dress/leg verts onto Hips only).Steps to Reproduce
node tests/test_miutang_bow_fix.mjsExpected Behavior
Head/torso bend forward and down; feet and lower body stay planted; dress does not lift/swing backward (same contract as Grace Lee / Asian male spine bows).
Actual Behavior
Head sample Δy ≈ +37.4 (UP); dress AABB minY lifts ~+10.8 and maxZ ~+12.3;
test_miutang_bow_fix.mjsfails. Feet Object_4 minY planted.Error Logs / Evidence
/workspace/casino-qa/casino-retest-20261110-0531.txt§7/workspace/casino-qa/casino-defect-miutang-bow-20261110-0412.txt(root cause outdated; repro still valid)src/main.jsapplyDealerWaistBow(~4280–4358);public/models/MiuTang.glb(4 joints, animations:[])test_miutang_bow_fix.mjs+ top-down handover captureReported automatically by Grok QA Agent (Lumi).
Update from Patrick (06:41 HKT, Nov 10): in the latest casino build MiuTang (鄧妙婷) does not bow at all during the handover. The banner still announces the 70° bow, but the model never performs it. This explains why the 06:02-06:28 HKT screen captures never caught a bow peak from any camera angle. Expected: a correct 70° waist bow with legs and feet planted. Actual: no bow animation plays.
Reported automatically by Grok QA Agent (Lumi).
QA follow-up (2026-11-10 06:45 HKT) — “fails to bow at all” on the latest build
Patrick reported at 06:41 HKT that 鄧妙婷 / MiuTang no longer bows. Read-only retest of the 06:19 tree vs the 05:30 build, plus a headless three.js r160 GLTFLoader sim of
applyDealerWaistBowat peak (1.2217 rad). Full write-up:casino-defect-miutang-nobow-20261110-0641.txt.Deployed site matches the 06:19 build
https://casino.theforwardway.com/→assets/index-DrR0rZdu.js(sha256960685cb…, Last-Modified 2026-11-09 22:19:39 GMT = 06:19:39 HKT)/models/MiuTang.glbsha2562dfe3f9b…, 3,365,592 bytes, Last-Modified 2026-11-09 21:51:36 GMT = 05:51:36 HKT/home/iiaiiappa/PatProject/casinoexactly. The 05:30 bundle wasindex-CJXh54Ih.js; the 05:30 GLB was the same size but a different hash (6b083119…).What is not broken
Bone names are still
Hips / Spine / Spine1 / Head(nomixamorig:prefix).hasSpine=true. Bow amplitude is not 0 (Spine.rotX=1.10,Spine1.rotX=0.15). No clip to miss (animations: []; bow is procedural). Skin is bound to the correct 4-bone skeleton (bindOk=true).applyDealerWaistBowatsrc/main.js:4293-4374is unchanged from 05:30 and still takes the rigged path, so the unrigged fallback is not used.Root cause
The attempted “plant the dress / legs” fix overshot.
public/models/MiuTang.glbwas replaced at 05:51 HKT.Object_2,Object_4andObject_6(body / dress / skirt) are now 100% weighted to Hips. The same assignment is applied again at runtime inloadDealerModel(src/main.js:4270-4282, present inindex-DrR0rZdu.js, absent from the 05:30 bundle). The comment says “for Miu Tang” but the code is not gated onmodelPath. Source of the baked weights:scratch/reweight_miutang.py:50-53(mtime 05:50 HKT):Those meshes are not lower-body only.
Object_2has 413/665 vertices above the Spine pivot (Y=38), up to Y≈57.7 (chest / shoulders, just below the Head bone at Y=58).Object_4has 309 vertices above Y=38.applyDealerWaistBownever rotates Hips, so the visible waist, chest and dress stay still.Object_3/Object_5(face / head) still have the 05:30 Spine1/Head weights and still bow.Headless sim (peak bow,
updateMatrixWorldat rest)From the seated table camera this reads as “she failed to bow”: the torso and dress stay ramrod straight, and the head shears off an unmoving neck (and may dip behind the table rail).
Note on
tests/test_miutang_bow_fix.mjsStill fails at line 117 (“Head must move down at least 10 units”) on both the 05:30 and 05:51 models. That is a test artifact: rest is sampled with
applyBoneTransformbeforeupdateMatrixWorld, so rest head Y comes out as 11.248 instead of 69.248, and the test sees Δy=+37.4. With matrices updated at rest, Δy=-20.60 and the assertion would pass on both models. The test also does not assert that a chest vertex moves, so it cannot catch this regression.Suggested fix (not applied; QA is read-only)
main.js:4270-4282. As written it will stomp a correct blend, and it is not limited to MiuTang. If a runtime guard is kept, only rewrite vertices with model-space Y≤38, and only whenmodelPathincludesMiuTang.updateMatrixWorld(true)before rest samples; add an assertion that an Object_4/Object_2 vertex near Y=50–54 moves forward (Δz>8) and down (Δy<-4) at peak, while a Y≤30 hem/foot vertex stays at delta 0.This does not close #2. The original dress-swing issue is still worth fixing, but the 05:51 weights + the new runtime override are why the waist bow is gone on the live 06:19 build.
Root cause update (latest build, MiuTang does not bow at all)
The banner and the 2.8s–5.5s handover timer still run.
applyDealerWaistBowinsrc/main.js:4293finds the newSpine/Spine1bones (hasSpine=true) and rotates them on +X. That path is correct, and the axis/sign on this Y-up rig would dip the head down and forward. The unrigged fallback is therefore skipped. Idle/mixer do not overwrite the bow (animate()is gated on!isHandoverActive).The visible bow is missing because the torso cannot deform:
Model —
public/models/MiuTang.glb(05:51 HKT, also indist/, md57f94ab2c…) was re-exported byscratch/reweight_miutang.py. It has a valid 4-bone skin (Hips/Spine/Spine1/Head, JOINTS_0/WEIGHTS_0, IBMs OK), but the script binds every vertex ofObject_2,Object_4andObject_6to Hips, not just the legs. Those meshes include the chest and upper dress (Object_2has 287 verts in Y 48–58;Object_4has 309 verts above the waist at Y=38). Only the small neck piece (Object_3) and head/hair (Object_5) follow Spine/Head, so the head dives into a rigid standing bodice. From the table camera there is no waist bow to screenshot.Code —
loadDealerModelatsrc/main.js:4247–4259re-forces the same 100% Hips lock onObject_2/Object_4/Object_6at runtime, which would undo a correct re-skin.False-green test —
tests/test_miutang_bow_fix.mjsnow passes (exit 0, read-only run). It only checks that the feet/dress hem stay still and that the head moves down. It never samples a torso vertex above the waist.Fix
Object_2/Object_4/Object_6by height (Y≤38 Hips; 38–48 blend Hips/Spine; 48–58 Spine/Spine1; then Head). Keep feet and dress hem on Hips.main.js:4247–4259so it cannot wipe those torso weights. Do not flip the Spine +X sign on this rig.Object_2/Object_4vertex with bind-pose Y>48 also moves down and forward.Full write-up:
/workspace/casino-qa/casino-defect-miutang-nobow-20261110.txtReported automatically by Grok QA Agent (Lumi).