Matrix4.js 17.5 KB
Newer Older
M
Mr.doob 已提交
1 2
/**
 * @author mr.doob / http://mrdoob.com/
M
Mr.doob 已提交
3 4
 * @author supereggbert / http://www.paulbrunt.co.uk/
 * @author philogb / http://blog.thejit.org/
5
 * @author jordi_ros / http://plattsoft.com
6
 * @author D1plo1d / http://github.com/D1plo1d
M
Mr.doob 已提交
7 8
 */

9 10 11 12 13 14
THREE.Matrix4 = function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {

	this.n11 = n11 || 1; this.n12 = n12 || 0; this.n13 = n13 || 0; this.n14 = n14 || 0;
	this.n21 = n21 || 0; this.n22 = n22 || 1; this.n23 = n23 || 0; this.n24 = n24 || 0;
	this.n31 = n31 || 0; this.n32 = n32 || 0; this.n33 = n33 || 1; this.n34 = n34 || 0;
	this.n41 = n41 || 0; this.n42 = n42 || 0; this.n43 = n43 || 0; this.n44 = n44 || 1;
15

16 17 18
	this.flat = new Array( 16 );
	this.m33 = new THREE.Matrix3();

19
};
20

21
THREE.Matrix4.prototype = {
22

23
	identity: function () {
M
Mr.doob 已提交
24

25 26 27 28
		this.n11 = 1; this.n12 = 0; this.n13 = 0; this.n14 = 0;
		this.n21 = 0; this.n22 = 1; this.n23 = 0; this.n24 = 0;
		this.n31 = 0; this.n32 = 0; this.n33 = 1; this.n34 = 0;
		this.n41 = 0; this.n42 = 0; this.n43 = 0; this.n44 = 1;
M
Mr.doob 已提交
29

30 31 32 33 34 35 36 37 38 39 40 41 42
		return this;

	},

	set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {

		this.n11 = n11; this.n12 = n12; this.n13 = n13; this.n14 = n14;
		this.n21 = n21; this.n22 = n22; this.n23 = n23; this.n24 = n24;
		this.n31 = n31; this.n32 = n32; this.n33 = n33; this.n34 = n34;
		this.n41 = n41; this.n42 = n42; this.n43 = n43; this.n44 = n44;

		return this;

43
	},
M
Mr.doob 已提交
44

M
Mr.doob 已提交
45 46 47 48 49 50 51
	copy: function ( m ) {

		this.n11 = m.n11; this.n12 = m.n12; this.n13 = m.n13; this.n14 = m.n14;
		this.n21 = m.n21; this.n22 = m.n22; this.n23 = m.n23; this.n24 = m.n24;
		this.n31 = m.n31; this.n32 = m.n32; this.n33 = m.n33; this.n34 = m.n34;
		this.n41 = m.n41; this.n42 = m.n42; this.n43 = m.n43; this.n44 = m.n44;

52 53
		return this;

M
Mr.doob 已提交
54 55
	},

56
	lookAt: function ( eye, center, up ) {
M
Mr.doob 已提交
57

A
alteredq 已提交
58
		var x = THREE.Matrix4.__tmpVec1, y = THREE.Matrix4.__tmpVec2, z = THREE.Matrix4.__tmpVec3;
M
Mr.doob 已提交
59

M
Mr.doob 已提交
60 61 62
		z.sub( eye, center ).normalize();
		x.cross( up, z ).normalize();
		y.cross( z, x ).normalize();
M
Mr.doob 已提交
63

64 65 66
		this.n11 = x.x; this.n12 = x.y; this.n13 = x.z; this.n14 = - x.dot( eye );
		this.n21 = y.x; this.n22 = y.y; this.n23 = y.z; this.n24 = - y.dot( eye );
		this.n31 = z.x; this.n32 = z.y; this.n33 = z.z; this.n34 = - z.dot( eye );
M
Mr.doob 已提交
67 68
		this.n41 = 0; this.n42 = 0; this.n43 = 0; this.n44 = 1;

69 70
		return this;

71
	},
72

73
	multiplyVector3: function ( v ) {
74

75 76
		var vx = v.x, vy = v.y, vz = v.z,
		d = 1 / ( this.n41 * vx + this.n42 * vy + this.n43 * vz + this.n44 );
77

78 79 80
		v.x = ( this.n11 * vx + this.n12 * vy + this.n13 * vz + this.n14 ) * d;
		v.y = ( this.n21 * vx + this.n22 * vy + this.n23 * vz + this.n24 ) * d;
		v.z = ( this.n31 * vx + this.n32 * vy + this.n33 * vz + this.n34 ) * d;
81

82 83
		return v;

M
Mr.doob 已提交
84
	},
85

86
	multiplyVector4: function ( v ) {
87

M
Mr.doob 已提交
88
		var vx = v.x, vy = v.y, vz = v.z, vw = v.w;
M
Mr.doob 已提交
89

M
Mr.doob 已提交
90 91 92 93
		v.x = this.n11 * vx + this.n12 * vy + this.n13 * vz + this.n14 * vw;
		v.y = this.n21 * vx + this.n22 * vy + this.n23 * vz + this.n24 * vw;
		v.z = this.n31 * vx + this.n32 * vy + this.n33 * vz + this.n34 * vw;
		v.w = this.n41 * vx + this.n42 * vy + this.n43 * vz + this.n44 * vw;
M
Mr.doob 已提交
94

95 96
		return v;

97
	},
98

99
	crossVector: function ( a ) {
M
Mr.doob 已提交
100

101
		var v = new THREE.Vector4();
M
Mr.doob 已提交
102

103 104 105
		v.x = this.n11 * a.x + this.n12 * a.y + this.n13 * a.z + this.n14 * a.w;
		v.y = this.n21 * a.x + this.n22 * a.y + this.n23 * a.z + this.n24 * a.w;
		v.z = this.n31 * a.x + this.n32 * a.y + this.n33 * a.z + this.n34 * a.w;
M
Mr.doob 已提交
106

107
		v.w = ( a.w ) ? this.n41 * a.x + this.n42 * a.y + this.n43 * a.z + this.n44 * a.w : 1;
108

109
		return v;
M
Mr.doob 已提交
110

111
	},
112

113
	multiply: function ( a, b ) {
M
Mr.doob 已提交
114

M
Mr.doob 已提交
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
		var a11 = a.n11, a12 = a.n12, a13 = a.n13, a14 = a.n14,
		a21 = a.n21, a22 = a.n22, a23 = a.n23, a24 = a.n24,
		a31 = a.n31, a32 = a.n32, a33 = a.n33, a34 = a.n34,
		a41 = a.n41, a42 = a.n42, a43 = a.n43, a44 = a.n44,

		b11 = b.n11, b12 = b.n12, b13 = b.n13, b14 = b.n14,
		b21 = b.n21, b22 = b.n22, b23 = b.n23, b24 = b.n24,
		b31 = b.n31, b32 = b.n32, b33 = b.n33, b34 = b.n34,
		b41 = b.n41, b42 = b.n42, b43 = b.n43, b44 = b.n44;

		this.n11 = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
		this.n12 = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
		this.n13 = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
		this.n14 = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;

		this.n21 = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
		this.n22 = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
		this.n23 = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
		this.n24 = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;

		this.n31 = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
		this.n32 = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
		this.n33 = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
		this.n34 = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;

		this.n41 = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
		this.n42 = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
		this.n43 = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
		this.n44 = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
144

145 146
		return this;

147
	},
M
Mr.doob 已提交
148

A
alteredq 已提交
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 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 203 204
	multiplyToArray: function ( a, b, r ) {

		var a11 = a.n11, a12 = a.n12, a13 = a.n13, a14 = a.n14,
		a21 = a.n21, a22 = a.n22, a23 = a.n23, a24 = a.n24,
		a31 = a.n31, a32 = a.n32, a33 = a.n33, a34 = a.n34,
		a41 = a.n41, a42 = a.n42, a43 = a.n43, a44 = a.n44,

		b11 = b.n11, b12 = b.n12, b13 = b.n13, b14 = b.n14,
		b21 = b.n21, b22 = b.n22, b23 = b.n23, b24 = b.n24,
		b31 = b.n31, b32 = b.n32, b33 = b.n33, b34 = b.n34,
		b41 = b.n41, b42 = b.n42, b43 = b.n43, b44 = b.n44;

		this.n11 = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
		this.n12 = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
		this.n13 = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
		this.n14 = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;

		this.n21 = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
		this.n22 = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
		this.n23 = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
		this.n24 = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;

		this.n31 = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
		this.n32 = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
		this.n33 = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
		this.n34 = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;

		this.n41 = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
		this.n42 = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
		this.n43 = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
		this.n44 = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;

		r[ 0 ] = this.n11;
		r[ 1 ] = this.n21;
		r[ 2 ] = this.n31;
		r[ 3 ] = this.n41;

		r[ 4 ] = this.n12;
		r[ 5 ] = this.n22;
		r[ 6 ] = this.n32;
		r[ 7 ] = this.n42;

		r[ 8 ]  = this.n13;
		r[ 9 ]  = this.n23;
		r[ 10 ] = this.n33;
		r[ 11 ] = this.n43;

		r[ 12 ] = this.n14;
		r[ 13 ] = this.n24;
		r[ 14 ] = this.n34;
		r[ 15 ] = this.n44;
		
		return this;

	},

205
	multiplySelf: function ( m ) {
206

207 208 209
		var n11 = this.n11, n12 = this.n12, n13 = this.n13, n14 = this.n14,
		n21 = this.n21, n22 = this.n22, n23 = this.n23, n24 = this.n24,
		n31 = this.n31, n32 = this.n32, n33 = this.n33, n34 = this.n34,
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
		n41 = this.n41, n42 = this.n42, n43 = this.n43, n44 = this.n44,
		mn11 = m.n11, mn21 = m.n21, mn31 = m.n31, mn41 = m.n41,
		mn12 = m.n12, mn22 = m.n22, mn32 = m.n32, mn42 = m.n42,
		mn13 = m.n13, mn23 = m.n23, mn33 = m.n33, mn43 = m.n43,
		mn14 = m.n14, mn24 = m.n24, mn34 = m.n34, mn44 = m.n44;

		this.n11 = n11 * mn11 + n12 * mn21 + n13 * mn31 + n14 * mn41;
		this.n12 = n11 * mn12 + n12 * mn22 + n13 * mn32 + n14 * mn42;
		this.n13 = n11 * mn13 + n12 * mn23 + n13 * mn33 + n14 * mn43;
		this.n14 = n11 * mn14 + n12 * mn24 + n13 * mn34 + n14 * mn44;

		this.n21 = n21 * mn11 + n22 * mn21 + n23 * mn31 + n24 * mn41;
		this.n22 = n21 * mn12 + n22 * mn22 + n23 * mn32 + n24 * mn42;
		this.n23 = n21 * mn13 + n22 * mn23 + n23 * mn33 + n24 * mn43;
		this.n24 = n21 * mn14 + n22 * mn24 + n23 * mn34 + n24 * mn44;

		this.n31 = n31 * mn11 + n32 * mn21 + n33 * mn31 + n34 * mn41;
		this.n32 = n31 * mn12 + n32 * mn22 + n33 * mn32 + n34 * mn42;
		this.n33 = n31 * mn13 + n32 * mn23 + n33 * mn33 + n34 * mn43;
		this.n34 = n31 * mn14 + n32 * mn24 + n33 * mn34 + n34 * mn44;

		this.n41 = n41 * mn11 + n42 * mn21 + n43 * mn31 + n44 * mn41;
		this.n42 = n41 * mn12 + n42 * mn22 + n43 * mn32 + n44 * mn42;
		this.n43 = n41 * mn13 + n42 * mn23 + n43 * mn33 + n44 * mn43;
		this.n44 = n41 * mn14 + n42 * mn24 + n43 * mn34 + n44 * mn44;
235

236 237
		return this;

238 239
	},

240 241 242 243 244 245 246
	multiplyScalar: function ( s ) {

		this.n11 *= s; this.n12 *= s; this.n13 *= s; this.n14 *= s;
		this.n21 *= s; this.n22 *= s; this.n23 *= s; this.n24 *= s;
		this.n31 *= s; this.n32 *= s; this.n33 *= s; this.n34 *= s;
		this.n41 *= s; this.n42 *= s; this.n43 *= s; this.n44 *= s;

247 248
		return this;

249 250 251 252
	},

	determinant: function () {

253 254 255 256 257
		var n11 = this.n11, n12 = this.n12, n13 = this.n13, n14 = this.n14,
		n21 = this.n21, n22 = this.n22, n23 = this.n23, n24 = this.n24,
		n31 = this.n31, n32 = this.n32, n33 = this.n33, n34 = this.n34,
		n41 = this.n41, n42 = this.n42, n43 = this.n43, n44 = this.n44;

258 259 260
		//TODO: make this more efficient
		//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
		return (
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
			n14 * n23 * n32 * n41-
			n13 * n24 * n32 * n41-
			n14 * n22 * n33 * n41+
			n12 * n24 * n33 * n41+

			n13 * n22 * n34 * n41-
			n12 * n23 * n34 * n41-
			n14 * n23 * n31 * n42+
			n13 * n24 * n31 * n42+

			n14 * n21 * n33 * n42-
			n11 * n24 * n33 * n42-
			n13 * n21 * n34 * n42+
			n11 * n23 * n34 * n42+

			n14 * n22 * n31 * n43-
			n12 * n24 * n31 * n43-
			n14 * n21 * n32 * n43+
			n11 * n24 * n32 * n43+

			n12 * n21 * n34 * n43-
			n11 * n22 * n34 * n43-
			n13 * n22 * n31 * n44+
			n12 * n23 * n31 * n44+

			n13 * n21 * n32 * n44-
			n11 * n23 * n32 * n44-
			n12 * n21 * n33 * n44+
			n11 * n22 * n33 * n44 );
290 291

	},
M
Mr.doob 已提交
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313

	transpose: function () {

		function swap( obj, p1, p2 ) {

			var aux = obj[ p1 ];
			obj[ p1 ] = obj[ p2 ];
			obj[ p2 ] = aux;

		}

		swap( this, 'n21', 'n12' );
		swap( this, 'n31', 'n13' );
		swap( this, 'n32', 'n23' );
		swap( this, 'n41', 'n14' );
		swap( this, 'n42', 'n24' );
		swap( this, 'n43', 'n34' );

		return this;

	},

314 315 316
	clone: function () {

		var m = new THREE.Matrix4();
317

318 319 320 321
		m.n11 = this.n11; m.n12 = this.n12; m.n13 = this.n13; m.n14 = this.n14;
		m.n21 = this.n21; m.n22 = this.n22; m.n23 = this.n23; m.n24 = this.n24;
		m.n31 = this.n31; m.n32 = this.n32; m.n33 = this.n33; m.n34 = this.n34;
		m.n41 = this.n41; m.n42 = this.n42; m.n43 = this.n43; m.n44 = this.n44;
322

323 324 325
		return m;

	},
M
Mr.doob 已提交
326

327 328
	flatten: function() {

329 330
		var flat = this.flat;
		
331 332 333 334
		flat[ 0 ] = this.n11;
		flat[ 1 ] = this.n21;
		flat[ 2 ] = this.n31;
		flat[ 3 ] = this.n41;
A
alteredq 已提交
335

336 337 338 339
		flat[ 4 ] = this.n12;
		flat[ 5 ] = this.n22;
		flat[ 6 ] = this.n32;
		flat[ 7 ] = this.n42;
A
alteredq 已提交
340

341 342 343 344
		flat[ 8 ]  = this.n13;
		flat[ 9 ]  = this.n23;
		flat[ 10 ] = this.n33;
		flat[ 11 ] = this.n43;
A
alteredq 已提交
345

346 347 348 349
		flat[ 12 ] = this.n14;
		flat[ 13 ] = this.n24;
		flat[ 14 ] = this.n34;
		flat[ 15 ] = this.n44;
350

351
		return flat;
M
Mr.doob 已提交
352

353
	},
354

355
	setTranslation: function( x, y, z ) {
356

357 358 359 360 361 362
		this.set( 1, 0, 0, x,
				  0, 1, 0, y,
				  0, 0, 1, z,
				  0, 0, 0, 1 );
		 
		return this;
363

364
	},
365 366

	setScale: function( x, y, z ) {
367

368 369 370 371 372 373
		this.set( x, 0, 0, 0,
				  0, y, 0, 0,
				  0, 0, z, 0,
				  0, 0, 0, 1 );
		
		return this;
374

375
	},
376 377

	setRotX: function( theta ) {
378 379

		var c = Math.cos( theta ), s = Math.sin( theta );
380

381 382 383 384
		this.set( 1, 0,  0, 0,
				  0, c, -s, 0,
				  0, s,  c, 0,
				  0, 0,  0, 1 );
385

386
		return this;
387

388
	},
389 390

	setRotY: function( theta ) {
391 392 393 394 395 396 397

		var c = Math.cos( theta ), s = Math.sin( theta );

		this.set( c, 0, s, 0,
				  0, 1, 0, 0,
				 -s, 0, c, 0,
				  0, 0, 0, 1 );
398

399
		return this;
400

401
	},
402 403

	setRotZ: function( theta ) {
404 405

		var c = Math.cos( theta ), s = Math.sin( theta );
406

407 408 409 410 411 412
		this.set( c, -s, 0, 0,
				  s,  c, 0, 0,
				  0,  0, 1, 0,
				  0,  0, 0, 1 );
		
		return this;
413

414
	},
415 416

	setRotAxis: function( axis, angle ) {
417

418
		//Based on http://www.gamedev.net/reference/articles/article1199.asp
419

420 421 422 423 424
		var c = Math.cos( angle ),
			s = Math.sin( angle ),
			t = 1 - c,
			x = axis.x, y = axis.y, z = axis.z,
			tx = t * x, ty = t * y;
425 426

		 this.set( tx * x + c, tx * y - s * z, tx * z + s * y, 0,
427 428 429
				  tx * y + s * z, ty * y + c, ty * z - s * x, 0,
				  tx * z - s * y, ty * z + s * x, t * z * z + c, 0,
				  0, 0, 0, 1 );
430

431 432
		 return this;

433
	},
434

435 436
	toString: function() {

M
Mr.doob 已提交
437 438 439 440
		return  "| " + this.n11 + " " + this.n12 + " " + this.n13 + " " + this.n14 + " |\n" +
			"| " + this.n21 + " " + this.n22 + " " + this.n23 + " " + this.n24 + " |\n" +
			"| " + this.n31 + " " + this.n32 + " " + this.n33 + " " + this.n34 + " |\n" +
			"| " + this.n41 + " " + this.n42 + " " + this.n43 + " " + this.n44 + " |";
441 442

	}
443

M
Mr.doob 已提交
444
};
M
Mr.doob 已提交
445

