three.js 源码注释(六十)objects/Line.js

时间:2021-09-28 03:17:23

商域无疆 (http://blog.csdn.net/omni360/)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化、GOLANG、Html5、WEBGL、THREE.JS否则,出自本博客的文章拒绝转载或再转载,谢谢合作。


俺也是刚开始学,好多地儿肯定不对还请见谅.

以下代码是THREE.JS 源码文件中objects/Line.js文件的注释.

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


/**
 * @author mrdoob / http://mrdoob.com/
 */
/*
///Line对象,创建一条线,或者一组线.
/// 用法:var geometry = new THREE.Geometry();				//创建geometry对象
///		 var material = new THREE.LineBasicMaterial({color: 0xffff00});	//创建材质对象,这里有专门适用于line对象的材质对象LineBasicMaterial.
///		 geometry.verteces.push(new THREE.Vector3(-10,0,0),			//为geometry对象添加verteces顶点数据
///				new THREE.Vector3(0,10,0),
///				new THREE.Vector3(10,0,0)
///		 );
///		 var line = new THREE.Mesh(geometry, material,THREE.LineStrip);	//通过geometry的顶点数据创建材质为material,类型为THREE.LineStrip(不闭合的折线)的线.
///		 scene.add(line); 	//将线添加到场景中.
*/
///<summary>Line</summary>
///<param name ="geometry" type="THREE.Geometry">Geometry对象(灯笼的框架)</param>
///<param name ="material" type="THREE.Material">Material对象(材质对象)</param>
///<param name ="type" type="线类型常量">线类型常量,有不闭合折线(THREE.LineStrip),多组双顶点线段(THREE.LinePieces)</param>
///<returns type="Mesh">返回Line对象</returns>
THREE.Line = function ( geometry, material, type ) {

	THREE.Object3D.call( this );	//调用Object3D对象的call方法,将原本属于Object3D的方法交给当前对象Line来使用.

	this.geometry = geometry !== undefined ? geometry : new THREE.Geometry();	//将参数geometry赋值给line对象的geometry属性
	this.material = material !== undefined ? material : new THREE.LineBasicMaterial( { color: Math.random() * 0xffffff } );	//将参数material赋值给line对象的material属性,如果没有传递material参数,将创建随机颜色材质,赋值给当前mesh对象

	this.type = ( type !== undefined ) ? type : THREE.LineStrip;	//将参数type赋值给line对像的type属性,如果没有传递type参数,默认初始化为THREE.LineStrip类型.

};

THREE.LineStrip = 0;	//不闭合折线
THREE.LinePieces = 1;	//多组双顶点线段
//TODO: 缺少THREE.LineLoop	//闭合折线.

/*************************************************
****下面是Line对象的方法属性定义,继承自Object3D
**************************************************/
THREE.Line.prototype = Object.create( THREE.Object3D.prototype );

/*
///raycast方法用来获得当前对象与射线(参数raycaster)的交点.raycaster.intersectObject会调用这个方法。主要是用来进行碰撞检测,
/// 在选择场景中的对象时经常会用到,判断当前鼠标是否与对象重合用来选择对象.
/// NOTE:raycast方法中参数intersects参数用来存储交点的集合,格式如下
///	intersects.push( {
///
///				distance: distance,
///				point: intersectionPoint,
///				face: null,
///				faceIndex: null,
///				object: this
///
///			} );
///
*////<summary>raycast</summary>
///<param name ="raycaster" type="THREE.Raycaster">射线对象</param>
///<param name ="intersects" type="ObjectArray">交点的属性集合</param>
///<returns type="ObjectArray">交点的属性集合</returns>
THREE.Line.prototype.raycast = ( function () {

	var inverseMatrix = new THREE.Matrix4();
	var ray = new THREE.Ray();
	var sphere = new THREE.Sphere();

	return function ( raycaster, intersects ) {

		var precision = raycaster.linePrecision;	//射线和Line对象相交的精度因子。
		var precisionSq = precision * precision;	//精度因子的平方

		var geometry = this.geometry;

		if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();	//确保boundingSphere属性不为null

		// Checking boundingSphere distance to ray
		//检查线段的球体界限到射线的距离

		sphere.copy( geometry.boundingSphere );
		sphere.applyMatrix4( this.matrixWorld );

		if ( raycaster.ray.isIntersectionSphere( sphere ) === false ) {		//如果几何体的球体界限与射线不想交

			return;														    //返回

		}

		inverseMatrix.getInverse( this.matrixWorld );	//获得当前对象的this.matrixWorld属性的逆矩阵
		ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );	//给射线对象的原点,方向,乘以逆矩阵,

		/* if ( geometry instanceof THREE.BufferGeometry ) {

		} else */ if ( geometry instanceof THREE.Geometry ) {

			var vertices = geometry.vertices;
			var nbVertices = vertices.length;
			var interSegment = new THREE.Vector3();
			var interRay = new THREE.Vector3();
			var step = this.type === THREE.LineStrip ? 1 : 2;

			for ( var i = 0; i < nbVertices - 1; i = i + step ) {	//如果是不闭合折线,每次自变量+1,如果是多组双顶点线段,自变量每次+2

				var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );	//distanceSqToSegment方法将返回有参数vertices[ i ], vertices[ i + 1 ]组成的线段到当前射线的最小距离.interRay, interSegment,分别用来存储在射线上和在线段上的垂足

				if ( distSq > precisionSq ) continue;	//如果最小距离大于精度因子,退出循环.

				var distance = ray.origin.distanceTo( interRay );	//射线原点到射线到线段的垂足的距离.

				if ( distance < raycaster.near || distance > raycaster.far ) continue;	//如果距离小于射线的近端,或大于射线的远端,跳出循环

				intersects.push( {		//将相交的对象,顶点索引,距离,交点保存到intersects属性数组中

					distance: distance,		//距离
					// What do we want? intersection point on the ray or on the segment??
					// 我们要什么,交点在射线上或者在线段上
					// point: raycaster.ray.at( distance ), 如果要在射线上,那就将raycaster.ray.at( distance )的赋值给point
					point: interSegment.clone().applyMatrix4( this.matrixWorld ),	//如果想要获得交点在线段的位置,将interSegment.clone().applyMatrix4( this.matrixWorld )赋值给point
					face: null,			//面
					faceIndex: null,		//面所在属性数组中的索引
					object: this			//对象

				} );

			}

		}

	};

}() );

/*clone方法
///clone方法克隆一个Line网格对象.
*/
///<summary>clone</summary>
///<param name ="object" type="Object3D">接收克隆的Object3D对象</param>
///<returns type="Ray">返回Line网格对象.</returns>	
THREE.Line.prototype.clone = function ( object ) {

	if ( object === undefined ) object = new THREE.Line( this.geometry, this.material, this.type );

	THREE.Object3D.prototype.clone.call( this, object );	//继承Object3D的clone方法

	return object;		//返回Mesh网格对象.

};


商域无疆 (http://blog.csdn.net/omni360/)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化、GOLANG、Html5、WEBGL、THREE.JS否则,出自本博客的文章拒绝转载或再转载,谢谢合作。


以下代码是THREE.JS 源码文件中objects/Line.js文件的注释.

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