材质(Material)
材质(Material)独立于物体顶点信息之外,与渲染效果相关的属性。
设置材质(Material)可以改变物体的颜色、纹理贴图、光照模式等。
基本材质(BasicMaterial)
物体的颜色始终为该材质的颜色,不会由于光照产生明暗、阴影效果。
js
THREE.MeshBasicMaterial(opt);没有设置颜色就是随机颜色
常见属性
- visible:是否可见,默认为 true
- side:渲染面片正面或是反面,默认为正面 THREE.FrontSide,可设置为反面 THREE.BackSide,或双面 THREE.DoubleSide
- wireframe:是否渲染线而非面,默认为 false
- color:十六进制 RGB 颜色,如红色表示为 0xff0000
- map:使用纹理贴图
示例
js
const material = new THREE.MeshBasicMaterial({
color: 0xffff00,
opacity: 0.75,
});
const cube = new THREE.Mesh(new THREE.BoxGeometry(3, 3, 3), material);
scene.add(cube);Lambert 材质(MeshLambertMaterial)
符合 Lambert 光照模型的材质
Lambert 光照模型的主要特点是只考虑漫反射而不考虑镜面反射的效果
不适应 金属、镜子等需要镜面反射效果的物体
光照模型公式为:
Idiffuse = Kd * Id * cos(theta)Idiffuse 是漫反射光强,Kd 是物体表面的漫反射属性,Id 是光强,theta 是光的入射角弧度
需要 PointLight 光源,并且强度还有要求
js
const light = new THREE.PointLight(0xffffff, 50, 100);
light.position.set(5, 10, 15);
scene.add(light);核心代码
js
// 创建渲染器
const renderer = new THREE.WebGLRenderer({
canvas: dom.value,
});
renderer.setClearColor(0x000000);
// 创建场景
const scene = new THREE.Scene();
// 创建相机
const 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);
const light = new THREE.PointLight(0xffffff, 1, 0, 0);
light.position.set(5, 10, 15);
scene.add(light);
const material = new THREE.MeshLambertMaterial({
color: 0xffff00,
});
const cube = new THREE.Mesh(new THREE.BoxGeometry(3, 3, 3), material);
scene.add(cube);
// 渲染
renderer.render(scene, camera);Phong 材质(MeshPhongMaterial
符合 Phong 光照模型的材质
和 Lambert 不同的是,Phong 模型考虑了镜面反射的效果,因此对于金属、镜面的表现尤为适合。
光照模型公式为:
Ispecular = Ks * Is * cos(theta)^nIspecular 是镜面反射的光强,Ks 是材质表面镜面反射系数,Is 是光源强度,alpha 是反射光与视线的夹角,n 是高光指数,越大则高光光斑越小。
js
const material = new THREE.MeshPhongMaterial({
color: 0xff0000,
specular: 0xffff00,
// shininess 越大,光斑越小
shininess: 100,
});核心代码
js
// 创建渲染器
const renderer = new THREE.WebGLRenderer({
canvas: dom.value,
});
renderer.setSize(400, 300);
renderer.setClearColor(0xffffff);
// 创建场景
const scene = new THREE.Scene();
// 创建相机
const 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);
// 光源!
const light = new THREE.PointLight(0xffffff, 1, 0, 0);
light.position.set(10, 15, 25);
scene.add(light);
const material = new THREE.MeshPhongMaterial({
color: 0xff0000,
specular: 0xffff00,
shininess: 100,
});
const sphere = new THREE.Mesh(new THREE.SphereGeometry(3, 20, 8), material);
scene.add(sphere);
// 渲染
renderer.render(scene, camera);法向材质
常用于调试
没有参数,不要光源
js
new THREE.MeshNormalMaterial();js
camera.position.set(25, 25, 25);材质纹理贴图
可以设置图片、视频、3D 模型等
todo