Matrix3.js 5.1 KB
Newer Older
A
alteredq 已提交
1 2
/**
 * @author alteredq / http://alteredqualia.com/
3
 * @author WestLangley / http://github.com/WestLangley
4
 * @author bhouston / http://clara.io
T
tschw 已提交
5
 * @author tschw
A
alteredq 已提交
6 7
 */

8
THREE.Matrix3 = function () {
9

10
	this.elements = new Float32Array( [
11

12 13 14
		1, 0, 0,
		0, 1, 0,
		0, 0, 1
15

16 17 18 19
	] );

	if ( arguments.length > 0 ) {

20
		console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );
21 22

	}
23

24 25
};

26 27 28
THREE.Matrix3.prototype = {

	constructor: THREE.Matrix3,
29

30 31 32 33
	set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {

		var te = this.elements;

34 35 36
		te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;
		te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;
		te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

		return this;

	},

	identity: function () {

		this.set(

			1, 0, 0,
			0, 1, 0,
			0, 0, 1

		);

		return this;

	},

56 57
	clone: function () {

58
		return new this.constructor().fromArray( this.elements );
59 60 61

	},

62 63 64 65 66 67
	copy: function ( m ) {

		var me = m.elements;

		this.set(

68 69 70
			me[ 0 ], me[ 3 ], me[ 6 ],
			me[ 1 ], me[ 4 ], me[ 7 ],
			me[ 2 ], me[ 5 ], me[ 8 ]
71 72 73 74 75 76 77

		);

		return this;

	},

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
	setFromMatrix4: function( m ) {

		var me = m.elements;

		this.set(

			me[ 0 ], me[ 4 ], me[  8 ],
			me[ 1 ], me[ 5 ], me[  9 ],
			me[ 2 ], me[ 6 ], me[ 10 ]

		);

		return this;

	},

94
	applyToVector3Array: function () {
95

B
Ben Adams 已提交
96
		var v1;
M
Mr.doob 已提交
97

98
		return function ( array, offset, length ) {
99

B
Ben Adams 已提交
100
			if ( v1 === undefined ) v1 = new THREE.Vector3();
101 102
			if ( offset === undefined ) offset = 0;
			if ( length === undefined ) length = array.length;
103

B
brason 已提交
104
			for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {
105

106
				v1.fromArray( array, j );
107
				v1.applyMatrix3( this );
108
				v1.toArray( array, j );
109

110
			}
111

112
			return array;
113

114 115 116
		};

	}(),
117

B
Ben Adams 已提交
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
	applyToBuffer: function () {

		var v1;

		return function applyToBuffer( buffer, offset, length ) {

			if ( v1 === undefined ) v1 = new THREE.Vector3();
			if ( offset === undefined ) offset = 0;
			if ( length === undefined ) length = buffer.length / buffer.itemSize;

			for ( var i = 0, j = offset; i < length; i ++, j ++ ) {

				v1.x = buffer.getX( j );
				v1.y = buffer.getY( j );
				v1.z = buffer.getZ( j );

				v1.applyMatrix3( this );

				buffer.setXYZ( v1.x, v1.y, v1.z );

			}

140
			return buffer;
B
Ben Adams 已提交
141 142 143 144 145

		};

	}(),

146 147 148 149
	multiplyScalar: function ( s ) {

		var te = this.elements;

150 151 152
		te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;
		te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;
		te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;
153 154 155 156 157 158

		return this;

	},

	determinant: function () {
M
Mr.doob 已提交
159

160
		var te = this.elements;
M
Mr.doob 已提交
161

162 163 164
		var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],
			d = te[ 3 ], e = te[ 4 ], f = te[ 5 ],
			g = te[ 6 ], h = te[ 7 ], i = te[ 8 ];
165

166
		return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;
M
Mr.doob 已提交
167

168 169
	},

