我们前面提到了材质与光源的关系,漫反射离不开光源。光源分如下几种:
点光源-PointLight
顾名思义,就是一个点射出来的光线。
点光源的特征是:凡是光照不到的地方都是黑暗的。因此,我们还需要设定点光源的位置。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.js"></script>
<title>Document</title>
</head>
<body>
<div id="webgl"></div>
</body>
</html>
<script>
var scene = new THREE.Scene();
console.log(scene);
//几何体
var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry
//材质
var material = new THREE.MeshLambertMaterial({
color: 0xffff00
});
//合成对象
var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
scene.add(mesh); //网格模型添加到场景中
var point = new THREE.PointLight(0xffffff);
point.position.set(0, 0, 300); //点光源位置
scene.add(point); //点光源添加到场景中
//创建相机对象
var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(100, 100, 200); //设置相机位置
camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
/**
* 创建渲染器函数
*/
var renderer = new THREE.WebGLRenderer();//画布
renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
//将渲染好的canvas追加到dom
var cont = document.getElementById('webgl');
cont.appendChild(renderer.domElement);
render();
function render() {
renderer.render(scene, camera);//渲染必须有场景和相机两个对象
mesh.rotateX(0.01);
requestAnimationFrame(render);//递归调用
}
</script>
777.gif
环境光-AmbientLight
环境光跟点光源相对,物体的各个面都可以照到。既然四面八方都可以照到,那也没必要设定其位置了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.js"></script>
<title>Document</title>
</head>
<body>
<div id="webgl"></div>
</body>
</html>
<script>
var scene = new THREE.Scene();
console.log(scene);
//几何体
var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry
//材质
var material = new THREE.MeshLambertMaterial({
color: 0xffff00
});
//合成对象
var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
scene.add(mesh); //网格模型添加到场景中
var ambient = new THREE.AmbientLight(0xffffff);//环境光
scene.add(ambient); //环境光添加到场景中
//创建相机对象
var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(100, 100, 200); //设置相机位置
camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
/**
* 创建渲染器函数
*/
var renderer = new THREE.WebGLRenderer();//画布
renderer.setSize(1000, 500);//设置渲染区域尺寸
renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
//将渲染好的canvas追加到dom
var cont = document.getElementById('webgl');
cont.appendChild(renderer.domElement);
render();
function render() {
renderer.render(scene, camera);//渲染必须有场景和相机两个对象
mesh.rotateX(0.01);
requestAnimationFrame(render);//递归调用
}
</script>
88.gif
还有两种不太常用的光源,分别是平行光(DirectionalLight)和聚光源(SpotLight),这里就不赘述了,有兴趣的同学可以查文档。
网友评论