我是新来的three.js世界... 我的问题是:我可以将两个不同的形状绑定为一个形状吗? 例如将球体和圆柱体结合为一体?Three.js - 将两个形状绑定为一个?
20
A
回答
40
的,是的,可以有多种选择种类:
- 通过层次结构可以在一个网状通过GeometryUtil的
merge()
功能使用add()
功能 - 合并两个几何对象的顶点和网格简单地添加到另一个使用支持网格之间的布尔运算和导出的基本3D编辑器将其编辑为一个
- 。
方法1是非常简单的:
var sphere = new THREE.Mesh(new THREE.SphereGeometry(100,16,12),new THREE.MeshLambertMaterial({ color: 0x2D303D, wireframe: true, shading: THREE.FlatShading }));
var cylinder = new THREE.Mesh(new THREE.CylinderGeometry(100, 100, 200, 16, 4, false),new THREE.MeshLambertMaterial({ color: 0x2D303D, wireframe: true, shading: THREE.FlatShading }));
cylinder.position.y = -100;
scene.add(sphere);
scene.add(cylinder);
注意16重复,所以细分水平在一个网格相匹配的其他(一个体面的样子)
法2.1 - 通过GeometryUtils
//make a sphere
var sg = new THREE.SphereGeometry(100,16,12);
//make cylinder - ideally the segmentation would be similar to predictable results
var cg = new THREE.CylinderGeometry(100, 100, 200, 16, 4, false);
//move vertices down for cylinder, so it maches half the sphere - offset pivot
for(var i = 0 ; i < cg.vertices.length; i++) cg.vertices[i].position.y -= 100;
//merge meshes
THREE.GeometryUtils.merge(sg,cg);
var mesh = new THREE.Mesh(sg,new THREE.MeshLambertMaterial({ color: 0x2D303D, wireframe: true, shading: THREE.FlatShading }));
scene.add(mesh);
方法2.2合并一个Lathe half-sphere和汽缸:
var pts = [];//points array
var detail = .1;//half-circle detail - how many angle increments will be used to generate points
var radius = 100;//radius for half_sphere
var total = Math.PI * .51;
for(var angle = 0.0; angle < total ; angle+= detail)//loop from 0.0 radians to PI (0 - 180 degrees)
pts.push(new THREE.Vector3(0,Math.cos(angle) * radius,Math.sin(angle) * radius));//angle/radius to x,z
var lathe = new THREE.LatheGeometry(pts, 16);//create the lathe with 12 radial repetitions of the profile
//rotate vertices in lathe geometry by 90 degrees
var rx90 = new THREE.Matrix4();
rx90.setRotationFromEuler(new THREE.Vector3(-Math.PI * .5,0,0));
lathe.applyMatrix(rx90);
//make cylinder - ideally the segmentation would be similar for predictable results
var cg = new THREE.CylinderGeometry(100, 100, 200, 16, 4, false);
//move vertices down for cylinder, so it maches half the sphere
for(var i = 0 ; i < cg.vertices.length; i++) cg.vertices[i].position.y -= 100;
//merge meshes
THREE.GeometryUtils.merge(lathe,cg);
var mesh = new THREE.Mesh(lathe, new THREE.MeshLambertMaterial({ color: 0x2D303D, wireframe: true, shading: THREE.FlatShading }));
mesh.position.y = 150;
scene.add(mesh);
我目前无法解决的一个问题来自网格内的面。理想情况下,那些将正常翻转,所以他们不会渲染,但没有找到一个快速的解决方案。
第三个很简单。大多数3D软件包允许在网格上进行布尔操作(例如,使用ADD操作(meshA + meshB)将两个网格合并在一起)。尝试在Blender(免费,开源)中创建一个圆柱和一个球体,其中已有一个three.js导出器。或者,您可以从您的3d编辑器或选择中导出合并网格的.obj文件,并使用convert_obj_three脚本。
更新
我找到了另一种方法,它可能会更容易/更直观。还记得上面提到的布尔操作吗?
原来有一个真棒JS库只是为:Constructive Solid Geometry:
钱德勒普劳尔写了一些方便的功能来连接CSG with three.js。因此,与CSG库和three.js wrapper for it,你可以简单地这样做:
var cylinder = THREE.CSG.toCSG(new THREE.CylinderGeometry(100, 100, 200, 16, 4, false),new THREE.Vector3(0,-100,0));
var sphere = THREE.CSG.toCSG(new THREE.SphereGeometry(100,16,12));
var geometry = cylinder.union(sphere);
var mesh = new THREE.Mesh(THREE.CSG.fromCSG(geometry),new THREE.MeshNormalMaterial());
它给你一个很好的结果(额外的面孔/翻转法线/等没有问题。):
6
相关问题
- 1. 将两个VerticalScrollBars绑定到另一个
- 2. Three.js - 自定义形状?
- 3. 绑定到一组形状?
- 4. KineticJS:两个形状
- 5. 将DataContext绑定到一个矩形
- 6. 着色three.js形状的个人面孔
- 7. Excel VBA将一个形状与另一个形状比较
- 8. Three.js将两个对象作为一个连接
- 9. 将两个APK绑定在一起
- 10. 通过svg将两种形状合并为一种形状
- 11. 在Three.js中将纹理绘制为自定义形状
- 12. 将两种形式结合为一个
- 13. 只有两个形状之一绘制
- 14. 将一个字符串解析为一个形状
- 15. 将两个不同形状的numpy阵列合并为一个阵列
- 16. 如何在three.js中查看两边的自定义2D形状
- 17. 创建一个只有两个圆边的矩形形状
- 18. THREE.JS创建自定义3D形状
- 19. 一个集合,两个绑定
- 20. C#ScatterView,如何将两个项目绑定在一起以表现为一个?
- 21. 将矩形位置绑定到另一个矩形
- 22. three.js所 - 形状消失在另一面
- 23. 画一个形状
- 24. Java2D - 变形/内插两个形状
- 25. 如何看待一个形状作为一个图形2D
- 26. Slick2d形状包含另一个形状
- 27. SVG:使一个梯度以填充整个形状为给定
- 28. three.js所:如何获得一个网状
- 29. Three.js几何形状拉伸?
- 30. 如何将一个Pyglet精灵与一个Pymunk形状绑定在一起以便它们一起旋转?
我想所有这些东西,谢谢你的答案!我问这个问题,因为我试图创建具有几何形状和纹理的3D花。我的目的是绑定形状,所以我可以旋转并拖动整个花朵形状,而不是将每个形状连成一个整体形状 – BorisD
听起来有点像[Hello Enjoy的HelloFlower应用](http://helloenjoy.com/helloflower/)。在这种情况下,我会说,在顶部有一个空的“容器”Object3D,然后将花瓣,雌蕊等添加到该容器中,以便您可以一起操作组。像第一个建议,但不是直接添加到场景中,而是添加到容器('scene.add(container); container.add(flowerPartA); container.add(flowerPartB); // etc.') –
哇!这是一个很好的例子......并不完全是我想要建立的,但也有一些类似的东西。在过去的几天里,我取得了很好的进展。我希望我将发布的最后一个例子将帮助Three.js的初学者解决一些小而大的问题。但是仍然有一些我仍然不熟悉的小东西......我怎样才能创造出像点开始于X点并终点在Y点的圆柱形状......现在我唯一能想出来的就是制作一个圆筒并旋转它? – BorisD