123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
- /**
- * @author mr.doob / http://mrdoob.com/
- * @author kile / http://kile.stravaganza.org/
- * @author philogb / http://blog.thejit.org/
- * @author mikael emtinger / http://gomo.se/
- */
- THREE.Vector3 = function ( x, y, z ) {
- this.set(
- x || 0,
- y || 0,
- z || 0
- );
- };
- THREE.Vector3.prototype = {
- set : function ( x, y, z ) {
- this.x = x;
- this.y = y;
- this.z = z;
- return this;
- },
- copy : function ( v ) {
- this.set(
- v.x,
- v.y,
- v.z
- );
- return this;
- },
- add : function ( a, b ) {
- this.set(
- a.x + b.x,
- a.y + b.y,
- a.z + b.z
- );
- return this;
- },
- addSelf : function ( v ) {
- this.set(
- this.x + v.x,
- this.y + v.y,
- this.z + v.z
- );
- return this;
- },
- addScalar : function ( s ) {
- this.set(
- this.x + s,
- this.y + s,
- this.z + s
- );
- return this;
- },
- sub : function ( a, b ) {
- this.set(
- a.x - b.x,
- a.y - b.y,
- a.z - b.z
- );
- return this;
- },
- subSelf : function ( v ) {
- this.set(
- this.x - v.x,
- this.y - v.y,
- this.z - v.z
- );
- return this;
- },
- cross : function ( a, b ) {
- this.set(
- a.y * b.z - a.z * b.y,
- a.z * b.x - a.x * b.z,
- a.x * b.y - a.y * b.x
- );
- return this;
- },
- crossSelf : function ( v ) {
- var tx = this.x, ty = this.y, tz = this.z;
- this.set(
- ty * v.z - tz * v.y,
- tz * v.x - tx * v.z,
- tx * v.y - ty * v.x
- );
- return this;
- },
- multiply : function ( a, b ) {
- this.set(
- a.x * b.x,
- a.y * b.y,
- a.z * b.z
- );
- return this;
- },
- multiplySelf : function ( v ) {
- this.set(
- this.x * v.x,
- this.y * v.y,
- this.z * v.z
- );
- return this;
- },
- multiplyScalar : function ( s ) {
- this.set(
- this.x * s,
- this.y * s,
- this.z * s
- );
- return this;
- },
- divideSelf : function ( v ) {
- this.set(
- this.x / v.x,
- this.y / v.y,
- this.z / v.z
- );
- return this;
- },
- divideScalar : function ( s ) {
- this.set(
- this.x / s,
- this.y / s,
- this.z / s
- );
- return this;
- },
- negate : function () {
- this.set(
- - this.x,
- - this.y,
- - this.z
- );
- return this;
- },
- dot : function ( v ) {
- return this.x * v.x + this.y * v.y + this.z * v.z;
- },
- distanceTo : function ( v ) {
- return Math.sqrt( this.distanceToSquared( v ) );
- },
- distanceToSquared : function ( v ) {
- var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;
- return dx * dx + dy * dy + dz * dz;
- },
- length : function () {
- return Math.sqrt( this.lengthSq() );
- },
- lengthSq : function () {
- return this.x * this.x + this.y * this.y + this.z * this.z;
- },
- lengthManhattan : function () {
- return this.x + this.y + this.z;
- },
- normalize : function () {
- var l = this.length();
- l > 0 ? this.multiplyScalar( 1 / l ) : this.set( 0, 0, 0 );
- return this;
- },
- setPositionFromMatrix : function ( m ) {
- this.x = m.n14;
- this.y = m.n24;
- this.z = m.n34;
- },
- setRotationFromMatrix : function ( m ) {
- this.y = Math.asin( m.n13 );
- var cosY = Math.cos( this.y );
- if ( Math.abs( cosY ) > 0.00001 ) {
- this.x = Math.atan2( - m.n23 / cosY, m.n33 / cosY );
- this.z = Math.atan2( - m.n13 / cosY, m.n11 / cosY );
- } else {
- this.x = 0;
- this.z = Math.atan2( m.n21, m.n22 );
- }
- },
- setLength : function ( l ) {
- return this.normalize().multiplyScalar( l );
- },
- isZero : function () {
- var almostZero = 0.0001;
- return ( Math.abs( this.x ) < almostZero ) && ( Math.abs( this.y ) < almostZero ) && ( Math.abs( this.z ) < almostZero );
- },
- clone : function () {
- return new THREE.Vector3( this.x, this.y, this.z );
- }
- };
|