Vector3.js 13.1 KB
Newer Older
M
Mr.doob 已提交
1
/**
M
Mr.doob 已提交
2
 * @author mrdoob / http://mrdoob.com/
3
 * @author *kile / http://kile.stravaganza.org/
M
Mr.doob 已提交
4
 * @author philogb / http://blog.thejit.org/
5
 * @author mikael emtinger / http://gomo.se/
M
Mr.doob 已提交
6
 * @author egraether / http://egraether.com/
W
WestLangley 已提交
7
 * @author WestLangley / http://github.com/WestLangley
M
Mr.doob 已提交
8 9
 */

A
alteredq 已提交
10
THREE.Vector3 = function ( x, y, z ) {
11

12 13 14
	this.x = x || 0;
	this.y = y || 0;
	this.z = z || 0;
M
Mr.doob 已提交
15

16
};
17

18
THREE.extend( THREE.Vector3.prototype, {
19

20
	set: function ( x, y, z ) {
M
Mr.doob 已提交
21

A
alteredq 已提交
22 23 24
		this.x = x;
		this.y = y;
		this.z = z;
M
Mr.doob 已提交
25

26
		return this;
27

28
	},
29

M
Mr.doob 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
	setX: function ( x ) {

		this.x = x;

		return this;

	},

	setY: function ( y ) {

		this.y = y;

		return this;

	},

	setZ: function ( z ) {

		this.z = z;

		return this;

	},

M
Mr.doob 已提交
54
	setComponent: function ( index, value ) {
B
Ben Houston 已提交
55

M
Mr.doob 已提交
56
		switch ( index ) {
57

M
Mr.doob 已提交
58 59 60 61
			case 0: this.x = value; break;
			case 1: this.y = value; break;
			case 2: this.z = value; break;
			default: throw new Error( "index is out of range: " + index );
B
Ben Houston 已提交
62

M
Mr.doob 已提交
63
		}
B
Ben Houston 已提交
64

M
Mr.doob 已提交
65
	},
66

M
Mr.doob 已提交
67
	getComponent: function ( index ) {
68

M
Mr.doob 已提交
69
		switch ( index ) {
70

M
Mr.doob 已提交
71 72 73 74
			case 0: return this.x;
			case 1: return this.y;
			case 2: return this.z;
			default: throw new Error( "index is out of range: " + index );
75

M
Mr.doob 已提交
76
		}
77

M
Mr.doob 已提交
78
	},
79

80
	copy: function ( v ) {
M
Mr.doob 已提交
81

M
Mr.doob 已提交
82 83 84
		this.x = v.x;
		this.y = v.y;
		this.z = v.z;
M
Mr.doob 已提交
85

86
		return this;
M
Mr.doob 已提交
87

88
	},
89

90 91 92 93 94 95 96 97
	add: function ( v, w ) {

		if ( w !== undefined ) {

			console.warn( 'DEPRECATED: Vector3\'s .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
			return this.addVectors( v, w );

		}
M
Mr.doob 已提交
98

M
Mr.doob 已提交
99 100 101
		this.x += v.x;
		this.y += v.y;
		this.z += v.z;
102

B
Ben Nolan 已提交
103 104
		return this;

105
	},
106

107
	addScalar: function ( s ) {
M
Mr.doob 已提交
108

M
Mr.doob 已提交
109 110 111
		this.x += s;
		this.y += s;
		this.z += s;
112

B
Ben Nolan 已提交
113 114
		return this;

115
	},
116

117
	addVectors: function ( a, b ) {
118

119 120 121
		this.x = a.x + b.x;
		this.y = a.y + b.y;
		this.z = a.z + b.z;
122

123
		return this;
M
Mr.doob 已提交
124

125
	},
126

127 128 129 130 131 132 133 134
	sub: function ( v, w ) {

		if ( w !== undefined ) {

			console.warn( 'DEPRECATED: Vector3\'s .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
			return this.subVectors( v, w );

		}
135

M
Mr.doob 已提交
136 137 138
		this.x -= v.x;
		this.y -= v.y;
		this.z -= v.z;
139

B
Ben Nolan 已提交
140 141
		return this;

142
	},
143

144
	subVectors: function ( a, b ) {
145

146 147 148
		this.x = a.x - b.x;
		this.y = a.y - b.y;
		this.z = a.z - b.z;
149

150
		return this;
M
Mr.doob 已提交
151

152
	},
153

154 155 156 157 158 159 160 161
	multiply: function ( v, w ) {

		if ( w !== undefined ) {

			console.warn( 'DEPRECATED: Vector3\'s .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );
			return this.multiplyVectors( v, w );

		}
162

M
Mr.doob 已提交
163 164
		this.x *= v.x;
		this.y *= v.y;
N
Nico Kruithof 已提交
165
		this.z *= v.z;
M
Mr.doob 已提交
166 167 168 169 170

		return this;

	},

171
	multiplyScalar: function ( s ) {
M
Mr.doob 已提交
172

M
Mr.doob 已提交
173 174 175
		this.x *= s;
		this.y *= s;
		this.z *= s;
176

B
Ben Nolan 已提交
177 178
		return this;

179
	},
180

181 182 183 184 185 186 187 188 189 190
	multiplyVectors: function ( a, b ) {

		this.x = a.x * b.x;
		this.y = a.y * b.y;
		this.z = a.z * b.z;

		return this;

	},

191
	applyMatrix3: function ( m ) {
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206

		var x = this.x;
		var y = this.y;
		var z = this.z;

		var e = m.elements;

		this.x = e[0] * x + e[3] * y + e[6] * z;
		this.y = e[1] * x + e[4] * y + e[7] * z;
		this.z = e[2] * x + e[5] * y + e[8] * z;

		return this;

	},

207
	applyMatrix4: function ( m ) {
208

209 210 211
		// input: THREE.Matrix4 affine matrix

		var x = this.x, y = this.y, z = this.z;
212 213 214

		var e = m.elements;

215 216 217
		this.x = e[0] * x + e[4] * y + e[8]  * z + e[12];
		this.y = e[1] * x + e[5] * y + e[9]  * z + e[13];
		this.z = e[2] * x + e[6] * y + e[10] * z + e[14];
218 219 220 221 222

		return this;

	},

223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
	applyProjection: function ( m ) {

		// input: THREE.Matrix4 projection matrix

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

		var e = m.elements;
		var d = 1 / ( e[3] * x + e[7] * y + e[11] * z + e[15] ); // perspective divide

		this.x = ( e[0] * x + e[4] * y + e[8]  * z + e[12] ) * d;
		this.y = ( e[1] * x + e[5] * y + e[9]  * z + e[13] ) * d;
		this.z = ( e[2] * x + e[6] * y + e[10] * z + e[14] ) * d;

		return this;

	},

240
	applyQuaternion: function ( q ) {
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267

		var x = this.x;
		var y = this.y;
		var z = this.z;

		var qx = q.x;
		var qy = q.y;
		var qz = q.z;
		var qw = q.w;

		// calculate quat * vector

		var ix =  qw * x + qy * z - qz * y;
		var iy =  qw * y + qz * x - qx * z;
		var iz =  qw * z + qx * y - qy * x;
		var iw = -qx * x - qy * y - qz * z;

		// calculate result * inverse quat

		this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
		this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
		this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;

		return this;

	},

268
	applyEuler: function () {
269

270
		var q1 = new THREE.Quaternion();
M
Mr.doob 已提交
271

272
		return function ( v, eulerOrder ) {
273

274
			var quaternion = q1.setFromEuler( v, eulerOrder );
275

276
			this.applyQuaternion( quaternion );
277

278
			return this;
279

280
		};
281

282
	}(),
283

284
	applyAxisAngle: function () {
285

286
		var q1 = new THREE.Quaternion();
M
Mr.doob 已提交
287

288
		return function ( axis, angle ) {
289

290 291 292 293 294 295 296 297 298
			var quaternion = q1.setFromAxisAngle( axis, angle );

			this.applyQuaternion( quaternion );

			return this;

		};

	}(),
299

300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
	transformDirection: function ( m ) {

		// input: THREE.Matrix4 affine matrix
		// vector interpreted as a direction

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

		var e = m.elements;

		this.x = e[0] * x + e[4] * y + e[8]  * z;
		this.y = e[1] * x + e[5] * y + e[9]  * z;
		this.z = e[2] * x + e[6] * y + e[10] * z;

		this.normalize();

		return this;

	},

319
	divide: function ( v ) {
320

321 322 323 324 325
		this.x /= v.x;
		this.y /= v.y;
		this.z /= v.z;

		return this;
M
Mr.doob 已提交
326

M
Mr.doob 已提交
327
	},
328

329
	divideScalar: function ( s ) {
330

B
Ben Houston 已提交
331
		if ( s !== 0 ) {
332

M
Mr.doob 已提交
333 334 335
			this.x /= s;
			this.y /= s;
			this.z /= s;
M
Mr.doob 已提交
336

M
Mr.doob 已提交
337
		} else {
M
Mr.doob 已提交
338

339 340 341
			this.x = 0;
			this.y = 0;
			this.z = 0;
342

M
Mr.doob 已提交
343
		}
344

B
Ben Nolan 已提交
345 346
		return this;

347
	},
348

349
	min: function ( v ) {
350

A
alteredq 已提交
351 352
		if ( this.x > v.x ) {

353
			this.x = v.x;
A
alteredq 已提交
354

355
		}
A
alteredq 已提交
356 357 358

		if ( this.y > v.y ) {

359
			this.y = v.y;
A
alteredq 已提交
360

361
		}
A
alteredq 已提交
362 363 364

		if ( this.z > v.z ) {

365
			this.z = v.z;
A
alteredq 已提交
366

367
		}
368 369 370 371 372

		return this;

	},

373
	max: function ( v ) {
374

A
alteredq 已提交
375 376
		if ( this.x < v.x ) {

377
			this.x = v.x;
A
alteredq 已提交
378

379
		}
A
alteredq 已提交
380 381 382

		if ( this.y < v.y ) {

383
			this.y = v.y;
A
alteredq 已提交
384

385
		}
A
alteredq 已提交
386 387 388

		if ( this.z < v.z ) {

389
			this.z = v.z;
A
alteredq 已提交
390

391
		}
392 393 394 395

		return this;

	},
M
Mr.doob 已提交
396

397
	clamp: function ( min, max ) {
398 399 400

		// This function assumes min < max, if this assumption isn't true it will not operate correctly

A
alteredq 已提交
401 402
		if ( this.x < min.x ) {

403
			this.x = min.x;
A
alteredq 已提交
404 405 406

		} else if ( this.x > max.x ) {

407
			this.x = max.x;
A
alteredq 已提交
408

409 410
		}

A
alteredq 已提交
411 412
		if ( this.y < min.y ) {

413
			this.y = min.y;
A
alteredq 已提交
414 415 416

		} else if ( this.y > max.y ) {

417
			this.y = max.y;
A
alteredq 已提交
418

419 420
		}

A
alteredq 已提交
421 422
		if ( this.z < min.z ) {

423
			this.z = min.z;
A
alteredq 已提交
424 425 426

		} else if ( this.z > max.z ) {

427
			this.z = max.z;
A
alteredq 已提交
428

429 430 431
		}

		return this;
A
alteredq 已提交
432

433 434
	},

435
	negate: function () {
M
Mr.doob 已提交
436

M
Mr.doob 已提交
437
		return this.multiplyScalar( - 1 );
B
Ben Nolan 已提交
438

439
	},
440

441
	dot: function ( v ) {
M
Mr.doob 已提交
442

M
Mr.doob 已提交
443
		return this.x * v.x + this.y * v.y + this.z * v.z;
M
Mr.doob 已提交
444

M
Mr.doob 已提交
445
	},
M
Mr.doob 已提交
446

447
	lengthSq: function () {
M
Mr.doob 已提交
448

M
Mr.doob 已提交
449
		return this.x * this.x + this.y * this.y + this.z * this.z;
M
Mr.doob 已提交
450 451 452

	},

453
	length: function () {
M
Mr.doob 已提交
454

455
		return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );
M
Mr.doob 已提交
456

M
Mr.doob 已提交
457
	},
458

459
	lengthManhattan: function () {
460

461
		return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );
A
alteredq 已提交
462

463 464
	},

465
	normalize: function () {
466

M
Mr.doob 已提交
467
		return this.divideScalar( this.length() );
468

469
	},
470

471
	setLength: function ( l ) {
472

473
		var oldLength = this.length();
M
Mr.doob 已提交
474

B
Ben Houston 已提交
475
		if ( oldLength !== 0 && l !== oldLength  ) {
476 477 478 479 480

			this.multiplyScalar( l / oldLength );
		}

		return this;
481

482
	},
483

484
	lerp: function ( v, alpha ) {
485 486 487 488 489 490 491 492

		this.x += ( v.x - this.x ) * alpha;
		this.y += ( v.y - this.y ) * alpha;
		this.z += ( v.z - this.z ) * alpha;

		return this;

	},
493

494 495 496 497 498 499 500 501
	cross: function ( v, w ) {

		if ( w !== undefined ) {

			console.warn( 'DEPRECATED: Vector3\'s .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );
			return this.crossVectors( v, w );

		}
502

503
		var x = this.x, y = this.y, z = this.z;
504

505 506 507
		this.x = y * v.z - z * v.y;
		this.y = z * v.x - x * v.z;
		this.z = x * v.y - y * v.x;
508

509
		return this;
510 511 512

	},

513 514 515 516 517 518 519 520 521 522
	crossVectors: function ( a, b ) {

		this.x = a.y * b.z - a.z * b.y;
		this.y = a.z * b.x - a.x * b.z;
		this.z = a.x * b.y - a.y * b.x;

		return this;

	},

523

524
	projectOn: function( normal ) {
525

526 527
		var d = this.dot( normal );
		return this.copy( normal ).multiplyScalar( d );
528 529 530

	},
	
531
	orthoTo: function () {
532 533 534 535 536

		var v1 = new THREE.Vector3();

		return function( normal ) {

537
			v1.copy( this ).projectOn( normal );
538 539 540 541 542 543 544 545 546 547 548 549 550

			return this.sub( v1 );

		}

	}(),

	reflect: function () {

		var v1 = new THREE.Vector3();

		return function ( normal ) {

551
		    v1.copy( this ).projectOn( normal ).multiplyScalar( 2 );
552

553
		    return this.subVectors( v1, this );
554 555 556 557 558

		}

	}(),

W
Wilt 已提交
559
	angleTo: function ( v ) {
M
Mr.doob 已提交
560

W
Wilt 已提交
561
		return Math.acos( this.dot( v ) / this.length() / v.length() );
M
Mr.doob 已提交
562 563

	},
W
Wilt 已提交
564

565
	distanceTo: function ( v ) {
566

M
Mr.doob 已提交
567
		return Math.sqrt( this.distanceToSquared( v ) );
568

M
Mr.doob 已提交
569 570
	},

571
	distanceToSquared: function ( v ) {
M
Mr.doob 已提交
572

M
Mr.doob 已提交
573 574 575 576
		var dx = this.x - v.x;
		var dy = this.y - v.y;
		var dz = this.z - v.z;

577
		return dx * dx + dy * dy + dz * dz;
M
Mr.doob 已提交
578

579
	},
M
Mr.doob 已提交
580

M
Mr.doob 已提交
581
	getPositionFromMatrix: function ( m ) {
M
Mr.doob 已提交
582

583 584 585
		this.x = m.elements[12];
		this.y = m.elements[13];
		this.z = m.elements[14];
586

587 588
		return this;

589 590
	},

W
WestLangley 已提交
591 592 593
	setEulerFromRotationMatrix: function ( m, order ) {

		// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
M
Mr.doob 已提交
594

W
WestLangley 已提交
595
		// clamp, to handle numerical problems
M
Mr.doob 已提交
596 597 598 599 600 601

		function clamp( x ) {

			return Math.min( Math.max( x, -1 ), 1 );

		}
602 603 604 605 606 607 608 609 610

		var te = m.elements;
		var m11 = te[0], m12 = te[4], m13 = te[8];
		var m21 = te[1], m22 = te[5], m23 = te[9];
		var m31 = te[2], m32 = te[6], m33 = te[10];

		if ( order === undefined || order === 'XYZ' ) {

			this.y = Math.asin( clamp( m13 ) );
M
Mr.doob 已提交
611

612
			if ( Math.abs( m13 ) < 0.99999 ) {
M
Mr.doob 已提交
613

614 615
				this.x = Math.atan2( - m23, m33 );
				this.z = Math.atan2( - m12, m11 );
M
Mr.doob 已提交
616

617
			} else {
M
Mr.doob 已提交
618

619
				this.x = Math.atan2( m32, m22 );
620
				this.z = 0;
M
Mr.doob 已提交
621

622 623 624
			}

		} else if ( order === 'YXZ' ) {
M
Mr.doob 已提交
625

626
			this.x = Math.asin( - clamp( m23 ) );
M
Mr.doob 已提交
627

628
			if ( Math.abs( m23 ) < 0.99999 ) {
M
Mr.doob 已提交
629

630 631
				this.y = Math.atan2( m13, m33 );
				this.z = Math.atan2( m21, m22 );
M
Mr.doob 已提交
632

633
			} else {
M
Mr.doob 已提交
634

635 636
				this.y = Math.atan2( - m31, m11 );
				this.z = 0;
M
Mr.doob 已提交
637

638
			}
M
Mr.doob 已提交
639

640
		} else if ( order === 'ZXY' ) {
M
Mr.doob 已提交
641

642
			this.x = Math.asin( clamp( m32 ) );
M
Mr.doob 已提交
643

644
			if ( Math.abs( m32 ) < 0.99999 ) {
M
Mr.doob 已提交
645

646 647
				this.y = Math.atan2( - m31, m33 );
				this.z = Math.atan2( - m12, m22 );
M
Mr.doob 已提交
648

649
			} else {
M
Mr.doob 已提交
650

651
				this.y = 0;
652
				this.z = Math.atan2( m21, m11 );
M
Mr.doob 已提交
653

654 655 656
			}

		} else if ( order === 'ZYX' ) {
M
Mr.doob 已提交
657

658
			this.y = Math.asin( - clamp( m31 ) );
M
Mr.doob 已提交
659

660
			if ( Math.abs( m31 ) < 0.99999 ) {
M
Mr.doob 已提交
661

662 663
				this.x = Math.atan2( m32, m33 );
				this.z = Math.atan2( m21, m11 );
M
Mr.doob 已提交
664

665
			} else {
M
Mr.doob 已提交
666

667 668
				this.x = 0;
				this.z = Math.atan2( - m12, m22 );
M
Mr.doob 已提交
669

670
			}
M
Mr.doob 已提交
671

672
		} else if ( order === 'YZX' ) {
M
Mr.doob 已提交
673

674
			this.z = Math.asin( clamp( m21 ) );
M
Mr.doob 已提交
675

676
			if ( Math.abs( m21 ) < 0.99999 ) {
M
Mr.doob 已提交
677

678 679
				this.x = Math.atan2( - m23, m22 );
				this.y = Math.atan2( - m31, m11 );
M
Mr.doob 已提交
680

681
			} else {
M
Mr.doob 已提交
682

683
				this.x = 0;
684
				this.y = Math.atan2( m13, m33 );
M
Mr.doob 已提交
685

686
			}
M
Mr.doob 已提交
687

688
		} else if ( order === 'XZY' ) {
M
Mr.doob 已提交
689

690
			this.z = Math.asin( - clamp( m12 ) );
M
Mr.doob 已提交
691

692
			if ( Math.abs( m12 ) < 0.99999 ) {
M
Mr.doob 已提交
693

694 695
				this.x = Math.atan2( m32, m22 );
				this.y = Math.atan2( m13, m11 );
M
Mr.doob 已提交
696

697
			} else {
M
Mr.doob 已提交
698

699
				this.x = Math.atan2( - m23, m33 );
700
				this.y = 0;
M
Mr.doob 已提交
701

702
			}
M
Mr.doob 已提交
703

704
		}
M
Mr.doob 已提交
705

706 707 708 709
		return this;

	},

W
WestLangley 已提交
710 711 712
	setEulerFromQuaternion: function ( q, order ) {

		// q is assumed to be normalized
M
Mr.doob 已提交
713

W
WestLangley 已提交
714
		// clamp, to handle numerical problems
M
Mr.doob 已提交
715 716 717 718 719 720 721 722

		function clamp( x ) {

			return Math.min( Math.max( x, -1 ), 1 );

		}

		// http://www.mathworks.com/matlabcentral/fileexchange/20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/content/SpinCalc.m
M
Mr.doob 已提交
723

M
Mr.doob 已提交
724 725 726 727
		var sqx = q.x * q.x;
		var sqy = q.y * q.y;
		var sqz = q.z * q.z;
		var sqw = q.w * q.w;
728 729 730 731 732 733

		if ( order === undefined || order === 'XYZ' ) {

			this.x = Math.atan2( 2 * ( q.x * q.w - q.y * q.z ), ( sqw - sqx - sqy + sqz ) );
			this.y = Math.asin(  clamp( 2 * ( q.x * q.z + q.y * q.w ) ) );
			this.z = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw + sqx - sqy - sqz ) );
M
Mr.doob 已提交
734

735
		} else if ( order ===  'YXZ' ) {
M
Mr.doob 已提交
736

737 738 739
			this.x = Math.asin(  clamp( 2 * ( q.x * q.w - q.y * q.z ) ) );
			this.y = Math.atan2( 2 * ( q.x * q.z + q.y * q.w ), ( sqw - sqx - sqy + sqz ) );
			this.z = Math.atan2( 2 * ( q.x * q.y + q.z * q.w ), ( sqw - sqx + sqy - sqz ) );
M
Mr.doob 已提交
740

741
		} else if ( order === 'ZXY' ) {
M
Mr.doob 已提交
742

743 744 745
			this.x = Math.asin(  clamp( 2 * ( q.x * q.w + q.y * q.z ) ) );
			this.y = Math.atan2( 2 * ( q.y * q.w - q.z * q.x ), ( sqw - sqx - sqy + sqz ) );
			this.z = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw - sqx + sqy - sqz ) );
M
Mr.doob 已提交
746

747
		} else if ( order === 'ZYX' ) {
M
Mr.doob 已提交
748

749 750 751
			this.x = Math.atan2( 2 * ( q.x * q.w + q.z * q.y ), ( sqw - sqx - sqy + sqz ) );
			this.y = Math.asin(  clamp( 2 * ( q.y * q.w - q.x * q.z ) ) );
			this.z = Math.atan2( 2 * ( q.x * q.y + q.z * q.w ), ( sqw + sqx - sqy - sqz ) );
M
Mr.doob 已提交
752

753
		} else if ( order === 'YZX' ) {
M
Mr.doob 已提交
754

755 756 757
			this.x = Math.atan2( 2 * ( q.x * q.w - q.z * q.y ), ( sqw - sqx + sqy - sqz ) );
			this.y = Math.atan2( 2 * ( q.y * q.w - q.x * q.z ), ( sqw + sqx - sqy - sqz ) );
			this.z = Math.asin(  clamp( 2 * ( q.x * q.y + q.z * q.w ) ) );
M
Mr.doob 已提交
758

759
		} else if ( order === 'XZY' ) {
M
Mr.doob 已提交
760

761 762 763
			this.x = Math.atan2( 2 * ( q.x * q.w + q.y * q.z ), ( sqw - sqx + sqy - sqz ) );
			this.y = Math.atan2( 2 * ( q.x * q.z + q.y * q.w ), ( sqw + sqx - sqy - sqz ) );
			this.z = Math.asin(  clamp( 2 * ( q.z * q.w - q.x * q.y ) ) );
M
Mr.doob 已提交
764

A
alteredq 已提交
765
		}
M
Mr.doob 已提交
766

W
WestLangley 已提交
767
		return this;
A
alteredq 已提交
768 769

	},
770

M
Mr.doob 已提交
771 772
	getScaleFromMatrix: function ( m ) {

773 774 775
		var sx = this.set( m.elements[0], m.elements[1], m.elements[2] ).length();
		var sy = this.set( m.elements[4], m.elements[5], m.elements[6] ).length();
		var sz = this.set( m.elements[8], m.elements[9], m.elements[10] ).length();
M
Mr.doob 已提交
776

777 778 779
		this.x = sx;
		this.y = sy;
		this.z = sz;
M
Mr.doob 已提交
780

781
		return this;
M
Mr.doob 已提交
782 783 784
	},

	equals: function ( v ) {
785 786 787

		return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );

788 789
	},

790 791 792 793 794 795
	toArray: function () {

		return [ this.x, this.y, this.z ];
		
	},

M
Mr.doob 已提交
796 797 798 799
	clone: function () {

		return new THREE.Vector3( this.x, this.y, this.z );

800
	}
801

M
Mr.doob 已提交
802
} );