【发布时间】:2015-03-09 16:06:05
【问题描述】:
序言
我已经在这个问题上苦苦挣扎了将近两个星期,但离解决方案还差得远。我问了一些我认为会引导我走向正确方向的子问题:
- Three.js - How to deserialize geometry.toJSON()? (where is geometry.fromJSON?)
- Three.js: How to create new 'morphing' geometry if I have all necessary buffers?
其中,第二个仍然是相关的,但似乎没有人在咬人,尽管有赏金。所以我现在直接问完整的问题,我会尽量不做任何假设。 (提示)解决方案将不胜感激。
问题
我在.json 文件中有几个大型动画 3D 模型,例如可能用THREE.JSONLoader 加载。它们的格式有点像这样:
{
"metadata": { "formatVersion": 3, ... },
"vertices": [...],
"normals": [...],
"faces": [...],
"morphTargets": [
{ "name": "...", "vertices": [...] },
...
],
"morphNormals": [
{ "name": "...", "normals": [...] },
...
]
}
在从主线程执行所有操作时,我已经能够使动画正常工作。但是加载和处理这些大文件会使 GUI 冻结很长时间。所以我需要把这一切都委托给一个web-worker,然后在主线程中成功创建动画。
另外,我需要将结果通过transferable objects发回主线程,这样就不会有原始数据的克隆阻塞主线程。据我了解,WebGL 使用Float32Arrays,其缓冲区是可传输的对象。所以我确信这是可以做到的。
在我看来,所需的过程如下:
- (UI) ➝ 发送文件名 ➝ (worker)
- (worker) ➝ 下载 ➝ 进程 ➝ 发送缓冲区(包括 morphTargets) ➝ (UI)
- (UI) ➝ 在不复制任何缓冲区的情况下重建动画
我遇到问题的是 2 和 3。确切地说,需要在工作人员中创建哪些缓冲区,以及如何使它们在 UI 端表现得像正确的 (Buffer)Geometry?
我的尝试
我知道已经存在一个相关问题:
但这个问题似乎过时了。我很可能应该使用THREE.BufferGeometry,它没有被提及(可能是因为它还不存在)。接受的答案有点复杂,需要我在主线程中做一些原始工作,比如下载模型并渲染它以生成缓冲区。
事实证明,BufferGeometry 还不支持动画。一位satori99 最近提交了pull request 以添加此支持。我一直在使用该代码,但到目前为止,还无法将其应用于我的情况。看来支持还是很不完善的。
这是我最新的拙劣尝试:
【问题讨论】:
-
你可以像this example一样使用worker来加载文件。我预计您的情况较慢的是
THREE.Geometry的创建。相反,创建THREE.BufferGeometry会更好,并且可能可以在主线程中完成而不会对性能造成太大影响。不幸的是,您需要的所有部件都还没有。三.js r.70 -
@WestLangley:是的,确实如此。这绝对是
THREE.Geometry的创造。从转移的TypedArrays 创建一个THREE.BufferGeometry将消除性能损失,因为所有工作都可以在worker 中完成。 --- 无论如何,我现在知道如何处理网络工作者了。问题是动画部分。任何帮助使 satori99 的代码工作,甚至直接侵入WebGLRenderer以便我可以得到一些东西,将不胜感激!
标签: javascript animation three.js web-worker transferable