如何将多个 Blender JSON 模型合并到一个 Three.js Object3D 对象中

How do I merge multiple Blender JSON models into a Three.js Object3D object?

本文关键字:一个 Three js 对象 Object3D Blender JSON 合并 模型      更新时间:2023-09-26

如何将多个Blender JSON模型合并为一个Three.js Object3D对象?据我所知,谷歌没有希望。

如果将它们合并到搅拌机侧,然后导出为整个对象会怎样?

在 Three 中.js您可以合并几何体,如果它们相同,也可以合并材质,但如果您没有相同的几何体并且具有多种材质,那么您就不走运了......

我正在努力解决同样的确切问题,到目前为止,我没有在 Three.js 本身中找到任何解决方案,所以试图在 Blender 方面做到这一点。另一方面,对这个引擎端进行硬编码可能比使用Blender更容易。这是一个很难理解的软件^^

您是否

有理由需要导出的 JSON 对象最终出现在一个 Three.js Object3D 中?用一个父对象控制两个对象就足够了吗?

您可以将对象作为子对象添加到空的父对象,然后对其进行控制。此要点演示了该过程。

var parent = new THREE.Object3D();
parent.add(blenderObj1);
parent.add(blenderObj2);
parent.scale.set(1,2,0.5);

编辑

这是一个场景,演示了您在评论中提到的内容。尝试更改每边的框数(您将获得侧面^2个框)并切换父项。

快速旁注:截至 4 年 25 月 16 日,Chrome 中存在一个错误,可能会导致纹理竞争条件。如果框看起来很有趣,重新加载页面会有所帮助。

为了解决您的问题:

父对象

必须允许用户在父对象中添加和删除对象,

Object3D 有 .add() 和 .remove() 来做到这一点。

.add ( object, ... )

.remove ( object, ... )

,并且父项必须能够作为一个整体进行轮换。

这正是育儿的运作方式。只需执行以下操作:

parent.rotation.x = Math.PI / 2;

所有的孩子都与父母轮换。请注意,它们旋转就像世界旋转一样(因为对它们来说,确实如此)。他们的个人转变是原封不动的。

不将子项合并为单个父项将创建锯齿状动画。

不是固有的。假设您不打算减少绘制调用(下文将详细介绍),使用父对象不会显着影响帧速率。我在旧Macbook Air上的快速测试可以渲染10k个对象而不会发生任何崩溃,即使它开始变热。无论您做什么,10k 对象的性能都会受到影响。

将所有几何图形放在一起将减少绘制调用并加快速度。请记住,所有几何体相对于其他对象都是完全静态的。因此,假设您不能采用 Scharnvirk 建议的明显、优雅且简单得多的解决方案(在 Blender 中制作合并的对象并将其视为单个对象),您可以通过动态克隆几何体来节省少量带宽。在这种情况下,三.js几何有一个 merge() 函数

.merge ( geometry, matrix, materialIndexOffset )

Merge two geometries or geometry and geometry from object (using object's transform)