材质(Material)是独立于物体顶点信息之外的与渲染效果相关的属性。通过设置材质可以改变物体的颜色、纹理贴图、光照模式等。

  本篇将介绍基本材质以及两种基于光照模型的材质(Lamber与Phong)。

  MeshBasicMaterial:对光照无感,给几何体一种简单的颜色或显示线框。

  MeshLambertMaterial:这种材质对光照有反应,用于创建暗淡的不发光的物体。

  MeshPhongMaterial:这种材质对光照也有反应,用于创建金属类明亮的物体。

1.基本材质

  使用基本材质(BasicMaterial)的物体,渲染后物体的颜色始终为该材质的颜色,而不会由于光照产生明暗、阴影效果。如果没有指定材质的颜色,则颜色是随机的。其构造函数是:

THREE.MeshLambertMaterial(opt)

  其中,opt可以缺省,或者为包含各属性的值。如新建一个不透明度为0.75的黄色材质:

new THREE.MeshBasicMaterial({color: 0xffff00,opacity: 0.75});

  将其应用于一个正方体(方法参见3.js-4,效果为:

源码:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>3.js测试7.1</title></head><body onload="init()"><canvas id="mainCanvas" width="400px" height="300px" ></canvas></body><script type="text/javascript" src="js/three.min.js"></script><script type="text/javascript">function init() {var renderer = new THREE.WebGLRenderer({canvas: document.getElementById('mainCanvas')});renderer.setClearColor(0x000000);var scene = new THREE.Scene();// cameravar camera = new THREE.OrthographicCamera(-5, 5, 3.75, -3.75, 0.1, 100);camera.position.set(25, 25, 25);camera.lookAt(new THREE.Vector3(0, 0, 0));scene.add(camera);// lightvar light = new THREE.PointLight(0xffffff, 1, 100);light.position.set(10, 15, 5);scene.add(light);var material = new THREE.MeshBasicMaterial({color: 0xffff00,opacity: 0.75});var cube = new THREE.Mesh(new THREE.CubeGeometry(5, 5, 5), material);scene.add(cube);renderer.render(scene, camera);}</script>
</html>

  BasicMaterial的几个较为常用的属性:

  · visible:是否可见,默认为true

  · side:渲染面片正面或是反面,默认为正面THREE.FrontSide,可设置为反面THREE.BackSide,或双面THREE.DoubleSide

  · wireframe:是否渲染线而非面,默认为false

  · color:十六进制RGB颜色,如红色表示为0xff0000

  · map:使用纹理贴图

  对于基本材质,即使改变场景中的光源,使用该材质的物体也始终为颜色处处相同的效果。当然,这不是很具有真实感,因此,接下来我们将介绍更为真实的光照模型:Lambert光照模型以及Phong光照模型。

2.Lamber材质与Phong材质 

  Lambert材质(MeshLambertMaterial)是符合Lambert光照模型的材质。Lambert光照模型的主要特点是只考虑漫反射而不考虑镜面反射的效果,因而对于金属、镜子等需要镜面反射效果的物体就不适应,对于其他大部分物体的漫反射效果都是适用的。

  其光照模型公式为:

Idiffuse = Kd * Id * cos(theta)

  其中,Idiffuse是漫反射光强,Kd是物体表面的漫反射属性,Id是光强,theta是光的入射角弧度。

  当然,对于使用Three.js的Lambert材质,不需要了解以上公式就可以直接使用。创建一个黄色的Lambert材质的方法为:

new THREE.MeshLambertMaterial({color: 0xffff00})

  在使用了光照之后,得到这样的效果:

  color是用来表现材质对散射光的反射能力,也是最常用来设置材质颜色的属性。除此之外,还可以用ambient和emissive控制材质的颜色。

  ambient表示对环境光的反射能力,只有当设置了AmbientLight后,该值才是有效的,材质对环境光的反射能力与环境光强相乘后得到材质实际表现的颜色。

  emissive是材质的自发光颜色,可以用来表现光源的颜色,并不是一种光源,而是一种不受光照影响的颜色。单独使用红色的自发光:

new THREE.MeshLambertMaterial({emissive: 0xff0000})

  效果为:

  如果同时使用红色的自发光与黄色的散射光:

new THREE.MeshLambertMaterial({color: 0xffff00,emissive: 0xff0000})

  效果为:

  球体的效果:

  总结Lamber材质的特有属性:

  ambient:设置材质的环境色,和AmbientLight光源一起使用,这个颜色会与环境光的颜色相乘。即是对光源作出反应。

  emissive:设置材质发射的颜色,不是一种光源,而是一种不受光照影响的颜色。默认为黑色。

  源码:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>3.js测试7.2</title></head><body onload="init()"><canvas id="mainCanvas" width="400px" height="300px" ></canvas></body><script type="text/javascript" src="js/three.min.js"></script> <script type="text/javascript">function init() {var renderer = new THREE.WebGLRenderer({canvas: document.getElementById('mainCanvas')});renderer.setClearColor(0x000000);var scene = new THREE.Scene();// cameravar camera = new THREE.OrthographicCamera(-5, 5, 3.75, -3.75, 0.1, 100);camera.position.set(25, 25, 25);camera.lookAt(new THREE.Vector3(0, 0, 0));scene.add(camera);// lightvar light = new THREE.PointLight(0xffffff, 1, 100);light.position.set(10, 15, 5);scene.add(light);var material = new THREE.MeshLambertMaterial({color: 0xffff00,emissive: 0xff0000});var cube = new THREE.Mesh(new THREE.CubeGeometry(5, 5, 5), material);scene.add(cube);//            var sphere = new THREE.Mesh(new THREE.SphereGeometry(3, 20, 8), material);
//            scene.add(sphere);
            renderer.render(scene, camera);}</script>
</html>

3.phong材质

  Phong材质(MeshPhongMaterial)是符合Phong光照模型的材质。和Lambert不同的是,Phong模型考虑了镜面反射的效果,因此对于金属、镜面的表现尤为适合。

  漫反射部分和Lambert光照模型是相同的,镜面反射部分的模型为:

Ispecular = Ks * Is * (cos(alpha)) ^ n

  其中,Ispecular是镜面反射的光强,Ks是材质表面镜面反射系数,Is是光源强度,alpha是反射光与视线的夹角,n是高光指数,越大则高光光斑越小。

  由于漫反射部分与Lambert模型是一致的,因此,如果不指定镜面反射系数,而只设定漫反射,其效果与Lambert是相同的:

new THREE.MeshPhongMaterial({color: 0xffff00});

  同样地,可以指定emissive和ambient值,这里不再说明。下面就specular值指定镜面反射系数作说明。首先,我们只使用镜面反射,将高光设为红色,应用于一个球体:

var material = new THREE.MeshPhongMaterial({specular: 0xff0000});var sphere = new THREE.Mesh(new THREE.SphereGeometry(3, 20, 8), material);

  效果为:

  可以通过shininess属性控制光照模型中的n值,当shininess值越大时,高光的光斑越小,默认值为30。我们将其设置为1000时:

new THREE.MeshPhongMaterial({specular: 0xff0000,shininess: 1000});

  效果为:

  使用黄色的镜面光,红色的散射光:

material = new THREE.MeshPhongMaterial({color: 0xff0000,specular: 0xffff00,shininess: 100});

  总结Phong材质的特有属性:

  ambient:设置材质的环境色,和AmbientLight光源一起使用,这个颜色会与环境光的颜色相乘。即是对光源作出反应。

  emissive:设置材质发射的颜色,不是一种光源,而是一种不受光照影响的颜色。默认为黑色

  specular:指定该材质的光亮程度及其高光部分的颜色,如果设置成和color属性相同的颜色,则会得到另一个更加类似金属的材质,如果设置成grey灰色,则看起来像塑料

  shininess:指定高光部分的亮度,默认值为30.

  源码:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>3.js测试7.3</title></head><body onload="init()"><canvas id="mainCanvas" width="400px" height="300px" ></canvas></body><script type="text/javascript" src="js/three.min.js"></script><script type="text/javascript">function init() {var renderer = new THREE.WebGLRenderer({canvas: document.getElementById('mainCanvas')});renderer.setClearColor(0x000000);var scene = new THREE.Scene();// cameravar camera = new THREE.OrthographicCamera(-5, 5, 3.75, -3.75, 0.1, 100);camera.position.set(25, 25, 25);camera.lookAt(new THREE.Vector3(0, 0, 0));scene.add(camera);// lightvar light = new THREE.PointLight(0xffffff, 1, 200);light.position.set(10, 15, 25);scene.add(light);var material = new THREE.MeshPhongMaterial({
//              specular: 0xff0000,
                color: 0xff0000,specular: 0xffff00,shininess: 100});//          var cube = new THREE.Mesh(new THREE.CubeGeometry(5, 5, 5), material);
//          scene.add(cube);var sphere = new THREE.Mesh(new THREE.SphereGeometry(3, 20, 8), material);scene.add(sphere);renderer.render(scene, camera);}</script>
</html>

  整理自张雯莉《Three.js入门指南》

  其他参考:THREE.JS中常用的3种材质

转载于:https://www.cnblogs.com/xulei1992/p/5737138.html

Three.js基础探寻七——Lamber材质与Phong材质相关推荐

  1. Three.js基础探寻二——正交投影照相机

    本篇主要介绍照相机中的正交投影照相机. 第一篇传送门:Three.js基础探寻一 1.照相机 图形学中的照相机定义了三维空间到二维屏幕的投影方式. 针对投影方式照相机分为正交投影照相机和透视投影照相机 ...

  2. threejs 绘制球体_Three.js基础探寻四——立方体、平面与球体

    前面简单介绍了 1.立方体 虽然这一形状的名字叫立方体(CubeGeometry),但它其实是长方体,也就是长宽高可以设置为不同的值.其构造函数是: THREE.CubeGeometry(width, ...

  3. JS 基础篇(七) 函数柯理化

    函数柯理化 定义 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成 接受一个单一参数(最初函数的第一个参数)的函数, 并且返回接受余下的参数且返回结果的新函数的技术 个人理解: ...

  4. js基础(七){事件的分类 绑定事件 函数中的this 字符串 函数的传参规则 严格模式}

    JS中的常用事件 什么叫做事件 所谓的事件,是浏览器监听用户行为的一种机制. 比如,当用户使用鼠标 "点击" 一个按钮,会触发该按钮的"点击"事件 如果此时我们 ...

  5. (七)JS基础知识四(搞定异步)【三座大山之三,必考!!!】

    JS基础知识四(异步) 提问 单线程 应用场景 callback hell和promise 提问 同步和异步的区别是什么 手写用Promise加载一张图片 前端使用的异步的场景有哪些 单线程 JS是单 ...

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

    1 /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成"webgl与three.js基础介绍"."面向对象的基础3D场景框架编写".&quo ...

  7. js笔记(一)js基础、程序结构、函数

    大标题 小节 一.js 基础 1. javascript的组成: 2. 运行js: 3. 打印信息: 4. 关键字var: 5. js中的数据类型: 6. NaN(not a number): 7. ...

  8. 前端工程师面试问题归纳(一、问答类html/css/js基础)

    一.参考资源 1.前端面试题及答案整理(一) 2.2017年前端面试题整理汇总100题 3.2018最新Web前端经典面试试题及答案 4.[javascript常见面试题]常见前端面试题及答案 5.W ...

  9. 前端学习——JS基础知识点复习

    一. JS复习 1.1 如何使用JS HTML标签内使用JS,要求写在onclick等事件属性或者href属性中(不推荐使用) 页面中的script标签内可以直接写JS代码 script标签的src属 ...

最新文章

  1. 欢迎参加“城市大脑与应急管理”专家研讨会
  2. 如何打开python的交互窗口-使用Python显示图形交互窗口
  3. python数据包的作用_使用Python将登录数据包发送到Minecraft服务器不起作用
  4. 把知识变成图谱一共需要花几步?89页全网最全清华知识图谱报告-学习笔记
  5. 负载均衡的几种方式_负载均衡的几种方式
  6. Linux中的同步机制
  7. 虚拟主机网络设备iotlb
  8. 商城系统学习总结(1)——订单与库存在高并发场景下案例解析
  9. Eclipse 常用快捷键(动画讲解)
  10. 编译openjdk时cygwin需要下载的内容
  11. java常见类型的转化以及风险
  12. 如何完卸载oracle12c,卸载Oracle12c方法
  13. java web 教学视频_超全面的JavaWeb视频教程
  14. 算法分析与设计——分治法实验报告
  15. 完成网络传真,网络扫描。
  16. xp系统远程计算机需要网络打印机驱动,xp系统如何设置网络打印机共享
  17. elementUI使用el-tabs时,页面崩溃卡死问题
  18. ssms远程服务器地址,SSMS如何远程到SQL SERVER?
  19. 如何做看到总服务器的文件,怎么看到服务器大内存文件夹
  20. win8.1服务器系统安装教程,win8.1安装iis图文教程

热门文章

  1. 在C#中使用WIA获取扫描仪数据(利用Filter处理图片)
  2. 在Java安装完毕之前,向导被中断
  3. ios微信组件跳转_IOS如何从微信中跳转APP
  4. AUTOSAR CanNm Nm Configuration
  5. 中国移动云MAS平台发送普通短信
  6. 使用JavaScript获取当前时间方法(AM、PM)
  7. android常用api大全,Android开发个人总结常用的api
  8. 月结重头戏--外币评估
  9. 手把手教你用SetWindowsHookEx做一个键盘记录器
  10. App上架时,华为应用市场提示:在测试环境:Wi-Fi联网、EMUI11.0 ( P40),软件存在闪退。如何模拟EMUI11.0 ( P40)