Matrix4.js 22.7 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
7 8
 * @author alteredq / http://alteredqualia.com/
 * @author mikael emtinger / http://gomo.se/
M
Mr.doob 已提交
9 10
 */

11 12 13 14 15 16
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;
17

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

21
};
22

23
THREE.Matrix4.prototype = {
24

25
	identity: function () {
M
Mr.doob 已提交
26

27 28 29 30
		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 已提交
31

32 33 34 35 36 37 38 39 40 41 42 43 44
		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;

45
	},
M
Mr.doob 已提交
46

M
Mr.doob 已提交
47 48 49 50 51 52 53
	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;

54 55
		return this;

M
Mr.doob 已提交
56 57
	},

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

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

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

66 67 68
		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 已提交
69 70
		this.n41 = 0; this.n42 = 0; this.n43 = 0; this.n44 = 1;

71 72
		return this;

73
	},
74

75
	multiplyVector3: function ( v ) {
76

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

80 81 82
		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;
83

84 85
		return v;

M
Mr.doob 已提交
86
	},
87

88
	multiplyVector3OnlyZ: function( v ) {
89

90 91 92 93 94 95
		var vx = v.x, vy = v.y, vz = v.z,
		d = 1 / ( this.n41 * vx + this.n42 * vy + this.n43 * vz + this.n44 );

		return ( this.n31 * vx + this.n32 * vy + this.n33 * vz + this.n34 ) * d;

	},
96

97
	multiplyVector4: function ( v ) {
98

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

M
Mr.doob 已提交
101 102 103 104
		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 已提交
105

106 107
		return v;

108
	},
109

110
	crossVector: function ( a ) {
M
Mr.doob 已提交
111

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

114 115 116
		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 已提交
117

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

120
		return v;
M
Mr.doob 已提交
121

122
	},
123

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

M
Mr.doob 已提交
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
		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;
155

156 157
		return this;

158
	},
M
Mr.doob 已提交
159

A
alteredq 已提交
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 205 206 207 208 209 210
	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;
211

A
alteredq 已提交
212 213 214 215
		return this;

	},

216
	multiplySelf: function ( m ) {
217

218 219 220
		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,
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
		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;
246

247 248
		return this;

249 250
	},

251 252 253 254 255 256 257
	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;

258 259
		return this;

260 261 262 263
	},

	determinant: function () {

264 265 266 267 268
		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;

269 270 271
		//TODO: make this more efficient
		//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
		return (
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 297 298 299 300
			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 );
301 302

	},
M
Mr.doob 已提交
303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324

	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;

	},

325 326 327
	clone: function () {

		var m = new THREE.Matrix4();
328

329 330 331 332
		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;
333

334 335 336
		return m;

	},
M
Mr.doob 已提交
337

338 339
	flatten: function() {

340
		var flat = this.flat;
341

342 343 344 345
		flat[ 0 ] = this.n11;
		flat[ 1 ] = this.n21;
		flat[ 2 ] = this.n31;
		flat[ 3 ] = this.n41;
A
alteredq 已提交
346

347 348 349 350
		flat[ 4 ] = this.n12;
		flat[ 5 ] = this.n22;
		flat[ 6 ] = this.n32;
		flat[ 7 ] = this.n42;
A
alteredq 已提交
351

352 353
		flat[ 8 ]  = this.n13;
		flat[ 9 ]  = this.n23;
354 355 356 357 358 359 360 361 362 363 364 365 366
		flat[ 10 ] = this.n33;
		flat[ 11 ] = this.n43;

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

		return flat;

	},

	flattenToArray: function( flat ) {
367

368 369 370 371 372 373 374 375 376 377 378 379
		flat[ 0 ] = this.n11;
		flat[ 1 ] = this.n21;
		flat[ 2 ] = this.n31;
		flat[ 3 ] = this.n41;

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

		flat[ 8 ]  = this.n13;
		flat[ 9 ]  = this.n23;
380 381
		flat[ 10 ] = this.n33;
		flat[ 11 ] = this.n43;
A
alteredq 已提交
382

383 384 385 386
		flat[ 12 ] = this.n14;
		flat[ 13 ] = this.n24;
		flat[ 14 ] = this.n34;
		flat[ 15 ] = this.n44;
387

388
		return flat;
M
Mr.doob 已提交
389

390
	},
391

A
alteredq 已提交
392
	flattenToArrayOffset: function( flat, offset ) {
393

A
alteredq 已提交
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417
		flat[ offset ] 	   = this.n11;
		flat[ offset + 1 ] = this.n21;
		flat[ offset + 2 ] = this.n31;
		flat[ offset + 3 ] = this.n41;

		flat[ offset + 4 ] = this.n12;
		flat[ offset + 5 ] = this.n22;
		flat[ offset + 6 ] = this.n32;
		flat[ offset + 7 ] = this.n42;

		flat[ offset + 8 ]  = this.n13;
		flat[ offset + 9 ]  = this.n23;
		flat[ offset + 10 ] = this.n33;
		flat[ offset + 11 ] = this.n43;

		flat[ offset + 12 ] = this.n14;
		flat[ offset + 13 ] = this.n24;
		flat[ offset + 14 ] = this.n34;
		flat[ offset + 15 ] = this.n44;

		return flat;

	},

