我是新來的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