javascript - How to merge two geometries or meshes using three.js r71? -
here bumped problem since need merge 2 geometries (or meshes) one. using earlier versions of three.js there nice function:
three.geometryutils.merge(pendulum, ball); however, not on new version anymore.
i tried merge "pendulum" , "ball" following code:
"ball' mesh.
var ballgeo = new three.spheregeometry(24,35,35); var ballmat = new three.meshphongmaterial({color: 0xf7fe2e}); var ball = new three.mesh(ballgeo, ballmat); ball.position.set(0,0,0); var pendulum = new three.cylindergeometry(1, 1, 20, 16); ball.updatematrix(); pendulum.merge(ball.geometry, ball.matrix); scene.add(pendulum); after all, got following error:
three.object3d.add: object not instance of three.object3d. three.cylindergeometry {uuid: "688b0eb1-70f7-4c51-86db-5b1b90a8a24c", name: "", type: "cylindergeometry", vertices: array[1332], colors: array[0]…}three.error @ three_r71.js:35three.object3d.add @ three_r71.js:7770(anonymous function) @ pendulum.js:20
to explain darius' answer more (as struggled it, while trying update version of mr doob's procedural city work face3 boxes):
essentially merging of meshes single geometry. so, if you, instance, want merge box , sphere:
var box = new three.boxgeometry(1, 1, 1); var sphere = new three.spheregeometry(.65, 32, 32); ...into single geometry:
var singlegeometry = new three.geometry(); ...you create mesh each geometry:
var boxmesh = new three.mesh(box); var spheremesh = new three.mesh(sphere); ...then call merge method of single geometry each, passing geometry , matrix of each method:
boxmesh.updatematrix(); // needed singlegeometry.merge(boxmesh.geometry, boxmesh.matrix); spheremesh.updatematrix(); // needed singlegeometry.merge(spheremesh.geometry, spheremesh.matrix); once merged, create mesh single geometry , add scene:
var material = new three.meshphongmaterial({color: 0xff0000}); var mesh = new three.mesh(singlegeometry, material); scene.add(mesh); a working example:
<!doctype html> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r77/three.js"></script> <!-- orbitcontrols.js not versioned , may stop working r77 --> <script src='http://threejs.org/examples/js/controls/orbitcontrols.js'></script> <body style='margin: 0px; background-color: #bbbbbb; overflow: hidden;'> <script> // init renderer var renderer = new three.webglrenderer(); renderer.setsize(window.innerwidth, window.innerheight); document.body.appendchild(renderer.domelement); // init scene , camera var scene = new three.scene(); var camera = new three.perspectivecamera(45, window.innerwidth / window.innerheight, 0.01, 3000); camera.position.z = 5; var controls = new three.orbitcontrols(camera) // our code var box = new three.boxgeometry(1, 1, 1); var sphere = new three.spheregeometry(.65, 32, 32); var singlegeometry = new three.geometry(); var boxmesh = new three.mesh(box); var spheremesh = new three.mesh(sphere); boxmesh.updatematrix(); // needed singlegeometry.merge(boxmesh.geometry, boxmesh.matrix); spheremesh.updatematrix(); // needed singlegeometry.merge(spheremesh.geometry, spheremesh.matrix); var material = new three.meshphongmaterial({color: 0xff0000}); var mesh = new three.mesh(singlegeometry, material); scene.add(mesh); // light var light = new three.hemispherelight(0xfffff0, 0x101020, 1.25); light.position.set(0.75, 1, 0.25); scene.add(light); // render requestanimationframe(function animate(){ requestanimationframe(animate); renderer.render(scene, camera); }) </script> </body> at least, that's how interpreting things; apologies if have wrong, no close being three.js expert (currently learning). had "bad luck" try hand @ customizing mr. doob's procedural city code, when latest version breaks things (the merge stuff being 1 of them, fact three.js no longer uses quads cube -ahem- box geometry other - has led kinds of fun getting shading , such work again).
Comments
Post a Comment