Core::Ray

该类用来表示空间中的“射线”,主要用来进行碰撞检测。

THREE.Ray = function ( origin, direction ) {
this.origin = ( origin !== undefined ) ? origin : new THREE.Vector3();
this.direction = ( direction !== undefined ) ? direction : new THREE.Vector3();
};

Ray类的构造函数颇为简单,只有两个参数origin和direction,顾名思义,也就是端点和方向。

Ray类的主要作用是进行碰撞检测。

THREE.Ray.prototype = {

    constructor: THREE.Ray,
set: function ( origin, direction ) {...},
copy: function ( ray ) {...}, at: function( t, optionalTarget ) {
var result = optionalTarget || new THREE.Vector3();
return result.copy( this.direction ).multiplyScalar( t ).add( this.origin );
}, recast: function ( t ) {
this.origin.copy( this.at( t, THREE.Ray.__v1 ) );
return this;
}, closestPointToPoint: function ( point, optionalTarget ) {
var result = optionalTarget || new THREE.Vector3();
result.subVectors( point, this.origin );
var directionDistance = result.dot( this.direction );
return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
}, distanceToPoint: function ( point ) {
var directionDistance = THREE.Ray.__v1.subVectors( point, this.origin ).dot( this.direction );
THREE.Ray.__v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
return THREE.Ray.__v1.distanceTo( point );
}, isIntersectionSphere: function( sphere ) {
return ( this.distanceToPoint( sphere.center ) <= sphere.radius );
}, isIntersectionPlane: function ( plane ) {
// check if the line and plane are non-perpendicular, if they
// eventually they will intersect.
var denominator = plane.normal.dot( this.direction );
if ( denominator != ) {
return true;
}
// line is coplanar, return origin
if( plane.distanceToPoint( this.origin ) == ) {
return true;
}
return false;
}, distanceToPlane: function ( plane ) {
var denominator = plane.normal.dot( this.direction );
if ( denominator == ) {
// line is coplanar, return origin
if( plane.distanceToPoint( this.origin ) == ) {
return ;
}
// Unsure if this is the correct method to handle this case.
return undefined;
}
var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;
return t;
}, intersectPlane: function ( plane, optionalTarget ) {
var t = this.distanceToPlane( plane );
if( t === undefined ) {
return undefined;
}
return this.at( t, optionalTarget );
}, transform: function ( matrix4 ) {...},
equals: function ( ray ) {...},
clone: function () {...}
};

Ray类有这样一些方法:

  • at(t, optionalTarget):返回射线上与射线端点距离为t的点。如果传入了optionalTarget参数,那么就将该对象设置为返回的点(下同)。
  • closestPointToPoint: function ( point, optionalTarget ):传入一个点,返回由该点向射线引垂线得到的垂足。
  • distanceToPoint: function ( point ):传入一个点,返回该点到射线的距离。
  • distanceToPlane: function( plane ):传入一个平面,返回该平面到与射线的距离(如果射线与平面不平行,那么距离就为0)。
  • isIntersectionSphere:function( sphere ):判断射线是否与一个球体有交点,传入的参数sphere需要有radius和center属性(比如,传入sphereGeometry就是没用的)。
  • isIntersectionPlane:function( plane ):判断射线是否与一个平面有交点,传入的参数plane需要有normal属性。
  • recast(t):将Three.Ray.__v1(这个变量)设置为调用者的at(t)位置。(Three.Ray.__v1和Three.Ray.__v2是定义在Three.Ray而不是其peototype上的临时变量,类似于C++中的静态变量)。

Material::MeshBasicMaterial

之前我们分析过Material类和LineBasicMaterial类,现在我们来看剩下的几个材质类。MeshBasicMaterial是一种“光照无关”的材质,也就是说,在没有光照的情况下,材质依然能够要显示出来。

THREE.MeshBasicMaterial = function ( parameters ) {

    THREE.Material.call( this );
this.color = new THREE.Color( 0xffffff ); // emissive this.map = null;
this.lightMap = null;
this.specularMap = null;
this.envMap = null; this.combine = THREE.MultiplyOperation;
this.reflectivity = ;
this.refractionRatio = 0.98; this.fog = true;
this.shading = THREE.SmoothShading;
this.wireframe = false;
this.wireframeLinewidth = ;
this.wireframeLinecap = 'round';
this.wireframeLinejoin = 'round';
this.vertexColors = THREE.NoColors; this.skinning = false;
this.morphTargets = false;
this.setValues( parameters );
};

MeshBasicMaterial包括这样一些属性:

  • color:颜色,十六进制整数,如果设定了color属性,整个材质将全部使用这种颜色。
  • map:映射,可以指向Three.Texture的实例对象。实际上,纹理就是一种映射,从一个[0,1][0,1]范围的二维坐标到颜色值的映射,过程就是从纹理图片的响应位置上取颜色。当然也有不依赖于图片的纹理,比如一些简单的三角函数的组合,将而为坐标转化为颜色,也能够成为纹理。这种纹理可以在表面上绘制复杂的图案。
  • lightMap,envMap,specularMap:字面的意思是光照映射,光谱映射等,可能用来服务于Three中的某些类型的着色器。
  • wireframe:如果设定为true,那么整个几何形状就显示为网格状的(即只显示边,不显示面)。
  • wireframeLinecap,wireframeLinewidth,wireframeLinejoin:采用wireframe模式时,控制网格的线段端点,线段宽度,线段交点等。
  • fog:显示材质的颜色是否会被全局的fog设定影响。
  • vertexColors:数组,每个元素都是一个Three.Color变量。如果设定了这个变量,那么这个数组的前3个或4个元素(视面的类型),就是面的端点的颜色。而在默认的片元着色器中,面上的颜色是由端点颜色内插而来的。
  • morphTarget:如果设置为true,那么就可以使用morphTarget模式(一种利用着色器来计算顶点位置的方法,可以高效地产生类似于windows98形变屏保模式的方法,在我的前面一片demo源码阅读笔记中有详细叙述)。
  • MeshBasicMaterial本身只有一个clone方法(该方法调用Material的clone方法),其他方法都是继承自Material方法。

Material::MeshLambertMaterial

MeshLambertMaterial是一种朗伯面材质。朗伯面就是各向反射同性面,任何角度的光线照射上去,反射的亮度和反射角度无关。以下摘录了除掉与MeshBasicMaterial重复的属性剩下的若干个属性。

THREE.MeshLambertMaterial = function ( parameters ) {
THREE.Material.call( this );
this.color = new THREE.Color( 0xffffff ); // diffuse
this.ambient = new THREE.Color( 0xffffff );
this.emissive = new THREE.Color( 0x000000 ); this.wrapAround = false;
this.wrapRGB = new THREE.Vector3( , , ); this.combine = THREE.MultiplyOperation;
this.reflectivity = ;
this.refractionRatio = 0.98;
... this.setValues( parameters );
};

除了MeshBasicMaterial中的color,vertexColors等属性,MeshLambertMaterial类还具有几个跟光照相关的属性:

  • color:主颜色,当然如果设置了采用映射或者为每个端点赋值颜色,就没有用了。
  • ambient:环境色,默认为白色,如果改变的话,会整体影响材质看上去的的颜色。
  • emissive:发射光的颜色,默认为黑色,即其中与MeshBasicMaterial原理类似的部分。默认情况下,如果没有光照,而且render的clearColor设置为黑色(考虑光照,这是通常的情况)的话,一个使用MeshLambertMaterial的物体时看不到的,但是如果这里改成其他颜色,应当就能看到。
  • combine:光照与颜色混合的方式,默认为乘法。
  • reflectivity:反射率,默认为1,即全部反射。
  • refractionRatio:折射率(即穿透物体一个单位长度后衰减的比率),可能用于透明物体。

Material::MeshPhongMaterial

MeshPhongMaterial,旁氏反射面,表示有光泽的物体,在极端情况下就是镜面。

THREE.MeshPhongMaterial = function ( parameters ) {

    THREE.Material.call( this );

    this.color = new THREE.Color( 0xffffff ); // diffuse
this.ambient = new THREE.Color( 0xffffff );
this.emissive = new THREE.Color( 0x000000 );
this.specular = new THREE.Color( 0x111111 );
this.shininess = ; this.metal = false;
this.perPixel = true; this.bumpMap = null;
this.bumpScale = ; this.normalMap = null;
this.normalScale = new THREE.Vector2( , ); ...this.setValues( parameters );
};

暂时还没大弄明白。

Material::MeshFaceMaterial

允许为某个geometry的每个面单独指定材质,通常用于从三维模型中读取数据,然后构造mesh。

THREE.MeshFaceMaterial = function ( materials ) {

    this.materials = materials instanceof Array ? materials : [];

};

只需要传入一个数组作为参数,其materials数组的每一个元素都是某种MeshXXXXMaterial,然后再geometry中创建表面时,为face指定materialIndex即可。

Three.js源码阅读笔记-5的更多相关文章

  1. Underscore.js 源码学习笔记(下)

    上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...

  2. gogs 源码阅读笔记 001

    gogs 源码阅读笔记 001 gogs项目相当不错,本笔记实际是基于gogs fork版本 git-122a66f. gitea (gitea版本由来)[https://blog.gitea.io/ ...

  3. CI框架源码阅读笔记5 基准测试 BenchMark.php

    上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...

  4. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...

  5. CI框架源码阅读笔记3 全局函数Common.php

    从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...

  6. CI框架源码阅读笔记2 一切的入口 index.php

    上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中, ...

  7. 源码阅读笔记 - 1 MSVC2015中的std::sort

    大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...

  8. PHP源码阅读笔记一(explode和implode函数分析)

    PHP源码阅读笔记一一.explode和implode函数array explode ( string separator, string string [, int limit] )此函数返回由字符 ...

  9. AQS源码阅读笔记(一)

    AQS源码阅读笔记 先看下这个类张非常重要的一个静态内部类Node.如下: static final class Node { //表示当前节点以共享模式等待锁 static final Node S ...

随机推荐

  1. 【Android】Android开源项目分类汇总

    第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...

  2. paip.c++ 转换 java 解决方案

    paip.c++ 转换 java 解决方案 作者Attilax  艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/a ...

  3. ServiceStack 概念

    目录 ServiceStack 概念 ServiceStack Web Service 创建与调用简单示列 ServiceStack ServiceStack是.Net和Mono的开源框架,相对WCF ...

  4. hdu 1864 01背包 最大报销额

    http://acm.hdu.edu.cn/showproblem.php?pid=1864 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  5. javascript设计模式与开发实践阅读笔记(4)——单例模式

    定义 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 具体来说,就是保证有些对象有且只有一个,比如线程池.全局缓存.浏览器中的window 对象等.在js中单例模式用途很广,比如登录 ...

  6. Linux内核--异常和中断的区别

          相信大家都知道非常著名的两个名词:异常和中断,不过,你真的理解这两个名词在说什么吗?它们之间有什么区别呢?       1.中断       大家都知道,当我们在敲击键盘的同时就会产生中断 ...

  7. Java性能提示(全)

    http://www.onjava.com/pub/a/onjava/2001/05/30/optimization.htmlComparing the performance of LinkedLi ...

  8. wireshark如何过滤 http数据包

    http.host==magentonotes.com http.host contains magentonotes.com //过滤经过指定域名的http数据包,这里的host值不一定是请求中的域 ...

  9. solr课程学习系列-solr的概念与结构(1)

    Solr是基于Lucene的采用Java5开发的一个高性能全文搜索服务器.源于lucene,却更比Lucene更为丰富更为强大的查询语言.同时实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个 ...

  10. 未能加载文件或程序集“System.Data.SQLite.DLL”或它的某一个依赖项

    今天在部署code到测试环境的时候 出现了未能加载文件或程序集"System.Data.SQLite.DLL"或它的某一个依赖项 这个错误,其实错误的的原因有很多,1.典型的是是版 ...