这几天在看李鹏程翻译的[美]Jos Dirksen的《Three.js开发指南》,看到第八章了,现在来总结一下threejs中材料的相关知识。顺带也看完了上海交大的张雯莉出的《threejs入门指南》,我所学所写都是基于书和threejs官网的一些例子。

这两本书的电子版:链接: http://pan.baidu.com/s/1hrTqJGg 密码: e8ay


Threejs r85版的材质解析:

相比之前的版本代码,新版本有所改动,各位同学看书的时候,最好对照着Github上面最新的代码。

LineBasicMaterial:可以用于THREE.Line几何体,从而创建着色的直线。

LineDashedMaterial:类似line基础材质,但可以创建虚线效果。

MeshBasicMaterial(网格基础材质):为几何体赋予一种简单的颜色,或者显示几何体的线框 。忽略光线的作用,是什么颜色,就直接显示什么颜色,但也由于这种材质忽略了光照的作用,那么它也不会有任何阴影的效果。

MeshDepthMaterial(网格深度材质):根据网格到相机的距离,该材质决定如何给网格染色 ,根据物体上每一点到摄像机的远近来显示颜色,远的显示黑色,近的显示白色。

MeshNormalMaterial(网格法向材质):根据物体表面的法向量计算颜色 ,决定光的发射方向、在计算光照、阴影时提供信息、为物体表面上色。法向量所指的方向决定每个面从MeshNormalMaterial材质获取的颜色。在平面上添加表示法向量的箭头:使用THREE.ArrowHelper。

MeshLambertMaterial(网格朗伯材质):考虑光照的影响,可以创建颜色暗淡,不光亮的物体 。ambient:对环境光的反射能力 ,和AmbientLight光源一起使用。该颜色会与AmbientLight光源的颜色相乘。默认是白色。 emissive:该材质发射的属性。材质的自发光颜色,可以用来表现光源的颜色 。不像是光源,只是一种纯粹的、不受其他光照影响的颜色。默认是黑色。Lambert 材质(MeshLambertMaterial)是符合 Lambert 光照模型的材质。 Lambert 光照模型的主要特点是只考虑漫反射而不考虑镜面反射的效果,因而对于金属、镜子等需要镜面反射效果的物体就不适应,对于其他大部分物体的漫反射效果都是适用的。
Idiffuse = Kd * Id * cos(theta) ,Idiffuse 是漫反射光强, Kd 是物体表面的漫反射属性, Id 是光强, theta 是光的入射角弧度。

MeshPhongMaterial(网格phong式材质=镜面反射材质):考虑光照的影响,可以创建光亮的物体 。对于金属、镜面的表现尤为适合。 specular:指定该材质的光亮程度及其高光部分的颜色。如果将他设置成跟color属性相同的颜色,将会得到一种更加类似金属的材质。如果设置为灰色,材质将变得更像塑料。 
Ispecular = Ks * Is * (cos(alpha)) ^ n ,Ispecular 是镜面反射的光强, Ks 是材质表面镜面反射系数, Is 是光源强度,alpha 是反射光与视线的夹角, n 是高光指数,越大则高光光斑越小。 shininess 属性控制光照模型中的 n 值。

MeshFaceMaterial(网格面材质):这是一种容器,可以在该容器中为物体的各个表面上设置不同的颜色 。

ShaderMaterial(着色器材质):使用自定义的着色器程序,直接控制顶点的放置方式,以及像素的着色方式。个人觉得这个比较复杂,但是应用应该比其他几种都要广泛一点,需要一些webGL的基础。

SpriteMaterial: 粒子材质,适用于粒子系统,用来模拟雪花小雨什么的。


3Dmax的几种material
blinn有局部高光,lambert没有。因此,blinn适合做一些有反光的物体,例如玻璃,反光金属等等,lambert做一些不能反光的物体,例如木头、纸,桌子这类不存在高光的物体。 multi-layer(双非圆型高光):组合了两个 Anisotropic(非圆型高光),每一个反光都可以拥有不同的颜色和角度,适用于表现抛光的表面特殊效果,例如缎纹、丝绸和光芒四射的油漆等(其中roughness为粗糙度,值为0时,与使用Blinn效果一样)。 oren-nayer-Blinn它是Blinn的变种,看起来更柔和,更适合做一些较为粗糙的效果。例如织物和陶器等通常也可以用于模拟布、土坯和人的皮肤等效果。 phong (平滑):这种类型常用于表现玻璃制品、塑料等非常光滑的表面,它所呈现的反光是柔和的,这一点区别于 blinn(圆形高光)。 strauss (金属):也用于金属材质,它是metal的简化版,参数较少。但比金属材质做出的金属质感要好,制作的材质比较逼真。但不能调整自发光。 translicent shader(半透明):专用于表现半透明的物体表面,例如蜡烛、玉饰品、彩绘玻璃等。这是3D MAX5.0新增的类型。参数中:Translucent Color:指定透明色,即穿透物体的散射光颜色。FilterColor设置穿透一个半透明物体的光的颜色。Opacity可以设置浓度的百分比。


补充:R69以后,粒子系统中的ParticleBasicMaterial 重命名为PointCloudMaterial,ParticleSystem重命名为PointCloud,貌似删掉了Particle这个组件,粒子系统里面只用Sprite。

再补充一点最近看到的有用的资料和网站,供学习之用。

threejs api doc中文翻译:http://techbrood.com/threejs/docs/,个人觉得可以当做参考手册查阅,总比去看英文api方便一些。

webGL中文网的翻译教程:http://www.hewebgl.com/article/articledir/1,看完了初级教程,我就来看书了。