446
THREE.Matrix4.translationMatrix = function ( x, y, z ) {
M
Mr.doob 已提交
447

448
	var m = new THREE.Matrix4();
M
Mr.doob 已提交
449

450
	m.setTranslation( x, y, z );
M
Mr.doob 已提交
451

452
	return m;
453

M
Mr.doob 已提交
454
};
M
Mr.doob 已提交
455

456
THREE.Matrix4.scaleMatrix = function ( x, y, z ) {
M
Mr.doob 已提交
457

458
	var m = new THREE.Matrix4();
M
Mr.doob 已提交
459

460
	m.setScale( x, y, z );
M
Mr.doob 已提交
461

462
	return m;
463

M
Mr.doob 已提交
464
};
M
Mr.doob 已提交
465

466
THREE.Matrix4.rotationXMatrix = function ( theta ) {
M
Mr.doob 已提交
467

468
	var m = new THREE.Matrix4();
M
Mr.doob 已提交
469

470
	m.setRotX( theta );
M
Mr.doob 已提交
471

472
	return m;
473

M
Mr.doob 已提交
474
};
M
Mr.doob 已提交
475

476
THREE.Matrix4.rotationYMatrix = function ( theta ) {
M
Mr.doob 已提交
477

478
	var m = new THREE.Matrix4();
M
Mr.doob 已提交
479

480
	m.setRotY( theta );
M
Mr.doob 已提交
481

482
	return m;
483

M
Mr.doob 已提交
484
};
M
Mr.doob 已提交
485

