Vector3.js 13.5 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 19 20
THREE.Vector3.prototype = {

	constructor: THREE.Vector3,
21

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

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

28
		return this;
29

30
	},
31

M
Mr.doob 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
	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 已提交
56
	setComponent: function ( index, value ) {
B
Ben Houston 已提交
57

M
Mr.doob 已提交
58
		switch ( index ) {
59

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

M
Mr.doob 已提交
65
		}
B
Ben Houston 已提交
66

M
Mr.doob 已提交
67
	},
68

M
Mr.doob 已提交
69
	getComponent: function ( index ) {
70

M
Mr.doob 已提交
71
		switch ( index ) {
72

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

M
Mr.doob 已提交
78
		}
79

M
Mr.doob 已提交
80
	},
81

82
	copy: function ( v ) {
M
Mr.doob 已提交
83

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

88
		return this;
M
Mr.doob 已提交
89

90
	},
91

92 93 94 95
	add: function ( v, w ) {

		if ( w !== undefined ) {

96
			console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
97 98 99
			return this.addVectors( v, w );

		}
M
Mr.doob 已提交
100

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

B
Ben Nolan 已提交
105 106
		return this;

107
	},
108

109
	addScalar: function ( s ) {
M
Mr.doob 已提交
110

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

B
Ben Nolan 已提交
115 116
		return this;

117
	},
118

119
	addVectors: function ( a, b ) {
120

121 122 123
		this.x = a.x + b.x;
		this.y = a.y + b.y;
		this.z = a.z + b.z;
124

125
		return this;
M
Mr.doob 已提交
126

127
	},
128

129 130 131 132
	sub: function ( v, w ) {

		if ( w !== undefined ) {

133
			console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
134 135 136
			return this.subVectors( v, w );

		}
137

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

B
Ben Nolan 已提交
142 143
		return this;

144
	},
C
Corey Birnbaum 已提交
145 146 147 148 149 150 151 152 153 154
	
	subScalar: function ( s ) {

		this.x -= s;
		this.y -= s;
		this.z -= s;

		return this;

	},
155

156
	subVectors: function ( a, b ) {
157

158 159 160
		this.x = a.x - b.x;
		this.y = a.y - b.y;
		this.z = a.z - b.z;
161

162
		return this;
M
Mr.doob 已提交
163

164
	},
165

166 167 168 169
	multiply: function ( v, w ) {

		if ( w !== undefined ) {

170
			console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );
171 172 173
			return this.multiplyVectors( v, w );

		}
174

M
Mr.doob 已提交
175 176
		this.x *= v.x;
		this.y *= v.y;
N
Nico Kruithof 已提交
177
		this.z *= v.z;
M
Mr.doob 已提交
178 179 180 181 182

		return this;

	},

183
	multiplyScalar: function ( scalar ) {
M
Mr.doob 已提交
184

185 186 187
		this.x *= scalar;
		this.y *= scalar;
		this.z *= scalar;
188

B
Ben Nolan 已提交
189 190
		return this;

191
	},
192

193 194 195 196 197 198 199 200 201 202
	multiplyVectors: function ( a, b ) {

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

		return this;

	},

M
Mr.doob 已提交
203 204 205 206 207 208 209 210
	applyEuler: function () {

		var quaternion;

		return function ( euler ) {

			if ( euler instanceof THREE.Euler === false ) {

211
				console.error( 'THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order.' );
M
Mr.doob 已提交
212 213 214 215 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

			}

			if ( quaternion === undefined ) quaternion = new THREE.Quaternion();

			this.applyQuaternion( quaternion.setFromEuler( euler ) );

			return this;

		};

	}(),

	applyAxisAngle: function () {

		var quaternion;

		return function ( axis, angle ) {

			if ( quaternion === undefined ) quaternion = new THREE.Quaternion();

			this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );

			return this;

		};

	}(),

241
	applyMatrix3: function ( m ) {
242 243 244 245 246 247 248

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

		var e = m.elements;

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

		return this;

	},

257
	applyMatrix4: function ( m ) {
258

259 260 261
		// input: THREE.Matrix4 affine matrix

		var x = this.x, y = this.y, z = this.z;
262 263 264

		var e = m.elements;

265 266 267
		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 ];
268 269 270 271 272

		return this;

	},

