This commit is contained in:
syuilo
2026-02-27 15:01:36 +09:00
parent dbfd1a751c
commit 3e7166bd2c
4 changed files with 63 additions and 15 deletions

View File

@@ -103,6 +103,8 @@ type ObjectDef<OpSc extends OptionsSchema = OptionsSchema> = {
default: GetOptionsSchemaValues<OpSc>;
};
placement: 'top' | 'side' | 'bottom' | 'wall' | 'ceiling' | 'floor';
//groupingMeshes: string[]; // multi-materialなメッシュは複数のメッシュに分割されるが、それだと不便な場合に追加の親メッシュでグルーピングするための指定
mergeMeshes?: string[] | null; // multi-materialなメッシュは複数のメッシュに分割されるが、それだと不便な場合にメッシュをマージするための指定
isChair?: boolean;
createInstance: (args: {
room: RoomEngine;
@@ -793,6 +795,20 @@ export class RoomEngine {
const loaderResult = await BABYLON.ImportMeshAsync(`/client-assets/room/objects/${camelToKebab(args.type)}/${camelToKebab(args.type)}.glb`, this.scene);
// babylonによって自動で追加される右手系変換用ード
const subRoot = loaderResult.meshes[0];
subRoot.scaling = subRoot.scaling.scale(WORLD_SCALE);// cmをmに
if (def.mergeMeshes != null) {
for (const groupingMeshKeyword of def.mergeMeshes) {
const meshes = loaderResult.meshes.filter(m => m.name.includes(groupingMeshKeyword));
const merged = BABYLON.Mesh.MergeMeshes(meshes as BABYLON.Mesh[], true, true, undefined, false, true);
merged.name = `${groupingMeshKeyword}.grouped`;
merged.setParent(subRoot);
loaderResult.meshes.push(merged);
}
}
let hasCollisionMesh = false;
for (const mesh of loaderResult.meshes) {
if (mesh.name.includes('__COLLISION__')) {
@@ -808,10 +824,6 @@ export class RoomEngine {
isCollision: !hasCollisionMesh,
};
// babylonによって自動で追加される右手系変換用ード
const subRoot = loaderResult.meshes[0];
subRoot.scaling = subRoot.scaling.scale(WORLD_SCALE);// cmをmに
root.addChild(subRoot);
root.position = args.position.clone();
@@ -1071,20 +1083,35 @@ export class RoomEngine {
const materials = new WeakMap<BABYLON.Material, BABYLON.Material>();
for (const m of ghost.getChildMeshes()) {
for (const m of ghost.getChildMeshes() as BABYLON.Mesh[]) {
m.metadata = { isGhost: true };
m.checkCollisions = false;
if (m.material) {
if (materials.has(m.material)) {
m.material = materials.get(m.material)!;
} else {
const mat = m.material.clone(`${m.material.name}_ghost`);
mat.alpha = 0.3;
mat.transparencyMode = BABYLON.Material.MATERIAL_ALPHABLEND;
materials.set(m.material, mat);
m.material = mat;
if (m.material == null) continue;
if (materials.has(m.material)) {
m.material = materials.get(m.material)!;
continue;
}
if (m.subMeshes != null && m.subMeshes.length > 0 && m.material.subMaterials != null) {
const multiGhostMaterial = m.material.clone(`${m.material.name}_ghost`) as BABYLON.MultiMaterial;
for (let i = 0; i < multiGhostMaterial.subMaterials.length; i++) {
const subMaterial = multiGhostMaterial.subMaterials[i];
const ghostMaterial = subMaterial.clone(`${subMaterial.name}_ghost`);
ghostMaterial.alpha = 0.3;
ghostMaterial.transparencyMode = BABYLON.Material.MATERIAL_ALPHABLEND;
multiGhostMaterial.subMaterials[i] = ghostMaterial;
materials.set(m.material, multiGhostMaterial);
m.material = multiGhostMaterial;
}
} else {
const ghostMaterial = m.material.clone(`${m.material.name}_ghost`);
ghostMaterial.alpha = 0.3;
ghostMaterial.transparencyMode = BABYLON.Material.MATERIAL_ALPHABLEND;
materials.set(m.material, ghostMaterial);
m.material = ghostMaterial;
}
}

View File

@@ -13,7 +13,28 @@ export const books = defineObject({
default: {},
},
placement: 'top',
createInstance: () => {
mergeMeshes: ['__X_BOOK_1__', '__X_BOOK_2__', '__X_BOOK_3__', '__X_BOOK_4__', '__X_BOOK_5__', '__X_BOOK_6__', '__X_BOOK_7__', '__X_BOOK_8__', '__X_BOOK_9__', '__X_BOOK_10__'],
createInstance: ({ findMesh, root }) => {
console.log(root.getChildMeshes().map((m) => m.name));
const bookMeshes = [
findMesh('__X_BOOK_1__'),
findMesh('__X_BOOK_2__'),
findMesh('__X_BOOK_3__'),
findMesh('__X_BOOK_4__'),
findMesh('__X_BOOK_5__'),
findMesh('__X_BOOK_6__'),
findMesh('__X_BOOK_7__'),
findMesh('__X_BOOK_8__'),
findMesh('__X_BOOK_9__'),
findMesh('__X_BOOK_10__'),
];
for (const mesh of bookMeshes) {
mesh.position.z -= Math.random() * 0.005/*cm*/;
mesh.position.y += Math.random() * 0.0025/*cm*/;
}
return {
interactions: {},
};