三.js:如何从Web-worker加载动画.json模型



前言

我已经用

头撞这个将近两个星期了,并没有更接近解决方案。我问了一些我认为会引导我走向正确方向的子问题:

  • 三.js - 如何反序列化 geometry.toJSON()?(几何在哪里?)
  • 三.js:如果我拥有所有必要的缓冲区,如何创建新的"变形"几何体?

其中,第二个仍然相关,但似乎没有人咬人,尽管有赏金。所以我现在直接问完整的问题,我将尽量不做任何假设。(提示)解决方案将不胜感激。

问题

我在.json文件中有几个大型动画 3D 模型,例如可能加载了 THREE.JSONLoader .它们的格式有点像这样:

{
    "metadata": { "formatVersion": 3, ... },
    "vertices": [...],
    "normals": [...],
    "faces": [...],
    "morphTargets": [
        { "name": "...", "vertices": [...] },
        ...
    ],
    "morphNormals": [
        { "name": "...", "normals": [...] },
        ...
    ]
}

我已经能够在从主线程执行所有操作时使动画工作。但是加载和处理这些大文件会使 GUI 长时间冻结。所以我需要将所有这些委托给 Web worker ,然后在主线程中成功创建动画。

此外,我需要通过可传输对象将结果发送回主线程,这样就不会有原始数据的克隆阻塞主线程。据我了解,WebGL使用Float32Array s,其缓冲区是可传输的对象。所以我相信这是可以做到的。

在我看来,所需的过程如下:

  1. (用户界面) ➝ 发送文件名 ➝ (工作人员)
  2. (worker) ➝ 下载 ➝ 进程 ➝ 发送缓冲区(包括 morphTarget) ➝ (UI)
  3. (UI) ➝ 重建动画而不复制任何缓冲区

这是我遇到麻烦的 2 和 3。究竟需要在worker中创建哪些缓冲区,以及如何使它们在UI端表现为适当的(BufferGeometry

我尝试过什么

我知道已经存在一个相关问题:

  • 如何有效地转换三。几何到ArrayBuffer,文件或blob?

但这个问题似乎已经过时了。很可能我应该使用一个THREE.BufferGeometry,没有提到(也许是因为它还不存在)。接受的答案有点复杂,并且要求我仍然在主线程中做一些原始工作,例如下载模型并渲染它以生成缓冲区。

事实证明,BufferGeometry尚不支持动画。一个 satori99 最近提交了一个拉取请求来添加此支持。我一直在使用该代码,但到目前为止,还无法将其应用于我的情况。似乎支持仍然很不完整。

这是我最新的拙劣尝试,以使其正常工作:

  • 主线程(与工作线程通信)
  • 主线程(使用 BufferGeometry)
  • 网络工作者
我想

当我决定破解它时,我可能遇到了和你一样的问题。

我得出的结论是,使用三。几何图形完全是问题所在,专注于创建直接使用 JSON 对象格式 4.3 的 JSON 文件是一个更好的解决方案。

此格式将所有数据存储在 TypedArray 中,加载/解析时无需对这些数据进行计算。因此,加载速度要快得多,而且在大多数情况下,我不必为usung工人而烦恼,因为在加载过程中不再有任何暂停。

不幸的是,这种格式缺少旧 JSON 格式已经支持的许多功能。但它是三.js json 资产的未来首选格式,因此它将发生变化。

就变形动画而言,现有的着色器只要为变形数据传递正确的缓冲区就可以正常工作,但当前的 WebGLRenderer 不会对 BufferGeometry 执行此操作,只为常规几何体执行此操作。

这是BufferGeometry变形的主要障碍。

当我创建该 PR 时,我遵循了 WebGLRenderer 用于为常规几何体创建缓冲区的相同内部逻辑,但从那时起渲染器代码可能发生了一些变化。尤其是在开发分支中。

本周我将再看一看。因为我也需要为我的项目工作:)

最新更新