170
	getInverse: function ( matrix, throwOnDegenerate ) {
171

172 173
		if ( matrix instanceof THREE.Matrix4 ) {

174
			console.error( "THREE.Matrix3.getInverse no longer takes a Matrix4 argument." );
175 176 177

		}

T
tschw 已提交
178 179
		var me = matrix.elements,
			te = this.elements,
180

T
tschw 已提交
181 182 183
			n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],
			n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],
			n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],
M
Mr.doob 已提交
184

T
tschw 已提交
185 186 187
			t11 = n33 * n22 - n32 * n23,
			t12 = n32 * n13 - n33 * n12,
			t13 = n23 * n12 - n22 * n13,
188

T
tschw 已提交
189
			det = n11 * t11 + n21 * t12 + n31 * t13;
190 191 192

		if ( det === 0 ) {

M
Mr.doob 已提交
193
			var msg = "THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0";
194

195
			if ( throwOnDegenerate || false ) {
196

197
				throw new Error( msg );
198

M
Mr.doob 已提交
199
			} else {
200

201
				console.warn( msg );
202

203 204
			}

T
tschw 已提交
205 206
			return this.identity();
		}
207

T
tschw 已提交
208 209 210
		te[ 0 ] = t11;
		te[ 1 ] = n31 * n23 - n33 * n21;
		te[ 2 ] = n32 * n21 - n31 * n22;
M
Mr.doob 已提交
211

T
tschw 已提交
212 213 214
		te[ 3 ] = t12;
		te[ 4 ] = n33 * n11 - n31 * n13;
		te[ 5 ] = n31 * n12 - n32 * n11;
215

T
tschw 已提交
216 217 218
		te[ 6 ] = t13;
		te[ 7 ] = n21 * n13 - n23 * n11;
		te[ 8 ] = n22 * n11 - n21 * n12;
219

T
tschw 已提交
220
		return this.multiplyScalar( 1 / det );
221 222 223

	},

224
	transpose: function () {
225

226
		var tmp, m = this.elements;
227

228 229 230
		tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;
		tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;
		tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;
231 232 233

		return this;

A
alteredq 已提交
234
	},
235

236
	flattenToArrayOffset: function ( array, offset ) {
237

T
tschw 已提交
238 239
		console.warn( "THREE.Matrix3: .flattenToArrayOffset is deprecated " +
				"- just use .toArray instead." );
240

T
tschw 已提交
241
		return this.toArray( array, offset );
242 243 244

	},

245
	getNormalMatrix: function ( matrix4 ) {
T
tschw 已提交
246

247
		return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();
248 249

	},
250

251
	transposeIntoArray: function ( r ) {
A
alteredq 已提交
252

253
		var m = this.elements;
A
alteredq 已提交
254 255 256 257 258 259 260 261 262 263

		r[ 0 ] = m[ 0 ];
		r[ 1 ] = m[ 3 ];
		r[ 2 ] = m[ 6 ];
		r[ 3 ] = m[ 1 ];
		r[ 4 ] = m[ 4 ];
		r[ 5 ] = m[ 7 ];
		r[ 6 ] = m[ 2 ];
		r[ 7 ] = m[ 5 ];
		r[ 8 ] = m[ 8 ];
264

A
alteredq 已提交
265 266
		return this;

267 268
	},

269 270 271 272 273 274 275 276
	fromArray: function ( array ) {

		this.elements.set( array );

		return this;

	},

T
tschw 已提交
277 278 279 280
	toArray: function ( array, offset ) {

		if ( array === undefined ) array = [];
		if ( offset === undefined ) offset = 0;
281 282 283

		var te = this.elements;

T
tschw 已提交
284 285 286 287 288 289 290 291 292 293 294 295 296
		array[ offset ] = te[ 0 ];
		array[ offset + 1 ] = te[ 1 ];
		array[ offset + 2 ] = te[ 2 ];

		array[ offset + 3 ] = te[ 3 ];
		array[ offset + 4 ] = te[ 4 ];
		array[ offset + 5 ] = te[ 5 ];

		array[ offset + 6 ] = te[ 6 ];
		array[ offset + 7 ] = te[ 7 ];
		array[ offset + 8 ]  = te[ 8 ];

		return array;
297

298
	}
299

300
};