如何使用Three.js实现阴影效果的示例代码
众所周知,作为webgl的插件,three.js肯定没有原生webgl加个阴影那么费力。于是,经过一个小时的研究(笨人不聪明,已经是极限速度了)。最后做了阴影效果,发现了一些错误。话不多说,我们来看看详细介绍。
首先是效果图:
要达到这个效果其实很简单。您只需要设置几个属性就可以达到当前的效果。而上述材料问题我将放在下一节:
(1)首先你需要告诉渲染器我需要一个阴影,你为我生成一个阴影:
renderer . shadow map . enabled = true;
(2)然后告诉光我需要阴影:
light.castShadow = true
(3)告诉模型哪些需要投射阴影:
//告诉球投个影。
sphere.castShadow = true
//告诉立方体投射阴影。
cube.castShadow = true
(4)最后,告诉底部平面矩形你要接受阴影:
plane.receiveShadow = true
只要设置好以上四个步骤,就可以实现阴影效果。
注意:你的模型的材质必须是对光照有反应的材质,否则无效,因为这个问题已经很久没有造成整个阴影了。
案例完整代码:
& lt!DOCTYPE html & gt
& lthtml lang = " en " & gt
& lthead & gt
& ltmeta charset="UTF-8 " >
& lttitle & gtTitle & lt/title & gt;
& ltstyle type="text/css " >
html,正文{
边距:0;
身高:100%;
}
画布{
显示:块;
}
& lt/style & gt;
& lt/head & gt;
& ltbody onload = " draw();"& gt
& lt/body & gt;
& ltscript src = " build/three . js " & gt;& lt/script & gt;
& ltscript src = " examples/js/controls/trackball controls . js " & gt;& lt/script & gt;
& ltscript src = " examples/js/libs/stats . min . js " & gt;& lt/script & gt;
& lt脚本& gt
var渲染器;
函数initRender() {
渲染器=新三。WebGLRenderer({ antialias:true });
renderer . setsize(window . inner width,window . inner height);
//告诉渲染器需要一个阴影效果。
renderer . shadow map . enabled = true;
renderer.shadowMap.type = THREE。PCFSoftShadowMap//默认情况下,此处清除三个。未设置PCFShadowMap。
document . body . appendchild(renderer . DOM element);
}
var相机;
函数initCamera() {
相机=新三。透视相机(45,window.innerWidth/window.innerHeight, 0.1,1000);
camera.position.set(0,40,100);
camera.lookAt(新三。向量3(0,0,0));
}
var场景;
函数initScene() {
场景=新三。场景();
}
var光;
函数initLight() {
scene.add(新三。AmbientLight(0x444444))。
光=新三。聚光灯(0x ffffff);
light.position.set(60,30,0);
//告诉平行光打开阴影投射。
light.castShadow = true
scene.add(灯光);
}
函数initModel() {
//上面的球
var球面几何=新三。球面几何(5,20,20);
var sphereMaterial =新三。mesh standard material({ color:0x 7777 ff });
var球面=新三。网格(球形测量,球形材料);
sphere . position . y = 5;
//告诉球投出阴影。
sphere.castShadow = true
scene.add(球体);
//辅助工具
var helper =新三。axis helper(10);
scene . add(helper);
//立方体
var cubeGeometry = new THREE。立方体几何(10,10,8);
var cubeMaterial = new THREE。MeshLambertMaterial({ color:0x 00ffff });
var cube =新三。网格(立方体几何,立方体材料);
cube . position . x = 25;
cube . position . y = 5;
cube . position . z =-5;
//告诉立方体投射阴影。
cube.castShadow = true
scene.add(立方体);
//底部平面
var planeGeometry = new THREE。平面几何(100,100);
var planeMaterial = new THREE。mesh standard material({ color:0x aaaaaa });
var平面=新三。网格(平面几何,平面材料);
plane.rotation.x = - 0.5 * Math。PI;
plane . position . y =-0;
//告诉底层平面它需要接收阴影。
plane.receiveShadow = true
scene.add(平面);
}
//初始化性能插件
var统计;
函数initStats() {
Stats = new Stats();
document . body . appendchild(stats . DOM);
}
//用户交互插件:按住鼠标左键旋转,按住鼠标右键平移,滚轮缩放。
风险值控制。
函数initControls() {
控制=新的三个。轨迹球控制(摄像机);
//旋转速度
controls . rotatespeed = 5;
//缩放速度
controls . zoom speed = 3;
//翻译速度
controls.panSpeed = 0.8
//不缩放?
controls.noZoom = false
//不泛?
controls.noPan = false
//是否开启移动惯性?
controls.staticMoving = false
//动态阻尼系数就是灵敏度。
controls . dynamicdampingfactor = 0.3;
//未知,需要的时候留着。
//controls.keys = [ 65,83,68];
controls . addevent listener(' change ',render);
}
函数render() {
renderer.render(场景、相机);
}
//窗口变化触发的函数
函数onWindowResize() {
camera . aspect = window . inner width/window . inner height;
camera . updateprojectionmatrix();
controls . handle resize();
render();
renderer . setsize(window . inner width,window . inner height);
}
函数animate() {
//更新控制器
render();
//更新性能插件
stats . update();
controls . update();
requestAnimationFrame(animate);
}
函数draw() {
init render();
init scene();
init camera();
init light();
init model();
init controls();
init stats();
animate();
window . on resize = onWindowResize;
}
& lt/script & gt;
& lt/html & gt;
摘要