three.js 源碼註釋(十)Math/Line3.js

商域無疆 (https://blog.csdn.net/omni360/)

本文遵循“署名-非商業用途-保持一致”創作公用協議

轉載請保留此句:商域無疆 – 本博客專註於 敏捷開發及移動和物聯設備研究:數據可視化、GOLANG、Html5、WEBGL、THREE.JS,否則,出自本博客的文章拒絕轉載或再轉載,謝謝合作。

俺也是剛開始學,好多地兒肯定不對還請見諒.

以下代碼是THREE.JS 源碼文件中Math/Line3.js文件的註釋.

更多更新在 : https://github.com/omni360/three.js.sourcecode/blob/master/Three.js

// File:src/math/Line3.js

/**
 * @author bhouston / https://exocortex.com
 */
/*
///Line3對象的構造函數.用來創建一個三維線段對象.Line3對象的功能函數采用
///定義構造的函數原型對象來實現.
///
///	用法: var start = new Vector3(0,0,0),end = new Vector3(1,1,1); var line = new Line3(start,end);
///	創建一個起始點start為0,0,0,結束點end為1,1,1的線段.
*/
///Vector3
///起始點坐標
///結束點坐標
THREE.Line3 = function ( start, end ) {

	this.start = ( start !== undefined ) ? start : new THREE.Vector3();
	this.end = ( end !== undefined ) ? end : new THREE.Vector3();

};

/****************************************
****下面是Line3對象提供的功能函數.
****************************************/
THREE.Line3.prototype = {

	constructor: THREE.Line3,		//構造器

	/*
	///set方法用來從新設置三維線段的起始點,結束點,start,end坐標值.並返回新的坐標值的三維線段.
	*/
	///set
	///起始點坐標
	///結束點坐標
	///返回新坐標值的三維線段
	set: function ( start, end ) {

		this.start.copy( start );
		this.end.copy( end );

		return this;		//返回新坐標值的三維線段

	},

	/*
	///copy方法用來復制三維線段的起始點,結束點,start,end坐標值.並返回新的坐標值的三維線段.
	*/
	///copy
	///三維線段
	///返回新坐標值的三維線段
	copy: function ( line ) {

		this.start.copy( line.start );
		this.end.copy( line.end );

		return this;	//返回新坐標值的三維線段

	},

	/*
	///center方法用來獲得線段的中點.
	/// NOTE:optionalTarget是可選參數,如果沒有設置,系統自動創建一個臨時Vector3對象
	*/
	///center
	///optionalTarget是可選參數,如果沒有設置,系統自動創建一個臨時Vector3對象
	///返回三維線段中點坐標
	center: function ( optionalTarget ) {

		var result = optionalTarget || new THREE.Vector3();			//optionalTarget是可選參數,如果沒有設置,系統自動創建一個臨時Vector3對象
		return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );		//返回三維線段中點坐標

	},

	/*
	///delta方法用來獲得線段的向量,然後在通過矩陣應用各種便變換,放大縮小,移動等.
	/// NOTE:optionalTarget是可選參數,如果沒有設置,系統自動創建一個臨時Vector3對象
	/// NOTE:向量就是有向線段這句是錯的,因為有向線段是固定的,即不能平移,而向量是可以平移的
	*/
	///delta
	///optionalTarget是可選參數,如果沒有設置,系統自動創建一個臨時Vector3對象
	///返回三維線段的向量
	delta: function ( optionalTarget ) {

		var result = optionalTarget || new THREE.Vector3();		//optionalTarget是可選參數,如果沒有設置,系統自動創建一個臨時Vector3對象
		return result.subVectors( this.end, this.start );		//返回三維線段的向量

	},

	/*
	///distanceSq方法用來獲得當前三維線段起始點到端點的點積(點乘,數量積)(隻讀).
	/// NOTE:關於點積的介紹參考維基百科:https://zh.wikipedia.org/wiki/%E6%95%B0%E9%87%8F%E7%A7%AF
	*/
	///distanceSq
	///返回當前三維線段起始點到端點的點積(點乘,數量積)
	distanceSq: function () {

		return this.start.distanceToSquared( this.end );	//返回當前三維線段起始點到端點的點積(點乘,數量積)

	},

	/*
	///distanceTo方法將返回當前三維線段起始點到端點的的距離(隻讀).
	*/
	///distanceTo
	///返回當前三維線段起始點到端點的距離(隻讀).
	distance: function () {

		return this.start.distanceTo( this.end );	//返回當前三維線段起始點到端點的距離(隻讀).

	},

	/*
	///at方法將返回沿當前三維線段方向的任意向量,當t=0,返回起點向量,當t=1返回結束點向量.
	/// NOTE:optionalTarget是可選參數,如果沒有設置,系統自動創建一個臨時Vector3對象
	*/
	///at
	///數值,取值范圍0-1
	///optionalTarget是可選參數,如果沒有設置,系統自動創建一個臨時Vector3對象
	///返回沿當前三維線段方向的任意向量/returns>
	at: function ( t, optionalTarget ) {

		var result = optionalTarget || new THREE.Vector3();	//optionalTarget是可選參數,如果沒有設置,系統自動創建一個臨時Vector3對象

		return this.delta( result ).multiplyScalar( t ).add( this.start );	//返回沿當前三維線段方向的任意向量

	},

	/*
	///closestPointToPointParameter方法將返回一個基於點投影到線段上點的參數(就是參數point投影到線段的位置)。如果參數clampToLine為真,那麼返回值將是0和1之間。
	*/
	///closestPointToPointParameter
	///數值,取值范圍0-1
	///如果參數clampToLine為真,那麼返回值將是0和1之間。
	///返回一個基於最近點投影到線段上點的參數/returns>
	closestPointToPointParameter: function () {

		var startP = new THREE.Vector3();
		var startEnd = new THREE.Vector3();

		return function ( point, clampToLine ) {

			startP.subVectors( point, this.start );
			startEnd.subVectors( this.end, this.start );

			var startEnd2 = startEnd.dot( startEnd );
			var startEnd_startP = startEnd.dot( startP );

			var t = startEnd_startP / startEnd2;

			if ( clampToLine ) {

				t = THREE.Math.clamp( t, 0, 1 ); 	//調用THREE.Math.clamp()方法保證t值在0-1之間.

			}

			return t;	//返回一個基於最近點投影到線段上點的參數(就是參數point投影到線段的位置)

		};

	}(),

	/*
	///closestPointToPoint方法將返回一個基於點投影到線段上的向量。如果參數clampToLine為真,那麼返回的向量在線段起始點和結束點之間。
	/// NOTE:optionalTarget是可選參數,如果沒有設置,系統自動創建一個臨時Vector3對象
	*/
	///closestPointToPoint
	///數值,取值范圍0-1
	///如果參數clampToLine為真,那麼返回的向量在線段起始點和結束點之間。
	///optionalTarget是可選參數,如果沒有設置,系統自動創建一個臨時Vector3對象
	///返回一個基於最近點投影到線段上的向量/returns>
	closestPointToPoint: function ( point, clampToLine, optionalTarget ) {

		var t = this.closestPointToPointParameter( point, clampToLine );

		var result = optionalTarget || new THREE.Vector3();

		return this.delta( result ).multiplyScalar( t ).add( this.start );	//返回一個基於最近點投影到線段上的向量

	},

	/*
	///applyMatrix4方法對線段的起始點,結束點應用矩陣變換.達到旋轉,縮放,移動的目的.
	*/
	///applyMatrix4
	///仿射矩陣
	///返回新坐標值的三維線段
	applyMatrix4: function ( matrix ) {

		this.start.applyMatrix4( matrix );
		this.end.applyMatrix4( matrix );

		return this;	//返回新坐標值的三維線段

	},

	/*
	///equals方法將當前線段和參數line做對比,線段對比,就是起始點和結束點對比. 判斷線段是否相等,返回true或者false.
	*/
	///equals
	///作對比的線段
	///返回true或者false
	equals: function ( line ) {

		return line.start.equals( this.start ) && line.end.equals( this.end );	//返回true或者false

	},

	/*clone方法
	///clone方法克隆一個三維線段對象.
	*/
	///clone
	///返回三維線段對象	
	clone: function () {

		return new THREE.Line3().copy( this );	//返回三維線段對象

	}

};

商域無疆 (https://blog.csdn.net/omni360/)

本文遵循“署名-非商業用途-保持一致”創作公用協議

轉載請保留此句:商域無疆 – 本博客專註於 敏捷開發及移動和物聯設備研究:數據可視化、GOLANG、Html5、WEBGL、THREE.JS,否則,出自本博客的文章拒絕轉載或再轉載,謝謝合作。

以下代碼是THREE.JS 源碼文件中Math/Line3.js文件的註釋.

更多更新在 : https://github.com/omni360/three.js.sourcecode/blob/master/Three.js

發佈留言