123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- /**
- * @author Garrett Johnson / http://gkjohnson.github.io/
- * https://github.com/gkjohnson/ply-exporter-js
- *
- * Usage:
- * var exporter = new THREE.PLYExporter();
- *
- * // second argument is an array of attributes to
- * // exclude from the format ('color', 'uv', 'normal')
- * var data = exporter.parse(mesh, [ 'color' ]);
- *
- * Format Definition:
- * http://paulbourke.net/dataformats/ply/
- */
- THREE.PLYExporter = function () {};
- THREE.PLYExporter.prototype = {
- constructor: THREE.PLYExporter,
- parse: function ( object, excludeProperties ) {
- if ( Array.isArray( excludeProperties ) !== true ) {
- excludeProperties = [];
- }
- var includeNormals = excludeProperties.indexOf( 'normal' ) === - 1;
- var includeColors = excludeProperties.indexOf( 'color' ) === - 1;
- var includeUVs = excludeProperties.indexOf( 'uv' ) === - 1;
- // count the number of vertices
- var vertexCount = 0;
- var faceCount = 0;
- var vertexList = '';
- var faceList = '';
- var vertex = new THREE.Vector3();
- var normalMatrixWorld = new THREE.Matrix3();
- object.traverse( function ( child ) {
- if ( child instanceof THREE.Mesh ) {
- var mesh = child;
- var geometry = mesh.geometry;
- if ( geometry instanceof THREE.Geometry ) {
- geometry = new THREE.BufferGeometry().setFromObject( mesh );
- }
- if ( geometry instanceof THREE.BufferGeometry ) {
- var vertices = geometry.getAttribute( 'position' );
- var normals = geometry.getAttribute( 'normal' );
- var uvs = geometry.getAttribute( 'uv' );
- var colors = geometry.getAttribute( 'color' );
- var indices = geometry.getIndex();
- normalMatrixWorld.getNormalMatrix( mesh.matrixWorld );
- if ( vertices === undefined ) {
- return;
- }
- // form each line
- for ( var i = 0, l = vertices.count; i < l; i ++ ) {
- vertex.x = vertices.getX( i );
- vertex.y = vertices.getY( i );
- vertex.z = vertices.getZ( i );
- vertex.applyMatrix4( mesh.matrixWorld );
- // Position information
- var line =
- vertex.x + ' ' +
- vertex.y + ' ' +
- vertex.z;
- // Normal information
- if ( includeNormals === true ) {
- if ( normals !== undefined ) {
- vertex.x = normals.getX( i );
- vertex.y = normals.getY( i );
- vertex.z = normals.getZ( i );
- vertex.applyMatrix3( normalMatrixWorld );
- line += ' ' +
- vertex.x + ' ' +
- vertex.y + ' ' +
- vertex.z;
- } else {
- line += ' 0 0 0';
- }
- }
- // UV information
- if ( includeUVs === true ) {
- if ( uvs !== undefined ) {
- line += ' ' +
- uvs.getX( i ) + ' ' +
- uvs.getY( i );
- } else if ( includeUVs !== false ) {
- line += ' 0 0';
- }
- }
- // Color information
- if ( includeColors === true ) {
- if ( colors !== undefined ) {
- line += ' ' +
- Math.floor( colors.getX( i ) ) + ' ' +
- Math.floor( colors.getY( i ) ) + ' ' +
- Math.floor( colors.getZ( i ) );
- } else {
- line += ' 255 255 255';
- }
- }
- vertexList += line + '\n';
- }
- // Create the face list
- if ( indices !== null ) {
- for ( i = 0, l = indices.count; i < l; i += 3 ) {
- faceList += `3 ${ indices.getX( i + 0 ) + vertexCount }`;
- faceList += ` ${ indices.getX( i + 1 ) + vertexCount }`;
- faceList += ` ${ indices.getX( i + 2 ) + vertexCount }\n`;
- }
- } else {
- for ( var i = 0, l = vertices.count; i < l; i += 3 ) {
- faceList += `3 ${ vertexCount + i } ${ vertexCount + i + 1 } ${ vertexCount + i + 2 }\n`;
- }
- }
- vertexCount += vertices.count;
- faceCount += indices ? indices.count / 3 : vertices.count / 3;
- }
- }
- } );
- var output =
- 'ply\n' +
- 'format ascii 1.0\n' +
- `element vertex ${vertexCount}\n` +
- // position
- 'property float x\n' +
- 'property float y\n' +
- 'property float z\n';
- if ( includeNormals === true ) {
- // normal
- output +=
- 'property float nx\n' +
- 'property float ny\n' +
- 'property float nz\n';
- }
- if ( includeUVs === true ) {
- // uvs
- output +=
- 'property float s\n' +
- 'property float t\n';
- }
- if ( includeColors === true ) {
- // colors
- output +=
- 'property uchar red\n' +
- 'property uchar green\n' +
- 'property uchar blue\n';
- }
- // faces
- output +=
- `element face ${faceCount}\n` +
- 'property list uchar int vertex_index\n' +
- 'end_header\n' +
- `${vertexList}\n` +
- `${faceList}\n`;
- return output;
- }
- };
|