threejs 源码解析_threejs里面的vector3源码解析

这篇博客详细解析了Three.js库中Vector3对象的源码,包括构造函数、坐标设置方法、向量操作如加减乘除、投影、反射、距离计算等。通过阅读,可以深入了解Three.js中三维向量的实现原理。
摘要由CSDN通过智能技术生成

// File:src/math/Vector3.js

/**

* @author mrdoob / http://mrdoob.com/

* @author *kile / http://kile.stravaganza.org/

* @author philogb / http://blog.thejit.org/

* @author mikael emtinger / http://gomo.se/

* @author egraether / http://egraether.com/

* @author WestLangley / http://github.com/WestLangley

*/

/*

///Vector3对象的构造函数.用来创建一个三维向量的对象.Vector3对象的功能函数采用

///定义构造的函数原型对象来实现.

///

/// 用法: var p2d = new Vector3(5,3,2)

/// 创建一个x坐标为5,y坐标为3的向量,z坐标为2的向量.

/// NOTE: 参数(x,y,z)坐标为可选参数,如果不指定参数(x,y,z),将创建一个坐标为(0,0,0)的向量.

*/

///Vector3

///x坐标

///y坐标

///z坐标

THREE.Vector3 = function ( x, y, z ) {

this.x = x || 0;

this.y = y || 0;

this.z = z || 0;

};

/****************************************

****下面是Vector3对象提供的功能函数.

****************************************/

THREE.Vector3.prototype = {

constructor: THREE.Vector3, //构造器

/*

///set方法用来从新设置三维向量的x,y,z坐标值.并返回新的坐标值的三维向量.

*/

///set

///x坐标

///y坐标

///y坐标

///返回新坐标值的三维向量

set: function ( x, y, z ) {

this.x = x;

this.y = y;

this.z = z;

return this;    //返回新坐标值的三维向量

},

/*

///setX方法用来从新设置三维向量的x坐标值.并返回新的坐标值的三维向量.

*/

///setX

///x坐标

///返回新坐标值的三维向量

setX: function ( x ) {

this.x = x;

return this;    //返回新坐标值的三维向量

},

/*

///setY方法用来从新设置三维向量的y坐标值.并返回新的坐标值的三维向量.

*/

///setY

///y坐标

///返回新坐标值的三维向量

setY: function ( y ) {

this.y = y;

return this;    //返回新坐标值的三维向量

},

/*

///setZ方法用来从新设置三维向量的z坐标值.并返回新的坐标值的三维向量.

*/

///setZ

///z坐标

///返回新坐标值的三维向量

setZ: function ( z ) {

this.z = z;

return this;    //返回新坐标值的三维向量

},

/*

///setComponent方法用来从新设置三维向量的(x,y)坐标值.并返回新的坐标值的三维向量.

///参数index取值为0,1 或者 2,取值为0,参数value设置x的坐标值,取值为1,参数value设置y的坐标,

///取值为2,参数value设置z的坐标.

*/

///setComponent

///0,1或2

///x, y 或 z坐标

setComponent: function ( index, value ) {

switch ( index ) {

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

}

},

/*

///getComponent方法用获得三维向量的(x,y,z)坐标值.

///参数index取值为0,1 或者 2,取值为0,获得x的坐标值,取值为1,获得y的坐标,

///取值为2,获得z的坐标.

*/

///setComponent

///0,1或2

getComponent: function ( index ) {

switch ( index ) {

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

}

},

/*

///copy方法用来复制三维向量的(x,y,z)坐标值.并返回新的坐标值的三维向量.

*/

///copy

///三维向量

///返回新坐标值的三维向量

copy: function ( v ) {

this.x = v.x;

this.y = v.y;

this.z = v.z;

return this;    //返回新坐标值的三维向量

},

/*

///add方法用来将三维向量的(x,y,z)坐标值与参数v的(x,y,z)相加.并返回新的坐标值的三维向量.

/// NOTE:add()方法虽然有两个参数,但实际上只对参数v做运算,这里的参数w,如果设置的话,调用.addVectors()方法.

*/

///add

///与当前对象(x,y,z)坐标值增加的向量

///判断是否有第二个参数w,如果有的话,调用.addVectors()方法

///返回新坐标值的二维向量

add: function ( v, w ) {

if ( w !== undefined ) {    //判断是否有第二个参数w,如果有的话,调用.addVectors()方法.

//THREE.Vector3: .add()方法现在只有一个参数,如果2个参数使用.addVectors( a, b )方法来替代.

console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );

return this.addVectors( v, w );

}

this.x += v.x;

this.y += v.y;

this.z += v.z;

return this;    //返回新坐标值的三维向量

},

/*

///addScalar方法用来将三维向量的(x,y,z)坐标值直接与参数s相加.并返回新的坐标值的三维向量.

/// NOTE:这里与add()方法不同的是,这里传递的参数s是一个标量,而add()方法的参数v是一个三维向量.

*/

///addScalar

///(x,y,z)要增加的数值

///返回新坐标值的三维向量

addScalar: function ( s ) {

this.x += s;

this.y += s;

this.z += s;

return this;    //返回新坐标值的三维向量

},

/*

///addVectors方法用来将三维向量的(x,y,z)坐标值等于参数(a,b)的(x,y,z)相加.并返回新的坐标值的三维向量.

/// NOTE:两个矢量组件对应相加。

*/

///addVectors

///三维向量

///三维向量

///返回新坐标值的三维向量

addVectors: function ( a, b ) {

this.x = a.x + b.x;

this.y = a.y + b.y;

this.z = a.z + b.z;

return this;    //返回新坐标值的三维向量

},

/*

///sub方法用来将三维向量的(x,y,z)坐标值与参数v的(x,y,z)相减.并返回新的坐标值的三维向量.

/// NOTE:sub()方法虽然有两个参数,但实际上只对参数v做运算,这里的参数w,如果设置的话,调用.subVectors()方法.

*/

///sub

///与当前对象(x,y,z)坐标值增加的三维向量

///判断是否有第二个参数w,如果有的话,调用.subVectors()方法

///返回新坐标值的三维向量

sub: function ( v, w ) {

if ( w !== undefined ) {    //判断是否有第二个参数w,如果有的话,调用.subVectors()方法.

//THREE.Vector3: .sub()方法现在只有一个参数,如果2个参数使用.subVectors( a, b )方法来替代.

console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );

return this.subVectors( v, w );

}

this.x -= v.x;

this.y -= v.y;

this.z -= v.z;

return this;    //返回新坐标值的三维向量

},

/*

///subVectors方法用来将三维向量的(x,y,z)坐标值分别于参数(a,b)的(x,y,z)相减.并返回新的坐标值的三维向量.

*/

///subVectors

///三维向量

///三维向量

///返回新坐标值的三维向量

subVectors: function ( a, b ) {

this.x = a.x - b.x;

this.y = a.y - b.y;

this.z = a.z - b.z;

return this;    //返回新坐标值的三维向量

},

/*

///multiply方法用来将三维向量的(x,y,z)坐标值与参数v的(x,y,z)相乘.并返回新的坐标值的三维向量.

*/

///multiply

///与当前对象(x,y,z)值相乘的三维向量

///判断是否有第二个参数w,如果有的话,调用.multiplyVectors()方法

///返回新坐标值的三维向量

multiply: function ( v

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值