273 274 275 276 277 278 279
	applyProjection: function ( m ) {

		// input: THREE.Matrix4 projection matrix

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

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

282 283 284
		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;
285 286 287 288 289

		return this;

	},

290
	applyQuaternion: function ( q ) {
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305

		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;
306
		var iw = - qx * x - qy * y - qz * z;
307 308 309

		// calculate result * inverse quat

310 311 312
		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;
313 314 315 316 317

		return this;

	},

318
	project: function () {
319

320
		var matrix;
321

322
		return function ( camera ) {
323

324
			if ( matrix === undefined ) matrix = new THREE.Matrix4();
325

326 327
			matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );
			return this.applyProjection( matrix );
328 329 330 331 332

		};

	}(),

333
	unproject: function () {
334

335
		var matrix;
336

337
		return function ( camera ) {
338

339
			if ( matrix === undefined ) matrix = new THREE.Matrix4();
340

341 342
			matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );
			return this.applyProjection( matrix );
343 344 345 346 347

		};

	}(),

348 349 350 351 352 353 354 355 356
	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;

357 358 359
		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;
360 361 362 363 364 365 366

		this.normalize();

		return this;

	},

367
	divide: function ( v ) {
368

369 370 371 372 373
		this.x /= v.x;
		this.y /= v.y;
		this.z /= v.z;

		return this;
M
Mr.doob 已提交
374

M
Mr.doob 已提交
375
	},
376

377
	divideScalar: function ( scalar ) {
378

379
		if ( scalar !== 0 ) {
380

381 382 383 384 385
			var invScalar = 1 / scalar;

			this.x *= invScalar;
			this.y *= invScalar;
			this.z *= invScalar;
M
Mr.doob 已提交
386

M
Mr.doob 已提交
387
		} else {
M
Mr.doob 已提交
388

389 390 391
			this.x = 0;
			this.y = 0;
			this.z = 0;
392

M
Mr.doob 已提交
393
		}
394

B
Ben Nolan 已提交
395 396
		return this;

397
	},
398

399
	min: function ( v ) {
400

A
alteredq 已提交
401 402
		if ( this.x > v.x ) {

403
			this.x = v.x;
A
alteredq 已提交
404

405
		}
A
alteredq 已提交
406 407 408

		if ( this.y > v.y ) {

409
			this.y = v.y;
A
alteredq 已提交
410

411
		}
A
alteredq 已提交
412 413 414

		if ( this.z > v.z ) {

415
			this.z = v.z;
A
alteredq 已提交
416

417
		}
418 419 420 421 422

		return this;

	},

423
	max: function ( v ) {
424

A
alteredq 已提交
425 426
		if ( this.x < v.x ) {

427
			this.x = v.x;
A
alteredq 已提交
428

429
		}
A
alteredq 已提交
430 431 432

		if ( this.y < v.y ) {

433
			this.y = v.y;
A
alteredq 已提交
434

435
		}
A
alteredq 已提交
436 437 438

		if ( this.z < v.z ) {

439
			this.z = v.z;
A
alteredq 已提交
440

441
		}
442 443 444 445

		return this;

	},
M
Mr.doob 已提交
446

447
	clamp: function ( min, max ) {
448 449 450

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

A
alteredq 已提交
451 452
		if ( this.x < min.x ) {

453
			this.x = min.x;
A
alteredq 已提交
454 455 456

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

457
			this.x = max.x;
A
alteredq 已提交
458

459 460
		}

A
alteredq 已提交
461 462
		if ( this.y < min.y ) {

463
			this.y = min.y;
A
alteredq 已提交
464 465 466

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

467
			this.y = max.y;
A
alteredq 已提交
468

469 470
		}

A
alteredq 已提交
471 472
		if ( this.z < min.z ) {

473
			this.z = min.z;
A
alteredq 已提交
474 475 476

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

477
			this.z = max.z;
A
alteredq 已提交
478

479 480 481
		}

		return this;
A
alteredq 已提交
482

483 484
	},

485
	clampScalar: ( function () {
M
Mr.doob 已提交
486

487 488 489
		var min, max;

		return function ( minVal, maxVal ) {
M
Mr.doob 已提交
490 491 492

			if ( min === undefined ) {

493 494
				min = new THREE.Vector3();
				max = new THREE.Vector3();
M
Mr.doob 已提交
495

496 497
			}

M
Mr.doob 已提交
498 499 500 501
			min.set( minVal, minVal, minVal );
			max.set( maxVal, maxVal, maxVal );

			return this.clamp( min, max );
502 503

		};
M
Mr.doob 已提交
504

505 506
	} )(),

