商域无疆 (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文件的注释.