webGL基础教程:http://www.hiwebgl.com/?p=42,看一点threejs,再看这个教程,就觉得世界都清晰了。或者:http://webgl-lesson.wysaid.org/

如果自己想编辑shader,就得学习GLSL语言:http://blog.csdn.net/racehorse/article/details/6593719。这个大牛的教程很全很厉害。

看完粒子系统可以试着写个太阳系:https://zhuanlan.zhihu.com/p/20796329

几个ThreeJS应用的网站,看看例子:

http://voxeljs.com/

https://3dwarehouse.sketchup.com/index.html

http://techbrood.com/?q=WebGL

ThreeJS的SVG库:d3-ThreeD库还有几个开源的svg库:D3.js(https://d3js.org/http://d3.decembercafe.org/index.html)和Raphael.js

如果想了解webVR,可以点一下以下教程:

cardBoard:http://blog.csdn.net/tencent_bugly/article/details/52414003

下面是几个相关的网页:

官方API:https://developer.mozilla.org/en-US/docs/Web/API/WebVR_API

https://sketchfab.com/

https://vizor.io/

http://vr.chromeexperiments.com/

https://www.beloola.com/sfgiants

https://www.gomo.se/

http://alteredqualia.com/

https://github.com/D1plo1d

http://www.floorplanner.com/pro

http://exocortex.com/

几个shader网站:

http://glslsandbox.com/

http://www.cambridgeincolour.com/tutorials/gamma-correction.htm

http://www.geeks3d.com/

再就是数据可视化的库:我调研了好几个3D部分做的好的就是echarts和amcharts(free部分),highcharts二维数据可视化做的很炫酷。

webGL之three.js入门3--材料篇的更多相关文章

  1. webGL之three.js入门4--ThreeJS Editor入门篇

    因为工作需要,要看threejs editor的源码,顺便记录过程. github下载的源码目录是这样的 但是editor和其他文件夹内的内容的关联的,我需要将其独立出来并且编辑editor. 进入e ...

  2. webGL之three.js入门2

    入门建议: webGL中文翻译教程,基于NeHe的openGL教程:http://www.hiwebgl.com/?p=42 . WebGL中文网 http://www.hewebgl.com/ ,里 ...

  3. webGL之three.js入门1

    开场白 最近开始学前端,看了极客学院的前端教学视频,其实有C++或者java基础的人学前端还是很快的.但是html的标签和CSS的样式还是得多code才能熟练,熟能生巧,学以致用. 还在看js,因为有 ...

  4. Three.js入门篇(一)创建一个场景

    上一面讲述了向场景中添加物体对象.这一篇准备把每个功能点细细的讲述一遍,一方面是为了加深自己的理解.另一方面希望能够 帮助到有需要的人. 一.在学习WEBGL的时候,你应该先了解要创建一个WebGL程 ...

  5. 1. web前端开发分享-css,js入门篇

    关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...

  6. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

  7. web前端开发分享-css,js入门篇(转)

    转自:http://www.cnblogs.com/jikey/p/3600308.html 关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人 ...

  8. arcgis api 3.x for js 入门开发系列批量叠加 zip 压缩 SHP 图层优化篇(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  9. web前端开发分享-css,js入门篇

    学习没有捷径,但学习是有技巧与方法.   一,css入门篇:   推荐书籍:css哪些事儿,精通css. 理由:css那些事儿,他是一本介绍css基础类的书,是入门的经典读物. 系统的介绍了css的选 ...

随机推荐

  1. 【转】如何在win10(64位系统)上安装apache服务器

    如何在win10(64位系统)上安装apache服务器 今天装了Apache服务器,下面是我总结的方法: 一,准备软件 1.64位的apache版本 传送门:http://www.apacheloun ...

  2. Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/\${ <-- HERE ([^ \t=:+{}]+)}/ at xxxx/usr/bin/automake line 3939.

    /********************************************************************** * Unescaped left brace in re ...

  3. 田螺便利店—ipconfig命令不是内部命令或外部命令怎么解决?

    查询网卡ID在运行后输入ipconfig/all点回车后提示ipconfig不是内部或外部命令,也不是可运行的程序或批处理文件? 首先确认你的输入是无误的,确保输入无误,仍提示 ipconfig 不是 ...

  4. 关于js的面相对象

    http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html

  5. java-类与类,类与接口,接口与接口的关系

    1.类与类: - 继承关系,只能单继承,可以多层继承. 2.类与接口: - 实现关系,可以单实现,也可以多实现. - 并且还可以在继承一个类的同时实现多个接口. - * 例:class Demo ex ...

  6. CentOS安装备忘2

    CentOS7安装备忘2 安装过程中不联网,安装完成也不要立刻联网,先关闭远程的服务后再联网更新.安装默认使用English,目的是生成的Home下所有文件夹都是英文的,方便使用. ========= ...

  7. 05 面向对象:构造方法&static&继承&方法 &final

    构造方法及其重载: /* 构造方法格式特点 * a:方法名与类名相同(大小也要与类名一致) * b:没有返回值类型,连void都没有 * c:没有具体的返回值return; * 构造方法的重载 * 重 ...

  8. (16)JavaScript的流程控制(js的循环)

    流程控制有3种结构 1.顺序结构:代码执行的本质就是顺序结构 2.分支结构:if家族 语法规则: if (条件1) { //代码块1}else if (条件2){ //代码块1}//如果所有条件都不满 ...

  9. 【shell编程】之基础知识-流程控制

    和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); ...

  10. 【spring源码分析】spring和@PostConstruct注解

    @PostConstruct注解好多人以为是Spring提供的.其实是Java自己的注解. Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法.被@Pos ...