486
THREE.Matrix4.rotationZMatrix = function ( theta ) {
M
Mr.doob 已提交
487

488
	var m = new THREE.Matrix4();
M
Mr.doob 已提交
489

490
	m.setRotZ( theta );
M
Mr.doob 已提交
491

492
	return m;
493

M
Mr.doob 已提交
494
};
M
Mr.doob 已提交
495

P
philogb 已提交
496 497
THREE.Matrix4.rotationAxisAngleMatrix = function ( axis, angle ) {

498
	var m = new THREE.Matrix4();
499

500
	m.setRotAxis( axis, angle );
M
Mr.doob 已提交
501

502
	return m;
P
philogb 已提交
503 504 505

};

506 507
THREE.Matrix4.makeInvert = function ( m1 ) {

508 509 510 511
	var n11 = m1.n11, n12 = m1.n12, n13 = m1.n13, n14 = m1.n14,
		n21 = m1.n21, n22 = m1.n22, n23 = m1.n23, n24 = m1.n24,
		n31 = m1.n31, n32 = m1.n32, n33 = m1.n33, n34 = m1.n34,
		n41 = m1.n41, n42 = m1.n42, n43 = m1.n43, n44 = m1.n44;
512

513 514 515 516
	//TODO: make this more efficient
	//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
	var m2 = new THREE.Matrix4();

517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532
	m2.n11 = n23*n34*n42 - n24*n33*n42 + n24*n32*n43 - n22*n34*n43 - n23*n32*n44 + n22*n33*n44;
	m2.n12 = n14*n33*n42 - n13*n34*n42 - n14*n32*n43 + n12*n34*n43 + n13*n32*n44 - n12*n33*n44;
	m2.n13 = n13*n24*n42 - n14*n23*n42 + n14*n22*n43 - n12*n24*n43 - n13*n22*n44 + n12*n23*n44;
	m2.n14 = n14*n23*n32 - n13*n24*n32 - n14*n22*n33 + n12*n24*n33 + n13*n22*n34 - n12*n23*n34;
	m2.n21 = n24*n33*n41 - n23*n34*n41 - n24*n31*n43 + n21*n34*n43 + n23*n31*n44 - n21*n33*n44;
	m2.n22 = n13*n34*n41 - n14*n33*n41 + n14*n31*n43 - n11*n34*n43 - n13*n31*n44 + n11*n33*n44;
	m2.n23 = n14*n23*n41 - n13*n24*n41 - n14*n21*n43 + n11*n24*n43 + n13*n21*n44 - n11*n23*n44;
	m2.n24 = n13*n24*n31 - n14*n23*n31 + n14*n21*n33 - n11*n24*n33 - n13*n21*n34 + n11*n23*n34;
	m2.n31 = n22*n34*n41 - n24*n32*n41 + n24*n31*n42 - n21*n34*n42 - n22*n31*n44 + n21*n32*n44;
	m2.n32 = n14*n32*n41 - n12*n34*n41 - n14*n31*n42 + n11*n34*n42 + n12*n31*n44 - n11*n32*n44;
	m2.n33 = n13*n24*n41 - n14*n22*n41 + n14*n21*n42 - n11*n24*n42 - n12*n21*n44 + n11*n22*n44;
	m2.n34 = n14*n22*n31 - n12*n24*n31 - n14*n21*n32 + n11*n24*n32 + n12*n21*n34 - n11*n22*n34;
	m2.n41 = n23*n32*n41 - n22*n33*n41 - n23*n31*n42 + n21*n33*n42 + n22*n31*n43 - n21*n32*n43;
	m2.n42 = n12*n33*n41 - n13*n32*n41 + n13*n31*n42 - n11*n33*n42 - n12*n31*n43 + n11*n32*n43;
	m2.n43 = n13*n22*n41 - n12*n23*n41 - n13*n21*n42 + n11*n23*n42 + n12*n21*n43 - n11*n22*n43;
	m2.n44 = n12*n23*n31 - n13*n22*n31 + n13*n21*n32 - n11*n23*n32 - n12*n21*n33 + n11*n22*n33;
533
	m2.multiplyScalar( 1 / m1.determinant() );
534 535 536 537 538

	return m2;

};

