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:
1 parent
c8f1832eae
commit
a0cd95cceb
9 files changed
+97
-18
No files matched your search
@@ -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 } = {}) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in new issue
Block a user