fix(showroom): Funde der Schlussdurchsicht auf der Testseite behoben

Die Spielfigur wirft jetzt einen Schatten (player.init durchlief applyCharacter
nie); drei stille Fehlerpfade meckern jetzt statt roh abzubrechen (fehlender
Clip fuer die Fingerhaltung, Waffe ohne Griff, mit neuem Test); die
Waffenauswahl im Panel zeigt Beschriftungen statt IDs; der Waffen-Umbau prueft
jetzt die Meshzahl je Datei; stageTransform ist aus main.js nach lineup.js
gezogen und mit dem im Browser gemessenen Fall getestet; slotPosition nimmt
DUMMIES als Argument statt es aus dem Modul zu lesen; dazu Kommentar- und
Entwurfskorrekturen (Docstring, Beckenspur-Test, Frustum-Culling, Port/Kamera/
VIEW_DISTANCE im Entwurf).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5 committed 2026-09-18 03:19:42 +02:00
1 parent c8f1832eae
commit a0cd95cceb
9 files changed
+97 -18

No files matched your search

+1 -1
View File
@@ -83,7 +83,7 @@ export function rigWorld(rig) {
* Weltdrehung Ziel = Weltdrehung MVN · Ruhe-Weltdrehung Ziel, lokal = (Weltdrehung Eltern)⁻¹ · Weltdrehung
*
* Knochen ohne Zuordnung (root, Finger, Blattknochen) gehen mit ihrer Ruhedrehung in die Kette ein und bekommen
* keine Spur. Die Hüfte: cm -> m, mal hipsScale (Beinlänge Ziel ÷ Beinlänge Quelle), dann in den Raum ihres
* keine Spur. Die Hüfte: cm -> m, mal hipsScale (Hüfthöhe Ziel ÷ Hüfthöhe Quelle), dann in den Raum ihres
* Elternknochens, der dafür unbewegt sein muss.
*/
export function createRetargeter(rig, { boneMap = BONE_MAP, hipsScale = 1 } = {}) {
+8 -3
View File
@@ -139,9 +139,14 @@ async function encodeWebp(image, quality) {
export async function buildWeapon(source, packDir, loadFbx) {
const dir = join(packDir, source.dir);
const fbx = await loadFbx(join(dir, source.mesh));
let mesh = null;
fbx.traverse((object) => { if (!mesh && object.isMesh) mesh = object; });
if (!mesh) throw new Error(`${source.id}: kein Mesh in ${source.mesh}`);
const meshes = [];
fbx.traverse((object) => { if (object.isMesh) meshes.push(object); });
if (meshes.length === 0) throw new Error(`${source.id}: kein Mesh in ${source.mesh}`);
// Der Entwurf misst "genau ein Mesh mit einem Material" je Datei; hier wird das geprüft statt nur vorausgesetzt.
if (meshes.length > 1) {
throw new Error(`${source.id}: ${meshes.length} Meshes in ${source.mesh}, erwartet genau eins`);
}
const mesh = meshes[0];
const { positions, normals, uvs } = meshArrays(mesh.geometry, mesh.quaternion);
const length = checkLength(source.id, positions, source.length);