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

Cleaned up STLLoader and example.

上级 ade8768e
......@@ -2,28 +2,26 @@
* @author aleeper / http://adamleeper.com/
* @author mrdoob / http://mrdoob.com/
*
* Description: A THREE loader for STL ASCII files, as created
* by Solidworks and other CAD programs.
* Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.
*
* Limitations: Currently supports ASCII format only
*
* Usage:
* var loader = new THREE.STLLoader();
* loader.addEventListener( 'load', function ( event ) {
* var object = event.content;
* // Optionally apply some sort of material...
* if(material instanceof THREE.Material){
* for ( var i = 0; i < object.children.length; i ++ ) {
* object.children[ i ].material = material;
* }
* }
* object.updateMatrix(); // Not sure if this is needed.
* stl = object;
* init();
* animate();
* } );
* loader.load( './models/stl/slotted_disk.stl' );
* var loader = new THREE.STLLoader();
* loader.addEventListener( 'load', function ( event ) {
*
* var object = event.content;
*
* for ( var i = 0; i < object.children.length; i ++ ) {
*
* object.children[ i ].material = material;
*
* }
*
* scene.add( object );
*
* } );
* loader.load( './models/stl/slotted_disk.stl' );
*/
......@@ -35,12 +33,12 @@ THREE.STLLoader = function () {
THREE.STLLoader.prototype = {
constructor: THREE.STLLoader,
constructor: THREE.STLLoader,
load: function ( url ) {
load: function ( url ) {
var scope = this;
var xhr = new XMLHttpRequest();
var scope = this;
var xhr = new XMLHttpRequest();
xhr.addEventListener( 'load', function ( event ) {
......@@ -63,49 +61,58 @@ THREE.STLLoader.prototype = {
xhr.open( 'GET', url, true );
xhr.send( null );
},
},
parse: function ( data ) {
function face3( a, b, c, normals ) {
return new THREE.Face3( a, b, c, normals );
}
var group = new THREE.Object3D();
var geometry = new THREE.Geometry();
var pattern, result;
pattern = /facet([\s\S]*?)endfacet/g;
while ( ( result = pattern.exec( data ) ) != null ) {
facet_text = facet_result[ 0 ];
var face_normal = new THREE.Vector3();
// Normal
pattern = /normal[\s]+([-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+/g;
while( ( result = pattern.exec( facet_text ) ) != null ) {
var normal = new THREE.Vector3( +( result[1]), +( result[3] ), +( result[5] ) );
parse: function ( data ) {
}
function face3( a, b, c, normals ) {
return new THREE.Face3( a, b, c, normals );
}
// Vertex
pattern = /vertex[\s]+([-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+/g;
while( ( result = pattern.exec( facet_text ) ) != null ) {
var group = new THREE.Object3D();
var geometry = new THREE.Geometry();
geometry.vertices.push( new THREE.Vector3(+(result[1]), +(result[3]), +(result[ 5 ] ) ) );
var pattern, result;
}
facet_pattern = /facet([\s\S]*?)endfacet/g;
while ( ( facet_result = facet_pattern.exec( data ) ) != null ) {
facet_text = facet_result[0];
var len = geometry.vertices.length;
geometry.faces.push( face3( len - 3, len - 2, len - 1, normal ) );
var face_normal = new THREE.Vector3();
}
// Find the normal info
normal_pattern = /normal[\s]+([-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+/g;
while( (normal_result = normal_pattern.exec(facet_text)) != null )
{
//console.log(vsprintf("normal: %f %f %f", [+(normal_result[1]), +(normal_result[3]), +(normal_result[5])]));
var face_normal = new THREE.Vector3( +(normal_result[1]), +(normal_result[3]), +(normal_result[5]) );
//geometry.normals.push(new THREE.Vector3( +(normal_result[1]), +(normal_result[3]), +(normal_result[5])));
}
geometry.computeCentroids();
group.add( new THREE.Mesh( geometry, new THREE.MeshLambertMaterial() ) );
// Find the vertex info
vertex_pattern = /vertex[\s]+([-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+/g;
while( (vertex_result = vertex_pattern.exec(facet_text)) != null )
{
//console.log(vsprintf("vertex: %f %f %f", [+(vertex_result[1]), +(vertex_result[3]), +(vertex_result[5])]));
geometry.vertices.push(new THREE.Vector3(+(vertex_result[1]), +(vertex_result[3]), +(vertex_result[5])));
}
return group;
var len = geometry.vertices.length;
geometry.faces.push( face3(len-3, len-2, len-1, face_normal) );
}
}
geometry.computeCentroids();
group.add( new THREE.Mesh( geometry, new THREE.MeshLambertMaterial() ) );
return group;
}
};
......@@ -47,25 +47,8 @@
var camera, scene, renderer, objects;
var particleLight, pointLight;
var stl;
var material = new THREE.MeshPhongMaterial( { ambient :0xFF0000, color: 0xFF0000, specular: 0xFFFFFF } );
var loader = new THREE.STLLoader();
loader.addEventListener( 'load', function ( event ) {
var object = event.content;
if(material instanceof THREE.Material){
for ( var i = 0; i < object.children.length; i ++ ) {
object.children[ i ].material = material;
}
}
object.updateMatrix();// Not sure if this is needed.
stl = object;
init();
animate();
} );
var file_path = './models/stl/slotted_disk.stl';
loader.load( file_path );
init();
function init() {
......@@ -97,9 +80,27 @@
var line = new THREE.Line( geometry, material, THREE.LinePieces );
scene.add( line );
// Add the STL file
var loader = new THREE.STLLoader();
loader.addEventListener( 'load', function ( event ) {
var object = event.content;
var material = new THREE.MeshPhongMaterial( { ambient: 0xff0000, color: 0xff0000, specular: 0xffffff } );
console.log( object );
for ( var i = 0; i < object.children.length; i ++ ) {
object.children[ i ].material = material;
}
scene.add( object );
animate();
} );
loader.load( './models/stl/slotted_disk.stl' );
scene.add( stl );
particleLight = new THREE.Mesh( new THREE.SphereGeometry( 4, 8, 8 ), new THREE.MeshBasicMaterial( { color: 0xffffff } ) );
scene.add( particleLight );
......@@ -108,7 +109,7 @@
scene.add( new THREE.AmbientLight( 0xcccccc ) );
var directionalLight = new THREE.DirectionalLight(/*Math.random() * 0xffffff*/0xeeeeee );
var directionalLight = new THREE.DirectionalLight( 0xeeeeee );
directionalLight.position.x = Math.random() - 0.5;
directionalLight.position.y = Math.random() - 0.5;
directionalLight.position.z = Math.random() - 0.5;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册