OBJLoader.js 6.9 KB
Newer Older
M
Mr.doob 已提交
1 2 3 4
/**
 * @author mrdoob / http://mrdoob.com/
 */

M
Mr.doob 已提交
5
THREE.OBJLoader = function () {
M
Mr.doob 已提交
6

M
Mr.doob 已提交
7
	THREE.EventTarget.call( this );
8

M
Mr.doob 已提交
9
};
M
Mr.doob 已提交
10

M
Mr.doob 已提交
11
THREE.OBJLoader.prototype = {
M
Mr.doob 已提交
12

M
Mr.doob 已提交
13
	constructor: THREE.OBJLoader,
M
Mr.doob 已提交
14

M
Mr.doob 已提交
15
	load: function ( url ) {
M
Mr.doob 已提交
16

M
Mr.doob 已提交
17 18
		var scope = this;
		var xhr = new XMLHttpRequest();
M
Mr.doob 已提交
19

20
		xhr.addEventListener( 'load', function ( event ) {
21

22
			scope.dispatchEvent( { type: 'load', content: scope.parse( event.target.responseText ) } );
M
Mr.doob 已提交
23

24
		}, false );
M
Mr.doob 已提交
25

26
		xhr.addEventListener( 'progress', function ( event ) {
M
Mr.doob 已提交
27

28
			scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );
M
Mr.doob 已提交
29

30
		}, false );
M
Mr.doob 已提交
31

32
		xhr.addEventListener( 'error', function () {
M
Mr.doob 已提交
33

34
			scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
M
Mr.doob 已提交
35

36
		}, false );
M
Mr.doob 已提交
37

M
Mr.doob 已提交
38 39
		xhr.open( 'GET', url, true );
		xhr.send( null );
40

M
Mr.doob 已提交
41
	},
42