M
Mr.doob 已提交
507 508 509 510 511 512
	floor: function () {

		this.x = Math.floor( this.x );
		this.y = Math.floor( this.y );
		this.z = Math.floor( this.z );

513
		return this;
M
Mr.doob 已提交
514

515 516
	},

M
Mr.doob 已提交
517 518 519 520 521 522
	ceil: function () {

		this.x = Math.ceil( this.x );
		this.y = Math.ceil( this.y );
		this.z = Math.ceil( this.z );

523
		return this;
M
Mr.doob 已提交
524

525 526
	},

M
Mr.doob 已提交
527 528 529 530 531 532
	round: function () {

		this.x = Math.round( this.x );
		this.y = Math.round( this.y );
		this.z = Math.round( this.z );

533
		return this;
M
Mr.doob 已提交
534

535 536
	},

M
Mr.doob 已提交
537 538 539 540 541 542
	roundToZero: function () {

		this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
		this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
		this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );

543
		return this;
M
Mr.doob 已提交
544

545
	},
546

547
	negate: function () {
M
Mr.doob 已提交
548

M
Mr.doob 已提交
549 550 551 552 553
		this.x = - this.x;
		this.y = - this.y;
		this.z = - this.z;

		return this;
B
Ben Nolan 已提交
554

555
	},
556

557
	dot: function ( v ) {
M
Mr.doob 已提交
558

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

M
Mr.doob 已提交
561
	},
M
Mr.doob 已提交
562

563
	lengthSq: function () {
M
Mr.doob 已提交
564

M
Mr.doob 已提交
565
		return this.x * this.x + this.y * this.y + this.z * this.z;
M
Mr.doob 已提交
566 567 568

	},

569
	length: function () {
M
Mr.doob 已提交
570

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

M
Mr.doob 已提交
573
	},
574

575
	lengthManhattan: function () {
576

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

579 580
	},

581
	normalize: function () {
582

M
Mr.doob 已提交
583
		return this.divideScalar( this.length() );
584

585
	},
586

587
	setLength: function ( l ) {
588

589
		var oldLength = this.length();
M
Mr.doob 已提交
590

B
Ben Houston 已提交
591
		if ( oldLength !== 0 && l !== oldLength  ) {
592 593 594 595 596

			this.multiplyScalar( l / oldLength );
		}

		return this;
597

598
	},
599

600
	lerp: function ( v, alpha ) {
601 602 603 604 605 606 607 608

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

		return this;

	},
609

W
WestLangley 已提交
610 611
	lerpVectors: function ( v1, v2, alpha ) {

G
gero3 已提交
612
		this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
W
WestLangley 已提交
613

G
gero3 已提交
614
		return this;
W
WestLangley 已提交
615 616 617

	},

618 619 620 621
	cross: function ( v, w ) {

		if ( w !== undefined ) {

622
			console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );
623 624 625
			return this.crossVectors( v, w );

		}
626

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

629 630 631
		this.x = y * v.z - z * v.y;
		this.y = z * v.x - x * v.z;
		this.z = x * v.y - y * v.x;
632

633
		return this;
634 635 636

	},

637 638
	crossVectors: function ( a, b ) {

639 640 641 642 643 644
		var ax = a.x, ay = a.y, az = a.z;
		var bx = b.x, by = b.y, bz = b.z;

		this.x = ay * bz - az * by;
		this.y = az * bx - ax * bz;
		this.z = ax * by - ay * bx;
645 646 647 648 649

		return this;

	},

M
Mr.doob 已提交
650 651
	projectOnVector: function () {

M
Mr.doob 已提交
652
		var v1, dot;
M
Mr.doob 已提交
653 654 655 656 657 658 659

		return function ( vector ) {

			if ( v1 === undefined ) v1 = new THREE.Vector3();

			v1.copy( vector ).normalize();

M
Mr.doob 已提交
660 661 662
			dot = this.dot( v1 );

			return this.copy( v1 ).multiplyScalar( dot );
M
Mr.doob 已提交
663 664 665 666 667 668 669 670 671 672 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

		};

	}(),

	projectOnPlane: function () {

		var v1;

		return function ( planeNormal ) {

			if ( v1 === undefined ) v1 = new THREE.Vector3();

			v1.copy( this ).projectOnVector( planeNormal );

			return this.sub( v1 );

		}

	}(),

	reflect: function () {

		// reflect incident vector off plane orthogonal to normal
		// normal is assumed to have unit length

		var v1;

		return function ( normal ) {

			if ( v1 === undefined ) v1 = new THREE.Vector3();

			return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );

		}

	}(),

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