418
	setTranslation: function( x, y, z ) {
419

420 421 422 423
		this.set( 1, 0, 0, x,
				  0, 1, 0, y,
				  0, 0, 1, z,
				  0, 0, 0, 1 );
424

425
		return this;
426

427
	},
428 429

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

431 432 433 434
		this.set( x, 0, 0, 0,
				  0, y, 0, 0,
				  0, 0, z, 0,
				  0, 0, 0, 1 );
435

436
		return this;
437

438
	},
439 440

	setRotX: function( theta ) {
441 442

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

444 445 446 447
		this.set( 1, 0,  0, 0,
				  0, c, -s, 0,
				  0, s,  c, 0,
				  0, 0,  0, 1 );
448

449
		return this;
450

451
	},
452 453

	setRotY: function( theta ) {
454 455 456 457 458 459 460

		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 );
461

462
		return this;
463

464
	},
465 466

	setRotZ: function( theta ) {
467 468

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

470 471 472 473
		this.set( c, -s, 0, 0,
				  s,  c, 0, 0,
				  0,  0, 1, 0,
				  0,  0, 0, 1 );
474

475
		return this;
476

477
	},
478 479

	setRotAxis: function( axis, angle ) {
480

481
		//Based on http://www.gamedev.net/reference/articles/article1199.asp
482

483 484 485 486 487
		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;
488 489

		 this.set( tx * x + c, tx * y - s * z, tx * z + s * y, 0,
490 491 492
				  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 );
493

494 495
		 return this;

496
	},
497

498 499 500 501 502
	setPosition: function( vec3 ) {

		this.n14 = vec3.x;
		this.n24 = vec3.y;
		this.n34 = vec3.z;
503

504
		return this;
505

506
	},
507

508
	setRotationFromEuler: function( vec3 ) {
509

510 511 512 513
		//var c = Math.PI / 180;
		var x = vec3.x,// * c;
			y = vec3.y,// * c;
			z = vec3.z,// * c;
514

515 516 517 518 519 520
			ch = Math.cos( y  ),
			sh = Math.sin( y  ),
			ca = Math.cos( -z ),
			sa = Math.sin( -z ),
			cb = Math.cos( x  ),
			sb = Math.sin( x  ),
521

522 523
			chsa = ch * sa,
			shsa = sh * sa;
524

525 526 527
	    this.n11 = ch * ca;
	    this.n12 = sh * sb - chsa * cb;
	    this.n13 = chsa * sb + sh * cb;
528

529 530 531
	    this.n21 = sa;
	    this.n22 = ca * cb;
	    this.n23 = - ca * sb;
532

533 534 535
	    this.n31 = - sh * ca;
	    this.n32 = shsa * cb + ch * sb;
	    this.n33 = - shsa * sb + ch * cb;
536

537 538 539 540 541
	},

	setRotationFromQuaternion: function( quat ) {

		var x = quat.x, y = quat.y, z = quat.z, w = quat.w,
542

543 544 545
			x2 = x + x,
			y2 = y + y,
			z2 = z + z,
546

547 548 549
			xx = x * x2,
			xy = x * y2,
			xz = x * z2,
550

551 552 553
			yy = y * y2,
			yz = y * z2,
			zz = z * z2,
554

555 556 557
			wx = w * x2,
			wy = w * y2,
			wz = w * z2;
558

559 560 561
		this.n11 = 1 - ( yy + zz );
		this.n12 = xy - wz;
		this.n13 = xz + wy;
562

563 564 565
		this.n21 = xy + wz;
		this.n22 = 1 - ( xx + zz );
		this.n23 = yz - wx;
566

567 568 569
		this.n31 = xz - wy;
		this.n32 = yz + wx;
		this.n33 = 1 - ( xx + yy );
570

571
	},
572

573
	scale: function( vec3 ) {
574 575 576

		var x = vec3.x, y = vec3.y, z = vec3.z;

577 578 579 580 581
		this.n11 *= x; this.n12 *= x; this.n13 *= x;
		this.n21 *= y; this.n22 *= y; this.n23 *= y;
		this.n31 *= z; this.n32 *= z; this.n33 *= z;

		return this;
A
alteredq 已提交
582

583
	},
584

