提交 2f2d6a07 编写于 作者: M Mr.doob

Added OBJExporter.

上级 d54f2e3f
......@@ -81,6 +81,7 @@
<script src="../examples/js/loaders/ctm/CTMLoader.js"></script>
<script src="../examples/js/exporters/GeometryExporter.js"></script>
<script src="../examples/js/exporters/SceneExporter.js"></script>
<script src="../examples/js/exporters/OBJExporter.js"></script>
<script src="js/libs/signals.min.js"></script>
......
......@@ -38,7 +38,7 @@ Menubar.File = function ( signals ) {
var option = new UI.Panel();
option.setClass( 'option' );
option.setTextContent( 'Export Geometry' );
option.onClick( function () { signals.exportGeometry.dispatch(); } );
option.onClick( function () { signals.exportGeometry.dispatch( { exporter: THREE.GeometryExporter } ); } );
options.add( option );
// export scene
......@@ -49,15 +49,13 @@ Menubar.File = function ( signals ) {
option.onClick( function () { signals.exportScene.dispatch(); } );
options.add( option );
/*
// export OBJ
var option = new UI.Panel();
option.setClass( 'option' );
option.setTextContent( 'Export OBJ' );
option.onClick( function () { alert( 'Export OBJ' ) } );
option.onClick( function () { signals.exportGeometry.dispatch( { exporter: THREE.OBJExporter } ); } );
options.add( option );
*/
//
......
......@@ -667,16 +667,16 @@ var Viewport = function ( signals ) {
} );
signals.exportGeometry.add( function () {
signals.exportGeometry.add( function ( object ) {
if ( !selected.geometry ) {
if ( selected.geometry === undefined ) {
console.warn( "Selected object doesn't have any geometry" );
return;
}
var output = new THREE.GeometryExporter().parse( selected.geometry );
var output = new object.exporter().parse( selected.geometry );
var blob = new Blob( [ output ], { type: 'text/plain' } );
var objectURL = URL.createObjectURL( blob );
......
/**
* @author mrdoob / http://mrdoob.com/
*/
THREE.OBJExporter = function () {};
THREE.OBJExporter.prototype = {
constructor: THREE.OBJExporter,
parse: function ( geometry ) {
console.log( geometry );
var output = '';
for ( var i = 0, l = geometry.vertices.length; i < l; i ++ ) {
var vertex = geometry.vertices[ i ];
output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
}
// uvs
for ( var i = 0, l = geometry.faceVertexUvs[ 0 ].length; i < l; i ++ ) {
var vertexUvs = geometry.faceVertexUvs[ 0 ][ i ];
for ( var j = 0; j < vertexUvs.length; j ++ ) {
var uv = vertexUvs[ j ];
output += 'vt ' + uv.x + ' ' + uv.y + '\n';
}
}
// normals
for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {
var normals = geometry.faces[ i ].vertexNormals;
for ( var j = 0; j < normals.length; j ++ ) {
var normal = normals[ j ];
output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';
}
}
// map
var count = 1; // OBJ values start by 1
var map = [ count ];
for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {
var face = geometry.faces[ i ];
if ( face instanceof THREE.Face3 ) {
count += 3;
} else if ( face instanceof THREE.Face4 ) {
count += 4;
}
map.push( count );
}
// faces
for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {
var face = geometry.faces[ i ];
output += 'f ';
if ( face instanceof THREE.Face3 ) {
output += ( face.a + 1 ) + '/' + ( map[ i ] ) + '/' + ( map[ i ] ) + ' ';
output += ( face.b + 1 ) + '/' + ( map[ i ] + 1 ) + '/' + ( map[ i ] + 1 ) + ' ';
output += ( face.c + 1 ) + '/' + ( map[ i ] + 2 ) + '/' + ( map[ i ] + 2 ) + '\n';
} else if ( face instanceof THREE.Face4 ) {
output += ( face.a + 1 ) + '/' + ( map[ i ] ) + '/' + ( map[ i ] ) + ' ';
output += ( face.b + 1 ) + '/' + ( map[ i ] + 1 ) + '/' + ( map[ i ] + 1 ) + ' ';
output += ( face.c + 1 ) + '/' + ( map[ i ] + 2 ) + '/' + ( map[ i ] + 2 ) + ' ';
output += ( face.d + 1 ) + '/' + ( map[ i ] + 3 ) + '/' + ( map[ i ] + 3 ) + '\n';
}
}
return output;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册