703 704
		var theta = this.dot( v ) / ( this.length() * v.length() );

705 706
		// clamp, to handle numerical problems

707
		return Math.acos( THREE.Math.clamp( theta, - 1, 1 ) );
M
Mr.doob 已提交
708 709

	},
W
Wilt 已提交
710

711
	distanceTo: function ( v ) {
712

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

M
Mr.doob 已提交
715 716
	},

717
	distanceToSquared: function ( v ) {
M
Mr.doob 已提交
718

M
Mr.doob 已提交
719 720 721 722
		var dx = this.x - v.x;
		var dy = this.y - v.y;
		var dz = this.z - v.z;

723
		return dx * dx + dy * dy + dz * dz;
M
Mr.doob 已提交
724

725
	},
M
Mr.doob 已提交
726

727 728
	setEulerFromRotationMatrix: function ( m, order ) {

729
		console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );
730 731 732 733 734

	},

	setEulerFromQuaternion: function ( q, order ) {

735
		console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );
M
Mr.doob 已提交
736

737 738
	},

W
WestLangley 已提交
739 740
	getPositionFromMatrix: function ( m ) {

741
		console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );
W
WestLangley 已提交
742

743
		return this.setFromMatrixPosition( m );
W
WestLangley 已提交
744 745 746

	},

M
Mr.doob 已提交
747 748
	getScaleFromMatrix: function ( m ) {

749
		console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );
750 751 752 753 754 755

		return this.setFromMatrixScale( m );
	},

	getColumnFromMatrix: function ( index, matrix ) {

756
		console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );
757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776

		return this.setFromMatrixColumn( index, matrix );

	},

	setFromMatrixPosition: function ( m ) {

		this.x = m.elements[ 12 ];
		this.y = m.elements[ 13 ];
		this.z = m.elements[ 14 ];

		return this;

	},

	setFromMatrixScale: function ( m ) {

		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 已提交
777

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

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

785
	setFromMatrixColumn: function ( index, matrix ) {
786
		
787
		var offset = index * 4;
W
WestLangley 已提交
788

789
		var me = matrix.elements;
W
WestLangley 已提交
790

791 792 793
		this.x = me[ offset ];
		this.y = me[ offset + 1 ];
		this.z = me[ offset + 2 ];
W
WestLangley 已提交
794 795 796 797 798

		return this;

	},

M
Mr.doob 已提交
799
	equals: function ( v ) {
800 801 802

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

803 804
	},

805
	fromArray: function ( array, offset ) {
806

807 808 809 810 811
		if ( offset === undefined ) offset = 0;

		this.x = array[ offset ];
		this.y = array[ offset + 1 ];
		this.z = array[ offset + 2 ];
812

M
Mr.doob 已提交
813 814
		return this;

815 816
	},

817
	toArray: function ( array, offset ) {
818

A
arose 已提交
819 820
		if ( array === undefined ) array = [];
		if ( offset === undefined ) offset = 0;
821

A
arose 已提交
822 823 824
		array[ offset ] = this.x;
		array[ offset + 1 ] = this.y;
		array[ offset + 2 ] = this.z;
825

A
arose 已提交
826
		return array;
827

828 829
	},

W
WestLangley 已提交
830 831
	fromAttribute: function ( attribute, index, offset ) {

G
gero3 已提交
832
		if ( offset === undefined ) offset = 0;
W
WestLangley 已提交
833

G
gero3 已提交
834
		index = index * attribute.itemSize + offset;
W
WestLangley 已提交
835

G
gero3 已提交
836 837 838
		this.x = attribute.array[ index ];
		this.y = attribute.array[ index + 1 ];
		this.z = attribute.array[ index + 2 ];
W
WestLangley 已提交
839

G
gero3 已提交
840
		return this;
W
WestLangley 已提交
841 842 843

	},

M
Mr.doob 已提交
844 845 846 847
	clone: function () {

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

848
	}
849

850
};