如何在 Three.js 中将两个形状绑定在一起?
我可以将两个不同的形状绑定在一起作为一个形状吗?
例如,将球体和圆柱体结合在一起?
Can I bind two different shapes together as one shape?
For example, binding sphere and cylinder together as one?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有点,是的。有多种选择:
merge()
函数使用add()
函数将一个网格简单地添加到另一个网格,以合并两个add()
函数的顶点和网格 将 em>Geometry 对象合并为一个,该编辑器支持网格之间的布尔运算和导出。方法 1 非常简单:
请注意,重复了 16 个网格,因此一个网格中的细分级别与另一个网格中的细分级别相匹配(以获得不错的外观)。
方法 2.1 - 通过 GeometryUtils
方法 2.2 合并 车床半球 和圆柱体:
我目前无法解决的一个问题来自网格内部的面。理想情况下,这些法线会翻转,因此它们不会渲染,但我还没有找到快速的解决方案。
第三个相当简单。大多数3D 软件包允许对网格进行布尔运算(例如,通过ADD 操作将两个网格合并在一起(meshA + meshB))。尝试在 Blender(免费且开源)中创建一个圆柱体和一个球体,它已经有一个 Three.js 导出器。或者,您可以从 3D 编辑器或选择导出合并网格体的 .obj 文件,并使用 convert_obj_third 脚本。
我发现了另一种方法,它可能更容易/更直观。还记得我上面提到的布尔运算吗?
事实证明,有一个很棒的 JavaScript 库专门用于此目的:构造实体几何:
Chandler Prall 编写了一些方便的函数来连接 CSG 与 Three.js。因此,有了 CSG 库和Three.js 包装器,你可以简单地这样做:
这会给你一个很好的结果(没有额外的面/翻转法线等问题):
Kind of, yes. There are multiple options:
add()
functionmerge()
function to merge vertices and meshes of two Geometry objects into oneMethod 1 is pretty straightforward:
Notice that 16 is repeated, so the subdivisions level in one mesh matches the other (for a decent look).
Method 2.1 - via GeometryUtils
Method 2.2 merging a Lathe half-sphere and a cylinder:
The one problem I can't address at the moment comes from the faces that are inside the mesh. Ideally, those would have normals flipped, so they wouldn't render, but I haven't found a quick solution for that.
The third is fairly straightforward. Most 3D packages allow Boolean operation on meshes (e.g., merging two meshes together with the ADD operation (meshA + meshB)). Try creating a cylinder and a sphere in Blender (free and opensource), which already has a Three.js exporter. Alternatively you can export an .obj file of the merged meshes from your 3D editor or choice and use the convert_obj_three script.
I've found yet another method, which might be easier/more intuitive. Remember the Boolean operations I've mentioned above?
It turns out there is an awesome JavaScript library just for that: Constructive Solid Geometry:
Chandler Prall wrote some handy functions to connect CSG with three.js. So with the CSG library and the Three.js wrapper for it, you can simply do this:
Which gives you a nice result (no problems with extra faces/flipping normals, etc.):