From 4254268f8d3b88f8f79caa323402a99182802880 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Wed, 15 Apr 2026 12:14:27 +0900 Subject: [PATCH] TransformNode --- packages/frontend/src/utility/room/engine.ts | 22 ++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/frontend/src/utility/room/engine.ts b/packages/frontend/src/utility/room/engine.ts index d6e6fa2834..30167df46a 100644 --- a/packages/frontend/src/utility/room/engine.ts +++ b/packages/frontend/src/utility/room/engine.ts @@ -1168,8 +1168,10 @@ export class RoomEngine extends EventEmitter { const filePath = def.path != null ? `/client-assets/room/objects/${def.path}.glb` : `/client-assets/room/objects/${camelToKebab(args.type)}/${camelToKebab(args.type)}.glb`; const loaderResult = await BABYLON.LoadAssetContainerAsync(filePath, this.scene); + const allMeshes = loaderResult.meshes; + // babylonによって自動で追加される右手系変換用ノード - const subRoot = loaderResult.meshes[0] as BABYLON.Mesh; + let subRoot = allMeshes[0] as BABYLON.TransformNode; if (BAKE_TRANSFORM) { subRoot.scaling = new BABYLON.Vector3(1, 1, 1); @@ -1186,7 +1188,7 @@ export class RoomEngine extends EventEmitter { //m.parent = root; } } - for (const m of loaderResult.meshes) { + for (const m of allMeshes) { if (m.name === '__root__') continue; if (m.parent === subRoot) { m.setParent(root); @@ -1297,7 +1299,19 @@ export class RoomEngine extends EventEmitter { subRoot.dispose(); } else { - subRoot.scaling = subRoot.scaling.scale(WORLD_SCALE);// cmをmに + // meshじゃなくtransform nodeにしてパフォーマンス向上 + const _subRoot = new BABYLON.TransformNode('__root__', this.scene); + _subRoot.scaling.x = -1; + _subRoot.scaling = _subRoot.scaling.scale(WORLD_SCALE);// cmをmに + + for (const m of subRoot.getChildren()) { + if (m.parent === subRoot) { + m.parent = _subRoot; + } + } + + subRoot.dispose(); + subRoot = _subRoot; } def.treatLoaderResult?.(loaderResult); @@ -1320,7 +1334,7 @@ export class RoomEngine extends EventEmitter { root.rotation = args.rotation.clone(); root.metadata = metadata; - const model = new ModelManager(BAKE_TRANSFORM ? root : subRoot, loaderResult.meshes.filter(m => m.name !== subRoot), (meshes) => { + const model = new ModelManager(BAKE_TRANSFORM ? root : subRoot, allMeshes.filter(m => m.name !== '__root__'), (meshes) => { if (this.selected?.objectId === args.id) { this.highlightMeshes(meshes); }