THREE.MeshLambertMaterial(opt)其中,opt可以缺省,或者为包含各属性的值。如新建一个不透明度为0.75的黄色材质:
new THREE.MeshBasicMaterial({ color: 0xffff00, opacity: 0.75});将其应用于一个正方体(方法参见《Three.js学习之几何形状》,效果为:
源码:
<!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();// camera var 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);// light var 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的几个较为常用的属性:
Idiffuse = Kd * Id * cos(theta)其中,Idiffuse是漫反射光强,Kd是物体表面的漫反射属性,Id是光强,theta是光的入射角弧度。
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();// camera var 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);// light var 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材质
Ispecular = Ks * Is * (cos(alpha)) ^ n
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材质的特有属性:
<!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();// camera var 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);// light var 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>总结