使用 BABYLON.SceneLoader.AppendAsync 和 gltf 文件设置回退目录

Set fallback directory with BABYLON.SceneLoader.AppendAsync and gltf file

我正在尝试修改现有项目,我想在加载 GLTF 文件时设置后备纹理

BABYLON.GLTFFileLoader.IncrementalLoading = false;
        BABYLON.SceneLoader.AppendAsync(rootPath, 'data:' + gltfContent, scene, undefined, '.gltf').then(function () {
            scene.createDefaultCameraOrLight(true);
            scene.activeCamera.attachControl(canvas);
            scene.activeCamera.wheelDeltaPercentage = 0.005;

我不知道具体怎么做。 更好的方法是什么?我应该阅读 GLTF 并修改 URI 吗? 我认为使用一些回调是更好的解决方案 有人是 babylon.js 的专家吗? 谢谢

Babylon 的 GLTF 2.0 加载器有一个扩展系统,可以将其视为加载过程每个步骤的基于承诺的插件。 您可以在此处查看扩展的一些示例:

https://github.com/BabylonJS/Babylon.js/tree/master/loaders/src/glTF/2.0/Extensions

您的情况可能非常有趣的是:

https://github.com/BabylonJS/Babylon.js/blob/master/loaders/src/glTF/2.0/Extensions/KHR_texture_transform.ts

如您所见,此扩展包含一个名为 loadTextureInfoAsync 的函数,该函数 returns 在收到即将加载的纹理信息后完成时的承诺。

根据您的用例,您可以完全替换加载纹理功能或扩展它(如上例所示)。要覆盖它,您应该自己实现该功能:

public loadTextureInfoAsync(context: string, textureInfo: ITextureInfo, assign: (babylonTexture: BaseTexture) => void): Nullable<Promise<BaseTexture>> {
    const texture = loadTheTextureYourselfWithFallback();
    return Promise.resolve(texture);
}

当然,加载功能需要按照你的逻辑来实现