前言
我已经用头撞这个将近两个星期了,并没有更接近解决方案。我问了一些我认为会引导我走向正确方向的子问题:
- 三.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,其缓冲区是可传输的对象。所以我相信这是可以做到的。
在我看来,所需的过程如下:
- (用户界面) ➝ 发送文件名 ➝ (工作人员)
- (worker) ➝ 下载 ➝ 进程 ➝ 发送缓冲区(包括 morphTarget) ➝ (UI)
- (UI) ➝ 重建动画而不复制任何缓冲区
这是我遇到麻烦的 2 和 3。究竟需要在worker中创建哪些缓冲区,以及如何使它们在UI端表现为适当的(Buffer
)Geometry
?
我尝试过什么
我知道已经存在一个相关问题:
- 如何有效地转换三。几何到ArrayBuffer,文件或blob?
但这个问题似乎已经过时了。很可能我应该使用一个THREE.BufferGeometry
,没有提到(也许是因为它还不存在)。接受的答案有点复杂,并且要求我仍然在主线程中做一些原始工作,例如下载模型并渲染它以生成缓冲区。
事实证明,BufferGeometry
尚不支持动画。一个 satori99 最近提交了一个拉取请求来添加此支持。我一直在使用该代码,但到目前为止,还无法将其应用于我的情况。似乎支持仍然很不完整。
这是我最新的拙劣尝试,以使其正常工作:
- 主线程(与工作线程通信)
- 主线程(使用 BufferGeometry)
- 网络工作者
当我决定破解它时,我可能遇到了和你一样的问题。
我得出的结论是,使用三。几何图形完全是问题所在,专注于创建直接使用 JSON 对象格式 4.3 的 JSON 文件是一个更好的解决方案。
此格式将所有数据存储在 TypedArray 中,加载/解析时无需对这些数据进行计算。因此,加载速度要快得多,而且在大多数情况下,我不必为usung工人而烦恼,因为在加载过程中不再有任何暂停。
不幸的是,这种格式缺少旧 JSON 格式已经支持的许多功能。但它是三.js json 资产的未来首选格式,因此它将发生变化。
就变形动画而言,现有的着色器只要为变形数据传递正确的缓冲区就可以正常工作,但当前的 WebGLRenderer 不会对 BufferGeometry 执行此操作,只为常规几何体执行此操作。
这是BufferGeometry变形的主要障碍。
当我创建该 PR 时,我遵循了 WebGLRenderer 用于为常规几何体创建缓冲区的相同内部逻辑,但从那时起渲染器代码可能发生了一些变化。尤其是在开发分支中。
本周我将再看一看。因为我也需要为我的项目工作:)