【问题标题】:How to encode/compress gltf to draco如何将 gltf 编码/压缩为 draco
【发布时间】:2019-11-25 00:33:46
【问题描述】:

我想通过 reactjs 在threejs 中以编程方式使用draco 压缩/编码gltf 文件。我不想使用任何命令行工具,我希望它以编程方式完成。请给我一个解决方案。

我尝试使用 gltf-pipeline 但它在客户端不起作用。当我在 reactjs 中使用 Cesium 库时显示错误。

【问题讨论】:

  • 不幸的是,我认为 Draco 编码器没有客户端专用的 JavaScript 实现,只有解码器。
  • 我们可以在客户端(Reactjs)中使用 gltf-pipeline 进行 draco 压缩吗??
  • 哦,对不起,我错了。我猜他们确实连接了编码和解码,至少在 gltf-pipeline 中的 NodeJS 代码中。不过,我从未尝试在浏览器中运行该客户端,不知道如何使其工作。
  • 非常感谢您的回复

标签: reactjs three.js gltf


【解决方案1】:

在最新的1.5.0版本中,这两个文件是什么? draco_decoder_gltf.js 和 draco_encoder_gltf.js。这是否意味着我们不再需要 draco_encoder 和 draco_decoder 文件?以及我们如何在不使用 MeshBuilder 的情况下调用转码器接口。更简单的 API 会更好。

【讨论】:

【解决方案2】:

是的,这可以通过glTF-Transform 来实现。还有一个open feature request on three.js,尚未实现。

首先你需要download the Draco encoder/decoder libraries(当前发布到 NPM 的版本不能在客户端工作),将它们托管在一个文件夹中,然后将它们作为全局脚本标签加载。应该有六个文件和两个脚本标签(将加载剩余的文件)。

文件:

  • draco_decoder.js
  • draco_decoder.wasm
  • draco_wasm_wrapper.js
  • draco_encoder.js
  • draco_encoder.wasm
  • draco_encoder_wrapper.js
<script src="assets/draco_encoder.js"></script>
<script src="assets/draco_decoder.js"></script>

然后您需要编写代码来加载 GLB 文件、应用压缩并对压缩结果执行一些操作。这将需要首先安装下面显示的两个包,然后将 Web 应用程序与您选择的工具捆绑在一起(我在这里使用了https://www.snowpack.dev/)。

import { WebIO } from '@gltf-transform/core';
import { DracoMeshCompression } from '@gltf-transform/extensions';

const io = new WebIO()
    .registerExtensions([DracoMeshCompression])
    .registerDependencies({
        'draco3d.encoder': await new DracoEncoderModule(),
        'draco3d.decoder': await new DracoDecoderModule(),
    });

// Load an uncompressed GLB file.
const document = await io.read('./assets/Duck.glb');

// Configure compression settings.
document.createExtension(DracoMeshCompression)
    .setRequired(true)
    .setEncoderOptions({
        method: DracoMeshCompression.EncoderMethod.EDGEBREAKER,
        encodeSpeed: 5,
        decodeSpeed: 5,
    });

// Create compressed GLB, in an ArrayBuffer.
const arrayBuffer = io.writeBinary(document); // ArrayBuffer

【讨论】:

  • 您好,感谢您的回答。但我想压缩一个场景。我认为WebIO 我只能提供文件uri。是否可以直接给出文件或blob而不是uri?
猜你喜欢
  • 2020-07-15
  • 1970-01-01
  • 2019-10-10
  • 2021-06-20
  • 2020-09-23
  • 2019-09-07
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多