背景
材质是很重要的一课,网上的帖子写的都很差。我按我自己学习的方法写一次。
说明
材质就是物体的质感和触感,如不锈钢和布料的材质,质感和触感就是不一样的。在3D中,材质被赋到模型上。
材质的体验和光照关系比较大,光滑的表面,光照下特别明亮耀眼,如玻璃表面。粗糙的表面会显得暗淡,如地面。这些都是受光照的影响。
babylonjs材质的分类
按照材质对光线的反射的情况,可以将材质分为如下几类:
- 漫反射材质(Diffuse)—— 在光线下观察的材料的基本颜色或质地;
- 镜面材质,也叫高光(Specular)—— 光线给材质的亮点;
- 发光材质(Emissive)—— 发光材料的颜色或质地,如自发光;
- 环境材质(Ambient)—— 由环境背景光照明的材料的颜色或质地。
漫反射和镜面材料需要光源,如果没有光源,就不会发生反射,没有反射,就没有光进入人眼,所以对人来说,看不出什么区别。
环境颜色需要设置场景的环境颜色,提供环境背景照明。场景有一个环境光颜色属性(ambientColor),下面的代码给环境光赋值为白色。
正文
自发光材质(Emissive)
定义四种材质,
var redMat = new BABYLON.StandardMaterial("redMat", scene);
redMat.emissiveColor = new BABYLON.Color3(1, 0, 0);
var greenMat = new BABYLON.StandardMaterial("greenMat", scene);
greenMat.emissiveColor = new BABYLON.Color3(0, 1, 0);
var blueMat = new BABYLON.StandardMaterial("blueMat", scene);
blueMat.emissiveColor = new BABYLON.Color3(0, 0, 1);
var whiteMat = new BABYLON.StandardMaterial("whiteMat", scene);
whiteMat.emissiveColor = new BABYLON.Color3(1, 1, 1);
var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", {diameter: 0.25}, scene);
sphere.material = greenMat;
直接赋值就行,material = 某种材质。
漫反射材质
某个颜色的漫反射材质,只能在漫散射光下有颜色。
redMat.diffuseColor = new BABYLON.Color3(1, 0, 0);
var light = new BABYLON.PointLight("light2", new BABYLON.Vector3(0, 10, 0), scene);
light.diffuse = new BABYLON.Color3(1, 0, 0);
var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", { diameter: 0.25 }, scene);
sphere.material = redMat;
镜面材质
某个颜色的镜面反射材质,只能在镜面散射光下有颜色
// 3333333
// var redMat = new BABYLON.StandardMaterial("redMat", scene);
// redMat.specularColor = new BABYLON.Color3(1, 0, 0);
// var light = new BABYLON.PointLight("light2", new BABYLON.Vector3(0, 10, 0), scene);
// light.specular = new BABYLON.Color3(1, 0, 0);
// var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", { diameter: 0.25 }, scene);
// sphere.material = redMat;
环境材质
这个更容易理解,由环境光而定。
var redMat = new BABYLON.StandardMaterial("redMat", scene);
redMat.ambientColor = new BABYLON.Color3(1, 0, 0);
scene.ambientColor = new BABYLON.Color3(1, 0, 0);
var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", { diameter: 0.25 }, scene);
sphere.material = redMat;
正文2-纹理
下一节再讲