前言
近两个星期以来,我一直在努力解决这个问题,并且离解决方案还差得远。我已经问了一些我认为会引导我走向正确方向的子问题:
其中,第二个仍然是相关的,但似乎没有人在咬人,尽管有赏金。所以我现在直接问完整的问题,我会尽量不做任何假设。(提示)解决方案将不胜感激。
问题
我在.json
文件中有几个大型动画 3D 模型,例如可能加载了THREE.JSONLoader
. 它们的格式有点像这样:
{
"metadata": { "formatVersion": 3, ... },
"vertices": [...],
"normals": [...],
"faces": [...],
"morphTargets": [
{ "name": "...", "vertices": [...] },
...
],
"morphNormals": [
{ "name": "...", "normals": [...] },
...
]
}
从主线程执行所有操作时,我已经能够使动画正常工作。但是加载和处理这些大文件会使 GUI 冻结很长时间。所以我需要将这一切委托给一个web-worker,然后在主线程中成功创建动画。
此外,我需要通过transferable objects将结果发送回主线程,以免克隆原始数据阻塞主线程。据我了解,WebGL 使用Float32Array
s,其缓冲区是可传输的对象。所以我确信这是可以做到的。
在我看来,所需的过程如下:
- (UI) ➝发送文件名➝ (工人)
- (worker) ➝下载➝进程➝发送缓冲区(包括morphTargets)➝ (UI)
- (UI) ➝ 在不复制任何缓冲区的情况下重建动画
这是2和3我遇到了麻烦。确切地说,需要在工作人员中创建哪些缓冲区,以及如何使它们在 UI 端表现得像正确的 ( Buffer
) ?Geometry
我试过的
我知道已经存在一个相关问题:
但这个问题似乎过时了。很可能我应该使用THREE.BufferGeometry
没有提到的 a (可能是因为它还不存在)。接受的答案有点令人费解,并且要求我仍然在主线程中做一些原始工作,例如下载模型并渲染它以生成缓冲区。
事实证明,BufferGeometry
还不支持动画。一个satori99最近提交了一个拉取请求以添加此支持。我一直在使用该代码,但到目前为止,还无法将其应用于我的情况。似乎支持仍然很不完整。
这是我最新的拙劣尝试: