## 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）。
• isIntersectionPlane:function( plane )：判断射线是否与一个平面有交点，传入的参数plane需要有normal属性。
• recast(t)：将Three.Ray.__v1（这个变量）设置为调用者的at(t)位置。（Three.Ray.__v1和Three.Ray.__v2是定义在Three.Ray而不是其peototype上的临时变量，类似于C++中的静态变量）。

## Material::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.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 );
};```

• 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

```THREE.MeshFaceMaterial = function ( materials ) {

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

};```

## 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. 文件上传小技巧/后端处理【以php示例】

引语:在上一篇文章中说到,在页面中可以用隐藏的方式让你的上传页面看起来漂亮.但是这对于性能来说,并没有什么卵用,那么在后台的处理中,难道就没有一些处理技巧么?所谓后台的技巧,应该要包括上传得快一点,上 ...

2. Oracle操作语言分类

Oracle数据库语言总的来说分为三类:DDL,DML,DCL 1.DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据. DML包括: SELECT:用 ...

3. Leetcode 66 Plus One STL

题意让大数加1 我的做法是先让个位+1,再倒置digits,然后进位,最后倒置digits,得到答案. class Solution { public: vector<int> plusO ...

4. Android 开发：view的几种布局方式及实践

View的几种布局显示方法,以后就不会在针对布局方面做过多的介绍.View的布局显示方式有下面几种:线性布局(Linear Layout).相对布局(Relative Layout).表格布局(Tab ...

5. TableView didSelectRowAtIndexPath 不执行

1.父类事件设置代理 UIGestureRecognizer *tapGesture  ... tapGesture.delegate = self; 2.覆盖方法 - (BOOL)gestureRe ...

6. C#：WebBrowser控件设置代理IP访问网站【附源码】

7. linux进阶

常用命令 rpm -q centos-release 查看centos版本 whereis java 查看文件安装路径 which java 查看可执行文件路径 echo \$PATH echo \$JA ...

8. ASP.NET Web API模型验证以及异常处理方式

ASP.NET Web API的模型验证与ASP.NET MVC一样,都使用System.ComponentModel.DataAnnotations. 具体来说,比如有:[Required(Erro ...

以前测试和使用过 3.X 因为够用,所以一直没升级,今天闲来无聊测试了一下最新版.和3.X比性能上好了很多,但不支持了移动设备的多文件上传. 关于3.X版 可以看这里:http://www.cnblo ...

10. mysql中You can’t specify target table for update in FROM clause错误解决方法

mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表( ...