UNPKG

@edsilv/ami.js

Version:

<p align="center"> <img src="https://user-images.githubusercontent.com/214063/46479857-4cd66e80-c7f0-11e8-9585-5748409c9490.png" width="60%"> </p>

74 lines (48 loc) 1.83 kB
/** * @author Mugen87 / https://github.com/Mugen87 */ (function() { // ConvexGeometry function ConvexGeometry(points) { THREE.Geometry.call(this); this.type = 'ConvexGeometry'; this.fromBufferGeometry(new ConvexBufferGeometry(points)); this.mergeVertices(); } ConvexGeometry.prototype = Object.create(THREE.Geometry.prototype); ConvexGeometry.prototype.constructor = ConvexGeometry; // ConvexBufferGeometry function ConvexBufferGeometry(points) { THREE.BufferGeometry.call(this); this.type = 'ConvexBufferGeometry'; // buffers var vertices = []; var normals = []; // execute QuickHull if (THREE.QuickHull === undefined) { console.error('THREE.ConvexBufferGeometry: ConvexBufferGeometry relies on THREE.QuickHull'); } var quickHull = new THREE.QuickHull().setFromPoints(points); // generate vertices and normals var faces = quickHull.faces; for (var i = 0; i < faces.length; i++) { var face = faces[i]; var edge = face.edge; // we move along a doubly-connected edge list to access all face points (see HalfEdge docs) do { var point = edge.head().point; vertices.push(point.x, point.y, point.z); normals.push(face.normal.x, face.normal.y, face.normal.z); edge = edge.next; } while (edge !== face.edge); } // build geometry this.addAttribute('position', new THREE.Float32BufferAttribute(vertices, 3)); this.addAttribute('normal', new THREE.Float32BufferAttribute(normals, 3)); } ConvexBufferGeometry.prototype = Object.create(THREE.BufferGeometry.prototype); ConvexBufferGeometry.prototype.constructor = ConvexBufferGeometry; // export THREE.ConvexGeometry = ConvexGeometry; THREE.ConvexBufferGeometry = ConvexBufferGeometry; })();