diff --git a/index.html b/index.html index c89cdb7..caf600a 100644 --- a/index.html +++ b/index.html @@ -545,7 +545,7 @@ const modelName = kernel.model.findModelNameByMesh?.(pickedMesh); if (modelName) { console.log('旋转90度,模型名:', modelName); - kernel.transform.addRotation({ + kernel.transform.rotation({ modelId: modelName, vector3: { x: 0, y: 90, z: 0 } }); @@ -564,9 +564,9 @@ const modelName = kernel.model.findModelNameByMesh?.(pickedMesh); if (modelName) { console.log('旋转180度,模型名:', modelName); - kernel.transform.addRotation({ + kernel.transform.rotation({ modelId: modelName, - vector3: { x: 0, y: 180, z: 0 } + vector3: { x: 0, y: 30, z: 0 } }); } else { console.log('未找到模型名称'); diff --git a/index.js b/index.js index 72960db..ae66de0 100644 --- a/index.js +++ b/index.js @@ -29,7 +29,8 @@ const config = { kernel.init(config); kernel.model.add({ modelId: "框架", - modelUrl: "https://sdk.zguiy.com/resurces/model/框架.glb" + modelUrl: "https://sdk.zguiy.com/resurces/model/框架.glb", + modelControlType: "color" }); kernel.model.add({ modelId: "卷帘大", diff --git a/src/babylonjs/AppModel.ts b/src/babylonjs/AppModel.ts index 14adfad..8e2c339 100644 --- a/src/babylonjs/AppModel.ts +++ b/src/babylonjs/AppModel.ts @@ -145,15 +145,6 @@ export class AppModel extends Monobehiver { * @param meshes 网格数组 * @param modelName 模型名称 */ - private cloneMaterials(meshes: AbstractMesh[], modelName: string): void { - meshes.forEach(mesh => { - if (mesh.material) { - const originalMaterial = mesh.material; - const clonedMaterial = originalMaterial.clone(`${originalMaterial.name}_${modelName}`); - mesh.material = clonedMaterial; - } - }); - } /** 为网格设置阴影(投射和接收) */ private createModelRoot(modelId: string, meshes: AbstractMesh[]): AbstractMesh[] { const scene = this.mainApp.appScene.object; @@ -252,7 +243,6 @@ export class AppModel extends Monobehiver { }); if (result.success && result.meshes) { - // this.cloneMaterials(result.meshes, modelName); result.meshes = this.createModelRoot(modelName, result.meshes); this.modelDic.Set(modelName, result.meshes); @@ -292,7 +282,6 @@ export class AppModel extends Monobehiver { if (result.success && result.meshes) { result.meshes = this.createModelRoot(modelId, result.meshes); - this.cloneMaterials(result.meshes, modelId); this.modelDic.Set(modelId, result.meshes); // 存储元数据 @@ -436,9 +425,10 @@ export class AppModel extends Monobehiver { return; } - meshes.forEach(mesh => mesh.dispose()); + this.getModelTransformTargets(meshes).forEach(mesh => mesh.dispose(false, true)); this.modelDic.Remove(modelName); this.modelMetadataDic.Remove(modelName); + this.mainApp.gameManager?.updateDictionaries(); console.log(`Model removed: ${modelName}`); } diff --git a/src/babylonjs/GameManager.ts b/src/babylonjs/GameManager.ts index 4ca78ab..71f6c12 100644 --- a/src/babylonjs/GameManager.ts +++ b/src/babylonjs/GameManager.ts @@ -88,18 +88,26 @@ export class GameManager extends Monobehiver { const scene = this.mainApp.appScene?.object; if (!scene) return; + this.materialDic.Clear(); + this.meshDic.Clear(); + // 更新材质字典 for (const mat of scene.materials) { - if (!this.materialDic.Has(mat.name)) { + if (!(mat as any)._isDisposed && !this.materialDic.Has(mat.name)) { this.materialDic.Set(mat.name, mat as PBRMaterial); } } // 更新网格字典 for (const mesh of scene.meshes) { - if (mesh instanceof Mesh && !this.meshDic.Has(mesh.name)) { + if (mesh instanceof Mesh && !mesh.isDisposed() && !this.meshDic.Has(mesh.name)) { this.meshDic.Set(mesh.name, mesh); } + + const mat = mesh.material; + if (mat instanceof PBRMaterial && !(mat as any)._isDisposed) { + this.materialDic.Set(mat.name, mat); + } } } @@ -742,17 +750,15 @@ export class GameManager extends Monobehiver { * @param target 目标对象 * @param material 材质路径 */ - applyMaterial(target: string, attribute: string, value: number | string): void { - // 这里需要根据实际的材质管理逻辑实现 - console.log(`Applying attribute ${attribute} to ${value}`); -console.log(this.materialDic); + applyMaterial(target: string, attribute: string, value:string): void { + if (attribute !== 'baseColor' || typeof value !== 'string') return; + this.updateDictionaries(); // 示例实现:根据目标和材质路径应用材质 // 1. 查找目标网格 const targetMaterials: PBRMaterial[] = []; this.materialDic.Values().forEach(material => { if (material.name === target) { - console.log(`${this.materialDic.Get(material.name)}`, material); targetMaterials.push(material); } }); @@ -767,30 +773,15 @@ console.log(this.materialDic); // 例如:paint/blue 可以映射到特定的材质配置 // 3. 应用材质到目标网格 + const color = Color3.FromHexString(value); targetMaterials.forEach(material => { - if (attribute === 'baseColor' && typeof value === 'string') { + // 如果是 baseColor 且值是字符串(16进制颜色),转换为 Color3 - const color = Color3.FromHexString(value); - - console.log(`Before: albedoColor =`, material.albedoColor); - console.log(`Before: albedoTexture =`, material.albedoTexture); - - material.albedoColor = color; + material.albedoColor.copyFrom(color); // 如果有纹理,颜色会作为纹理的乘法因子 - if (material.albedoTexture) { - console.log(`Material ${material.name} has albedoTexture, color will tint the texture`); - } - // 强制刷新材质 material.markDirty(); - - console.log(`After: albedoColor =`, material.albedoColor); - console.log(`Applying baseColor ${value} to material: ${material.name}`, color); - } else if (material[attribute]) { - material[attribute] = value; - console.log(`Applying attribute ${attribute} to ${value} to mesh: ${material.name}`); - } }); } } diff --git a/src/kernel/Adapter.ts b/src/kernel/Adapter.ts index 621066a..10614ce 100644 --- a/src/kernel/Adapter.ts +++ b/src/kernel/Adapter.ts @@ -66,7 +66,7 @@ export class KernelAdapter { * 应用材质 * @param options 材质应用选项 */ - apply: (options: { target: string; attribute: string,value:number|string }): void => { + apply: (options: { target: string; attribute: string,value:string }): void => { this.mainApp.gameManager.applyMaterial(options.target, options.attribute,options.value); }, /** @@ -150,17 +150,7 @@ export class KernelAdapter { /** 模型变换管理 */ transform = { /** - * 设置模型旋转 - * @param options 旋转配置 { modelId: string, vector3: { x, y, z }, useDegrees?: boolean } - * @example - * // 使用角度(默认) - * kernel.transform.rotation({ modelId: "model1", vector3: { x: 0, y: 90, z: 0 } }); - * // 使用弧度 - * kernel.transform.rotation({ modelId: "model1", vector3: { x: 0, y: Math.PI / 2, z: 0 }, useDegrees: false }); - */ - rotation: (options: { modelId: string; vector3: { x: number; y: number; z: number }; useDegrees?: boolean }): void => { - this.mainApp.appModel.setRotation(options.modelId, options.vector3, options.useDegrees !== false); - }, + /** * 累加模型旋转 * @param options 旋转配置 { modelId: string, vector3: { x, y, z }, useDegrees?: boolean } @@ -168,7 +158,7 @@ export class KernelAdapter { * // 使用角度(默认) * kernel.transform.addRotation({ modelId: "model1", vector3: { x: 0, y: 90, z: 0 } }); */ - addRotation: (options: { modelId: string; vector3: { x: number; y: number; z: number }; useDegrees?: boolean }): void => { + rotation: (options: { modelId: string; vector3: { x: number; y: number; z: number }; useDegrees?: boolean }): void => { this.mainApp.appModel.addRotation(options.modelId, options.vector3, options.useDegrees !== false); }, /**