M
Mr.doob 已提交
43
	parse: function ( data ) {
44

M
Mr.doob 已提交
45
		function vector( x, y, z ) {
M
Mr.doob 已提交
46

M
Mr.doob 已提交
47
			return new THREE.Vector3( x, y, z );
M
Mr.doob 已提交
48

M
Mr.doob 已提交
49
		}
M
Mr.doob 已提交
50

M
Mr.doob 已提交
51
		function uv( u, v ) {
52

M
Mr.doob 已提交
53
			return new THREE.UV( u, v );
54

M
Mr.doob 已提交
55
		}
56

M
Mr.doob 已提交
57
		function face3( a, b, c, normals ) {
58

M
Mr.doob 已提交
59
			return new THREE.Face3( a, b, c, normals );
60

M
Mr.doob 已提交
61
		}
62

M
Mr.doob 已提交
63
		function face4( a, b, c, d, normals ) {
M
Mr.doob 已提交
64

M
Mr.doob 已提交
65
			return new THREE.Face4( a, b, c, d, normals );
66

M
Mr.doob 已提交
67
		}
M
Mr.doob 已提交
68

M
Mr.doob 已提交
69
		var group = new THREE.Object3D();
70

M
Mr.doob 已提交
71 72 73
		var vertices = [];
		var normals = [];
		var uvs = [];
74

M
Mr.doob 已提交
75
		var pattern, result;
76

M
Mr.doob 已提交
77
		// v float float float
78

79
		pattern = /v( +[\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)/g;
M
Mr.doob 已提交
80

M
Mr.doob 已提交
81
		while ( ( result = pattern.exec( data ) ) != null ) {
M
Mr.doob 已提交
82

M
Mr.doob 已提交
83
			// ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
M
Mr.doob 已提交
84

M
Mr.doob 已提交
85 86 87 88 89
			vertices.push( vector(
				parseFloat( result[ 1 ] ),
				parseFloat( result[ 2 ] ),
				parseFloat( result[ 3 ] )
			) );
M
Mr.doob 已提交
90

M
Mr.doob 已提交
91
		}
M
Mr.doob 已提交
92 93


M
Mr.doob 已提交
94
		// vn float float float
M
Mr.doob 已提交
95

96
		pattern = /vn( +[\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)/g;
97

M
Mr.doob 已提交
98
		while ( ( result = pattern.exec( data ) ) != null ) {
99

M
Mr.doob 已提交
100
			// ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
M
Mr.doob 已提交
101

M
Mr.doob 已提交
102 103 104 105 106
			normals.push( vector(
				parseFloat( result[ 1 ] ),
				parseFloat( result[ 2 ] ),
				parseFloat( result[ 3 ] )
			) );
M
Mr.doob 已提交
107

M
Mr.doob 已提交
108
		}
M
Mr.doob 已提交
109

M
Mr.doob 已提交
110
		// vt float float
M
Mr.doob 已提交
111

112
		pattern = /vt( +[\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)/g;
M
Mr.doob 已提交
113

M
Mr.doob 已提交
114
		while ( ( result = pattern.exec( data ) ) != null ) {
M
Mr.doob 已提交
115

M
Mr.doob 已提交
116
			// ["vt 0.1 0.2", "0.1", "0.2"]
M
Mr.doob 已提交
117

M
Mr.doob 已提交
118 119 120 121
			uvs.push( uv(
				parseFloat( result[ 1 ] ),
				parseFloat( result[ 2 ] )
			) );
M
Mr.doob 已提交
122

M
Mr.doob 已提交
123 124 125 126 127
		}

		var data = data.split( '\no ');

		for ( var i = 0, l = data.length; i < l; i ++ ) {
M
Mr.doob 已提交
128

M
Mr.doob 已提交
129
			var object = data[ i ];
M
Mr.doob 已提交
130

M
Mr.doob 已提交
131
			var geometry = new THREE.Geometry();
M
Mr.doob 已提交
132

M
Mr.doob 已提交
133
			geometry.vertices = vertices;
134

M
Mr.doob 已提交
135
			// f vertex vertex vertex ...
136

137
			pattern = /f( +[\d]+)( [\d]+)( [\d]+)( [\d]+)?/g;
138

M
Mr.doob 已提交
139
			while ( ( result = pattern.exec( object ) ) != null ) {
140

M
Mr.doob 已提交
141 142 143
				// ["f 1 2 3", "1", "2", "3", undefined]

				if ( result[ 4 ] === undefined ) {
M
Mr.doob 已提交
144
			
M
Mr.doob 已提交
145 146 147 148 149
					geometry.faces.push( face3(
						parseInt( result[ 1 ] ) - 1,
						parseInt( result[ 2 ] ) - 1,
						parseInt( result[ 3 ] ) - 1
					) );
M
Mr.doob 已提交
150

M
Mr.doob 已提交
151
				} else {
M
Mr.doob 已提交
152

M
Mr.doob 已提交
153 154 155 156 157 158
					geometry.faces.push( face4(
						parseInt( result[ 1 ] ) - 1,
						parseInt( result[ 2 ] ) - 1,
						parseInt( result[ 3 ] ) - 1,
						parseInt( result[ 4 ] ) - 1
					) );
M
Mr.doob 已提交
159

M
Mr.doob 已提交
160
				}
161

M
Mr.doob 已提交
162
			}
M
Mr.doob 已提交
163

M
Mr.doob 已提交
164
			// f vertex/uv vertex/uv vertex/uv ...
M
Mr.doob 已提交
165

166
			pattern = /f( +([\d]+)\/([\d]+))( ([\d]+)\/([\d]+))( ([\d]+)\/([\d]+))( ([\d]+)\/([\d]+))?/g;
M
Mr.doob 已提交
167

M
Mr.doob 已提交
168
			while ( ( result = pattern.exec( object ) ) != null ) {
M
Mr.doob 已提交
169

M
Mr.doob 已提交
170
				// ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined]
M
Mr.doob 已提交
171

M
Mr.doob 已提交
172
				if ( result[ 10 ] === undefined ) {
M
Mr.doob 已提交
173
			
M
Mr.doob 已提交
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
					geometry.faces.push( face3(
						parseInt( result[ 2 ] ) - 1,
						parseInt( result[ 5 ] ) - 1,
						parseInt( result[ 8 ] ) - 1
					) );

					geometry.faceVertexUvs[ 0 ].push( [
						uvs[ parseInt( result[ 3 ] ) - 1 ],
						uvs[ parseInt( result[ 6 ] ) - 1 ],
						uvs[ parseInt( result[ 9 ] ) - 1 ]
					] );

				} else {

					geometry.faces.push( face4(
						parseInt( result[ 2 ] ) - 1,
						parseInt( result[ 5 ] ) - 1,
						parseInt( result[ 8 ] ) - 1,
						parseInt( result[ 11 ] ) - 1
					) );

					geometry.faceVertexUvs[ 0 ].push( [
						uvs[ parseInt( result[ 3 ] ) - 1 ],
						uvs[ parseInt( result[ 6 ] ) - 1 ],
						uvs[ parseInt( result[ 9 ] ) - 1 ],
						uvs[ parseInt( result[ 12 ] ) - 1 ]
					] );

				}
M
Mr.doob 已提交
203

M
Mr.doob 已提交
204
			}
205

M
Mr.doob 已提交
206
			// f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...
207

208
			pattern = /f( +([\d]+)\/([\d]+)\/([\d]+))( ([\d]+)\/([\d]+)\/([\d]+))( ([\d]+)\/([\d]+)\/([\d]+))( ([\d]+)\/([\d]+)\/([\d]+))?/g;
209

M
Mr.doob 已提交
210
			while ( ( result = pattern.exec( object ) ) != null ) {
211

M
Mr.doob 已提交
212
				// ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined]
213

M
Mr.doob 已提交
214
				if ( result[ 13 ] === undefined ) {
M
Mr.doob 已提交
215
			
M
Mr.doob 已提交
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
					geometry.faces.push( face3(
						parseInt( result[ 2 ] ) - 1,
						parseInt( result[ 6 ] ) - 1,
						parseInt( result[ 10 ] ) - 1,
						[
							normals[ parseInt( result[ 4 ] ) - 1 ],
							normals[ parseInt( result[ 8 ] ) - 1 ],
							normals[ parseInt( result[ 12 ] ) - 1 ]
						]
					) );

					geometry.faceVertexUvs[ 0 ].push( [
						uvs[ parseInt( result[ 3 ] ) - 1 ],
						uvs[ parseInt( result[ 7 ] ) - 1 ],
						uvs[ parseInt( result[ 11 ] ) - 1 ]
					] );

				} else {

					geometry.faces.push( face4(
						parseInt( result[ 2 ] ) - 1,
						parseInt( result[ 6 ] ) - 1,
						parseInt( result[ 10 ] ) - 1,
						parseInt( result[ 14 ] ) - 1,
						[
							normals[ parseInt( result[ 4 ] ) - 1 ],
							normals[ parseInt( result[ 8 ] ) - 1 ],
							normals[ parseInt( result[ 12 ] ) - 1 ],
							normals[ parseInt( result[ 16 ] ) - 1 ]
						]
					) );

					geometry.faceVertexUvs[ 0 ].push( [
						uvs[ parseInt( result[ 3 ] ) - 1 ],
						uvs[ parseInt( result[ 7 ] ) - 1 ],
						uvs[ parseInt( result[ 11 ] ) - 1 ],
						uvs[ parseInt( result[ 15 ] ) - 1 ]
					] );

				}
M
Mr.doob 已提交
256

257

M
Mr.doob 已提交
258
			}
259

M
Mr.doob 已提交
260
			// f vertex//normal vertex//normal vertex//normal ...
261

262
			pattern = /f( +([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))?/g;
263

M
Mr.doob 已提交
264
			while ( ( result = pattern.exec( object ) ) != null ) {
265

M
Mr.doob 已提交
266
				// ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined]
267

M
Mr.doob 已提交
268
				if ( result[ 10 ] === undefined ) {
M
Mr.doob 已提交
269
			
M
Mr.doob 已提交
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
					geometry.faces.push( face3(
						parseInt( result[ 2 ] ) - 1,
						parseInt( result[ 5 ] ) - 1,
						parseInt( result[ 8 ] ) - 1,
						[
							normals[ parseInt( result[ 3 ] ) - 1 ],
							normals[ parseInt( result[ 6 ] ) - 1 ],
							normals[ parseInt( result[ 9 ] ) - 1 ]
						]
					) );

				} else {

					geometry.faces.push( face4(
						parseInt( result[ 2 ] ) - 1,
						parseInt( result[ 5 ] ) - 1,
						parseInt( result[ 8 ] ) - 1,
						parseInt( result[ 11 ] ) - 1,
						[
							normals[ parseInt( result[ 3 ] ) - 1 ],
							normals[ parseInt( result[ 6 ] ) - 1 ],
							normals[ parseInt( result[ 9 ] ) - 1 ],
							normals[ parseInt( result[ 12 ] ) - 1 ]
						]
					) );

				}
M
Mr.doob 已提交
297 298

			}
299

M
Mr.doob 已提交
300
			geometry.computeCentroids();
M
Mr.doob 已提交
301 302
			geometry.computeFaceNormals();
			geometry.computeBoundingSphere();
M
Mr.doob 已提交
303 304

			group.add( new THREE.Mesh( geometry, new THREE.MeshLambertMaterial() ) );
305

M
Mr.doob 已提交
306
		}
307

M
Mr.doob 已提交
308
		return group;
309 310

	}
M
Mr.doob 已提交
311 312

}