539
THREE.Matrix4.makeInvert3x3 = function ( m1 ) {
540

541
	// input:  THREE.Matrix4, output: THREE.Matrix3
542 543
	// ( based on http://code.google.com/p/webgl-mjs/ )

544 545 546
	var m = m1.flatten(),
		m33 = m1.m33,
		m33m = m33.m,
547

548
	a11 =   m[ 10 ] * m[ 5 ] - m[ 6 ] * m[ 9 ],
549
	a21 = - m[ 10 ] * m[ 1 ] + m[ 2 ] * m[ 9 ],
550
	a31 =   m[ 6 ]  * m[ 1 ] - m[ 2 ] * m[ 5 ],
551
	a12 = - m[ 10 ] * m[ 4 ] + m[ 6 ] * m[ 8 ],
552 553 554 555 556 557 558 559
	a22 =   m[ 10 ] * m[ 0 ] - m[ 2 ] * m[ 8 ],
	a32 = - m[ 6 ]  * m[ 0 ] + m[ 2 ] * m[ 4 ],
	a13 =   m[ 9 ]  * m[ 4 ] - m[ 5 ] * m[ 8 ],
	a23 = - m[ 9 ]  * m[ 0 ] + m[ 1 ] * m[ 8 ],
	a33 =   m[ 5 ]  * m[ 0 ] - m[ 1 ] * m[ 4 ],
	
	det = m[ 0 ]  * a11 + m[ 1 ] * a12 + m[ 2 ] * a13,
	
560 561 562 563 564 565 566
	idet;

	// no inverse
	if (det == 0) throw "matrix not invertible";

	idet = 1.0 / det;

567 568 569
	m33m[ 0 ] = idet * a11; m33m[ 1 ] = idet * a21; m33m[ 2 ] = idet * a31;
	m33m[ 3 ] = idet * a12; m33m[ 4 ] = idet * a22; m33m[ 5 ] = idet * a32;
	m33m[ 6 ] = idet * a13; m33m[ 7 ] = idet * a23; m33m[ 8 ] = idet * a33;
570

571
	return m33;
572

573 574
}

