1. 程式人生 > >Three.JS 新增燈光、材質和陰影(第一個例子)

Three.JS 新增燈光、材質和陰影(第一個例子)

three.js中都多種燈光和材質,這裡只是添加了一種燈光,聚光燈spotLight。

首先構建一個spotLight物件:

var spotLight = new  THREE.SpotLight(0xFFFFFF);

指定光源的位置,從何處開始照射:

spotLight.position.set(-40,60,-10);

把光源變數加入到場景:

scene.add(spotLight);

材質:MeshBasicMaterial是基本的材質模型,它對光源產生任何反應。
MeshLambertMaterial 材質和MeshPhongMaterial材質會對光源產生反應。具體的區別不太瞭解。如果要物體對光照產生反應,把材質改為上述中的一種。

把第一個例子中的立方體的材質修改為 MeshLambertMaterial :

var  cubeMaterial = new THREE.MeshLambertMaterial({color:0xffffff});

陰影:Three.JS預設是不渲染出陰影的,這是比較耗費計算資源的。但是可以指定讓渲染的時候渲染出陰影。

確定讓渲染器渲染出陰影:

renderer.shadowMapEnabled = true

指出那個物體會接受物體投射出的陰影,就是說,物體投射出的陰影會顯示在哪個物體。例子中,指定平面會接受物體投射出的陰影,就是說其他物體投射出的陰影會出現在平面上,不會跑到其他地方。

指定平面接受物體投射出的陰影:

plane.receiveShadow = true

指定那個物體會投射陰影,指定哪個物體會投射陰影,不指定的物體就不會投射陰影。
指定立方體投射會投射陰影:

cube.castShadow = true

最後,指定由哪個光源照射物體來投射陰影,並不是所有的光源都可以產生陰影。物體有陰影,必須要有光源照射吧!

指定由前面建立的聚光燈spotLight來照射物體產生陰影:

spotLight.castShadow = true

程式碼如下:

<!DOCTYPE html>
<html lang="en">
<head> <meta charset="UTF-8"> <title>Three.js 第一章學習</title> <!--需要的基本JS庫--> <script src="jquery19.js"></script> <script src="three.js"></script> <script src ="stats.js"></script> <script src = "dat.gui.js"></script> <script src = "controlKit.js"></script> <!--給body加入一個樣式,邊框為0(零,不顯示邊框);滾動條隱藏--> <style type="text/css"> body{ margin: 0; overflow: hidden; } </style> </head> <body> <!--建立一個DIV,WebGL渲染的基本物體會在此處輸出--> <div id="WebGL-output"> </div> <!--定義一個JQuery函式,所有的WebGL操作展示將在該函式中進行--> <script type="text/javascript"> $(function () { <!--構建場景--> var scene = new THREE.Scene(); <!--建立相機,檢視場景,透視相機--> var camera = new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000); <!--構建渲染器,進行渲染--> var renderer = new THREE.WebGLRenderer(); <!--渲染背景色,不知道為什麼在此學習過程中,該函式setClearColorHex()老是提示錯誤?--> // renderer.setClearColorHex(0xEEEEEE); renderer.setClearColor(0xAAFFCC); <!--渲染尺寸--> renderer.setSize(window.innerWidth,window.innerHeight); <!--告訴渲染器需要渲染出陰影--> renderer.shadowMapEnabled = true; <!--新增一個輔助座標軸--> var axes = new THREE.AxisHelper(20); scene.add(axes); <!--構建一個平面,物體將會放置在這個平面上--> <!--平面尺寸,100x60,寬度方向平分幾分,高度方向平分幾分,如果引數最後2位不是(1,1),平面會顯示為網格平面--> var planeGeometry = new THREE.PlaneGeometry(100,60,10,10); <!--平面材質,僅僅指定顏色 0xcccccc--> // var planeMaterial = new THREE.MeshBasicMaterial({color:0xccaacc}); <!--臨時修改材質為MeshLambertMaterial--> var planeMaterial = new THREE.MeshLambertMaterial({color:0xFFFFFF}); <!--有尺寸和材質構建一個平面--> var plane = new THREE.Mesh(planeGeometry,planeMaterial); <!--把平面選擇-90°,方便觀察--> plane.rotation.x = -0.5*Math.PI; <!--指定平面的位置--> plane.position.x = 15; plane.position.y = 0; plane.position.z = 0; <!--指定平面接受陰影,就是物體投射出的陰影會出現在該平面上--> plane.receiveShadow = true; <!--把平面加入到場景中--> scene.add(plane); <!--建立物體,一個立方體,一個球體--> <!--建立一個立方體--> <!--指定立方體的幾何尺寸,長寬高,不包括位置--> var cubeGeometry = new THREE.CubeGeometry(4,4,4); <!--指定立方體的材質,僅僅指定顏色:0xFF0000,是否使用線框模式顯示:是--> // var cubeMaterial = new THREE.MeshBasicMaterial({color:0xFF0000,wireframe:true}); <!--臨時修改材質為MeshLambertMaterial--> var cubeMaterial = new THREE.MeshLambertMaterial({color:0xFF0000}); <!--以給定的幾何尺寸和材質構建一個立方體--> var cube = new THREE.Mesh(cubeGeometry,cubeMaterial); <!--指定立方體的具體位置xyz--> cube.position.x =-4; cube.position.y =3; cube.position.z = 0; <!--指出物體會投射陰影--> cube.castShadow = true; <!--把建立的立方體放入場景--> scene.add(cube); <!--建立一個球體sphere--> <!--指定球體的幾何尺寸,不包括位置;最後2個引數感覺是指定網格密度--> var sphereGeometry = new THREE.SphereGeometry(4,50,50); <!--指定球體材質,僅僅指定顏色:0xFF0000,是否以線框形式顯示:是--> // var sphereMaterial = new THREE.MeshBasicMaterial({color:0xff0000,wireframe:true}); <!--臨時修改材質為MeshLambertMaterial--> var sphereMaterial = new THREE.MeshLambertMaterial({color:0x7777FF}); <!--以給定的幾何尺寸和材質,建立一個球體--> var sphere = new THREE.Mesh(sphereGeometry,sphereMaterial); <!--指定球體的位置 X Y Z--> sphere.position.x =20; sphere.position.y=4; sphere.position.z = 0; <!--指出物體會投射陰影--> sphere.castShadow = true; <!--把建立的球體加入到場景中--> scene.add(sphere); <!--建立一個聚光燈變數,用來照射物體來產生陰影--> <!--建立一個spotLight變數,指定顏色:0xFFFFFF--> var spotLight = new THREE.SpotLight(0xFFFFFF); <!--指定spotLight的位置--> spotLight.position.set(-40,60,-10); <!--指出此光源照射物體,使物體產生陰影--> spotLight.castShadow = true; <!--把spotLight加入到場景中--> scene.add(spotLight); <!--指定相機的位置和方向,決定我們在場景中如何看,能看到什麼--> camera.position.x = -30; camera.position.y = 40; camera.position.z = 30; camera.lookAt(scene.position); <!--利用JQuery查詢到ID為WebGL-output的DIV,並把渲染到的東西輸出到該DIV--> $("#WebGL-output").append(renderer.domElement); <!--利用渲染器以給定的相機去渲染場景--> renderer.render(scene,camera); }) ; </script> </body> </html>

效果如下:
這裡寫圖片描述