在 BabylonJS 中加载 Draco 压缩网格(glTF-Transform)时出错

问题描述 投票:0回答:1

我正在尝试加载 Draco 压缩的网格,使用 glTF-Transform 在服务器端进行处理,在 BabylonJS 中通过 REST 调用动态检索它们。因此,要加载的网格没有扩展名,因为它是内存中的一个 blob,并且方法

URL.createObjectURL()
(用于为此类 blob 提供 URL)不允许指定扩展名或自定义 URL。如果尝试按原样导入 blob,
SceneLoader.ImportMeshAsync()
似乎不知道如何加载它并给出

createModelRenderable.ts:520 Error during loading meshes, try again RuntimeError: Unable to load from blob:http://127.0.0.1:5173/b3b55baa-4ede-41fd-a66e-304460969a7f: importMesh of undefined from undefined version: undefined, exporter version: undefinedimportMesh has failed JSON parse
    at A (sceneLoader.js:343:46)
    at Object.importMesh (babylonFileLoader.js:797:17)
    at sceneLoader.js:382:35
    at A (sceneLoader.js:182:13)
    at fileTools.js:375:9
    at XMLHttpRequest.A (fileTools.js:489:33)

甚至无法加载经典的.glb。这就是为什么您必须指定“.glb”作为

pluginExtension
ImportMeshAsync
参数才能使其工作。通过这样做,经典的
glb
将加载,但 draco 压缩的不会加载,因为(也许?我想)它的模式定义没有指定任何扩展名 mesh.primitive.KHR_draco_mesh_compression.schema.json

createModelRenderable.ts:519 Error during loading meshes, try again RuntimeError: Unable to load from blob:http://127.0.0.1:5173/07f9e64c-2c58-4c64-81c0-54f7d3bbb586: (this.dracoCompression || E8.Default)._decodeMeshToGeometryForGltfAsync is not a function
    at A (sceneLoader.js:343:46)
    at sceneLoader.js:397:21

顺便说一句,

KHR_draco_mesh_compression
已加载,因为尝试再次添加它会引发警告,指出“无需添加 KHR_draco_mesh_compression 扩展,因为它已经存在”。 我已经检查过 draco 的配置没问题,并且默认指向一个有效的 CDN

wasmUrl: “https://preview.babylonjs.com/draco_wasm_wrapper_gltf.js”
wasmBinaryUrl: “https://preview.babylonjs.com/draco_decoder_gltf.wasm”
fallbackUrl: “https://preview.babylonjs.com/draco_decoder_gltf.js”

解码器 wasm 已正确下载。无论如何,我尝试使用本地文件,但结果是一样的。

我还确信网格是有效的 Draco 压缩 GLB 文件,因为它在 https://sandbox.babylonjs.com/

上正确加载

我还尝试将网格作为文件加载,其中包含经典的内容,例如

const loadFileAsync = function (url) {
  return new Promise(function (resolve, reject) {
    LoadFile(
      url,
      function (data) {
        resolve(data);
      },
      undefined,
      undefined,
      true,
      function (_request, exception) {
        reject(exception);
      }
    );
  });
};

然后用

new DracoCompression().decodeMeshAsync()
解码其Draco压缩部分,然后将其与纹理和其余部分混合,但再次没有运气得到“不是Draco文件。”作为响应。

BabylonJS 论坛上的这篇文章似乎也面临同样的问题,但仍然没有任何有效的解决方案。

compression mesh gltf babylonjs
1个回答
0
投票
这是从 blob 加载 Draco 网格的 PG 示例 -

https://playground.babylonjs.com/#FIWM5X#45

© www.soinside.com 2019 - 2024. All rights reserved.