OBJLoader.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. THREE.OBJLoader = function () {};
  5. THREE.OBJLoader.prototype.load = function ( url, callback ) {
  6. var xhr = new XMLHttpRequest();
  7. xhr.onreadystatechange = function () {
  8. if ( xhr.readyState == 4 ) {
  9. if ( xhr.status == 200 || xhr.status == 0 ) {
  10. THREE.OBJLoader.prototype.parse( xhr.responseText, callback );
  11. } else {
  12. console.error( 'THREE.OBJLoader: Couldn\'t load ' + url + ' (' + xhr.status + ')' );
  13. }
  14. }
  15. };
  16. xhr.open( "GET", url, true );
  17. xhr.send( null );
  18. };
  19. THREE.OBJLoader.prototype.parse = function ( data, callback ) {
  20. var geometry = new THREE.Geometry();
  21. var objects = data.split( '\no ');
  22. for ( var i = 0, il = objects.length; i < il; i ++ ) {
  23. var object = objects[ i ];
  24. var pattern, result;
  25. // vertices
  26. pattern = /v ([\-|\d|.]+) ([\-|\d|.]+) ([\-|\d|.]+)/g;
  27. while ( ( result = pattern.exec( object ) ) != null ) {
  28. var vertex = new THREE.Vector3( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );
  29. geometry.vertices.push( vertex );
  30. }
  31. // faces
  32. pattern = /f ([\d]+)\/([\d]+)\/([\d]+) ([\d]+)\/([\d]+)\/([\d]+) ([\d]+)\/([\d]+)\/([\d]+)/g;
  33. while ( ( result = pattern.exec( object ) ) != null ) {
  34. var face = new THREE.Face3( parseInt( result[ 1 ] ) - 1, parseInt( result[ 4 ] ) - 1, parseInt( result[ 7 ] ) - 1 );
  35. geometry.faces.push( face );
  36. }
  37. }
  38. geometry.computeCentroids();
  39. callback( geometry );
  40. }