A
alteredq 已提交
585
	extractRotationMatrix: function( m ) {
586

A
alteredq 已提交
587 588 589
		m.n11 = this.n11; m.n12 = this.n12; m.n13 = this.n13; m.n14 = 0;
		m.n21 = this.n21; m.n22 = this.n22; m.n23 = this.n23; m.n24 = 0;
		m.n31 = this.n31; m.n32 = this.n32; m.n33 = this.n33; m.n34 = 0;
590
		m.n41 = 0; m.n42 = 0; m.n43 = 0; m.n44 = 1;
A
alteredq 已提交
591 592

	},
593

A
alteredq 已提交
594 595 596 597 598 599 600 601
	extractPositionVector: function( v ) {
		
		v.x = this.n14;
		v.y = this.n24;
		v.z = this.n34;

	},

602 603
	toString: function() {

M
Mr.doob 已提交
604 605 606 607
		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 + " |";
608 609

	}
610

M
Mr.doob 已提交
611
};
M
Mr.doob 已提交
612

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

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

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

619
	return m;
620

M
Mr.doob 已提交
621
};
M
Mr.doob 已提交
622

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

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

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

629
	return m;
630

M
Mr.doob 已提交
631
};
M
Mr.doob 已提交
632

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

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

637
	m.setRotX( theta );
M
Mr.doob 已提交
638

639
	return m;
640

M
Mr.doob 已提交
641
};
M
Mr.doob 已提交
642

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

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

647
	m.setRotY( theta );
M
Mr.doob 已提交
648

649
	return m;
650

M
Mr.doob 已提交
651
};
M
Mr.doob 已提交
652

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

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

657
	m.setRotZ( theta );
M
Mr.doob 已提交
658

659
	return m;
660

M
Mr.doob 已提交
661
};
M
Mr.doob 已提交
662

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

665
	var m = new THREE.Matrix4();
666

667
	m.setRotAxis( axis, angle );
M
Mr.doob 已提交
668

669
	return m;
P
philogb 已提交
670 671 672

};

A
alteredq 已提交
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706
THREE.Matrix4.makeInvert = function ( m1, m2 ) {

	// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm

	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;

	if( m2 === undefined ) m2 = new THREE.Matrix4();

	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;
	m2.multiplyScalar( 1 / m1.determinant() );

	return m2;

};

/*
707 708
THREE.Matrix4.makeInvert = function ( m1 ) {

A
alteredq 已提交
709 710 711 712 713 714 715 716
	var m2 = new THREE.Matrix4();
	
	return THREE.Matrix4.makeInvertTo( m1, m2 );

};

THREE.Matrix4.makeInvertTo = function ( m1, m2 ) {

717 718 719 720
	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;
721

722 723 724
	//TODO: make this more efficient
	//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )

725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740
	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;
741
	m2.multiplyScalar( 1 / m1.determinant() );
742 743 744 745

	return m2;

};
A
alteredq 已提交
746
*/
747
THREE.Matrix4.makeInvert3x3 = function ( m1 ) {
748

749
	// input:  THREE.Matrix4, output: THREE.Matrix3
750 751
	// ( based on http://code.google.com/p/webgl-mjs/ )

752
	var m33 = m1.m33,
753
		m33m = m33.m,
754

755 756 757 758 759 760 761 762 763
	a11 =   m1.n33 * m1.n22 - m1.n32 * m1.n23,
	a21 = - m1.n33 * m1.n21 + m1.n31 * m1.n23,
	a31 =   m1.n32 * m1.n21 - m1.n31 * m1.n22,
	a12 = - m1.n33 * m1.n12 + m1.n32 * m1.n13,
	a22 =   m1.n33 * m1.n11 - m1.n31 * m1.n13,
	a32 = - m1.n32 * m1.n11 + m1.n31 * m1.n12,
	a13 =   m1.n23 * m1.n12 - m1.n22 * m1.n13,
	a23 = - m1.n23 * m1.n11 + m1.n21 * m1.n13,
	a33 =   m1.n22 * m1.n11 - m1.n21 * m1.n12,
764
	
765
	det = m1.n11 * a11 + m1.n21 * a12 + m1.n31 * a13,
766
	
767 768 769 770 771 772 773
	idet;

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

	idet = 1.0 / det;

774 775 776
	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;
777

778
	return m33;
779

780 781
}

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

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

786 787 788 789 790 791 792
	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 已提交
793

794 795 796 797
	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 已提交
798

799
	return m;
800

M
Mr.doob 已提交
801
};
M
Mr.doob 已提交
802

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

805 806 807 808 809 810 811 812 813 814 815
	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 );

};

816
THREE.Matrix4.makeOrtho = function ( left, right, top, bottom, near, far ) {
817 818 819 820 821

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

	m = new THREE.Matrix4();
	w = right - left;
822
	h = top - bottom;
823 824
	p = far - near;
	x = ( right + left ) / w;
825
	y = ( top + bottom ) / h;
826
	z = ( far + near ) / p;
827

828 829 830 831
	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;
832

833
	return m;
834

M
Mr.doob 已提交
835
};
A
alteredq 已提交
836 837 838 839

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