575
THREE.Matrix4.makeFrustum = function ( left, right, bottom, top, near, far ) {
M
Mr.doob 已提交
576

577
	var m, x, y, a, b, c, d;
M
Mr.doob 已提交
578

579 580 581 582 583 584 585
	m = new THREE.Matrix4();
	x = 2 * near / ( right - left );
	y = 2 * near / ( top - bottom );
	a = ( right + left ) / ( right - left );
	b = ( top + bottom ) / ( top - bottom );
	c = - ( far + near ) / ( far - near );
	d = - 2 * far * near / ( far - near );
M
Mr.doob 已提交
586

587 588 589 590
	m.n11 = x;  m.n12 = 0;  m.n13 = a;   m.n14 = 0;
	m.n21 = 0;  m.n22 = y;  m.n23 = b;   m.n24 = 0;
	m.n31 = 0;  m.n32 = 0;  m.n33 = c;   m.n34 = d;
	m.n41 = 0;  m.n42 = 0;  m.n43 = - 1; m.n44 = 0;
M
Mr.doob 已提交
591

592
	return m;
593

M
Mr.doob 已提交
594
};
M
Mr.doob 已提交
595

596
THREE.Matrix4.makePerspective = function ( fov, aspect, near, far ) {
M
Mr.doob 已提交
597

598 599 600 601 602 603 604 605 606 607 608
	var ymax, ymin, xmin, xmax;

	ymax = near * Math.tan( fov * Math.PI / 360 );
	ymin = - ymax;
	xmin = ymin * aspect;
	xmax = ymax * aspect;

	return THREE.Matrix4.makeFrustum( xmin, xmax, ymin, ymax, near, far );

};

609
THREE.Matrix4.makeOrtho = function ( left, right, top, bottom, near, far ) {
610 611 612 613 614

	var m, x, y, z, w, h, p;

	m = new THREE.Matrix4();
	w = right - left;
615
	h = top - bottom;
616 617
	p = far - near;
	x = ( right + left ) / w;
618
	y = ( top + bottom ) / h;
619
	z = ( far + near ) / p;
620

621 622 623 624
	m.n11 = 2 / w; m.n12 = 0;     m.n13 = 0;      m.n14 = -x;
	m.n21 = 0;     m.n22 = 2 / h; m.n23 = 0;      m.n24 = -y;
	m.n31 = 0;     m.n32 = 0;     m.n33 = -2 / p; m.n34 = -z;
	m.n41 = 0;     m.n42 = 0;     m.n43 = 0;      m.n44 = 1;
625

626
	return m;
627

M
Mr.doob 已提交
628
};
A
alteredq 已提交
629 630 631 632

THREE.Matrix4.__tmpVec1 = new THREE.Vector3();
THREE.Matrix4.__tmpVec2 = new THREE.Vector3();
THREE.Matrix4.__tmpVec3 = new THREE.Vector3();