03.ThreeJs開發指南-第三章-光源

第三章

環境光:AmbientLight
點光源:PointLight
聚光燈:SpotLight
方向光:DirectionalLight:無限光,例如太陽光,平行光
半球光:HemisphereLight:模擬更加自然的室外光線,反光面,光線微弱的天空
面光源:AreaLight
鏡頭眩光:LensFlare

AmbientLight:影響整個場景的光源
光源沒有特定的來源,不能產生陰影。不能作爲場景中唯一光源,言外之意,他是配合其他光源存在的。

作用:弱化陰影或添加一些顏色。

使用該光源,用色應儘量保守。

var ambientColor = '0x0c0c0c';
var ambientLight = new THREE.AmbientLight(ambientColor);
scene.add(ambientLight);
...

var controls = new function(){
    this.ambientColor = ambientColor;
}

var gui = new dat.GUI();
gui.addColor(controls,'ambientColor').onchange(function(e){

    ambientLight.color = new THREE.Color(e);
});

該光源不需要設置光源的位置,直接添加到Scene中即可。

THREE.Color()對象

函數:
set(value) 設置當前顏色改成指定的十六進制值。這個值可以是字符串或者數字。
setHex(value) 設置當前顏色改成指定的十六進制值。這個值只能是數字。
setRGB(r,g,b) 參數範圍0-1
setHSV(h,x,v) 參數範圍0-1
copy(colorObj) 從提供的顏色對象賦值顏色值到當前對象

getHex()
getHexString()
getHSV()

add(color) 將提供的顏色加到當前的顏色上
addColors(color1,color2)
addScalar(s) 在當前顏色的RGB分量上添加值

clone() 複製當前顏色

PointLig:照射所有方向

點光源不會產生投影,因爲他的光線照射所有的方向,計算投影的話對GPU來說是沉重的負擔。

屬性:
color
intensity 光源強度,默認爲1
distance 光源照射的距離。默認爲0,表示光線的亮度不會隨着距離的增加而減少。
position
visible 爲true,該光源打開,爲false,該光源關閉。

SpotLight:常用的光源,具有錐形效果

可以產生陰影

屬性:
castShadow
shaowCameraNear 從距離光源哪一點開始產生陰影
shadowCameraFar 從距離光源哪一點爲止結束生成陰影
shadowCameraFov 用於生成陰影的視場有多大
target 決定光照的方向,一般是一個物體,即光源照向這個物體。
shadowBias 偏移陰影的位置
angle 光源射出的光柱有多寬。默認 Math.PI/3
exponent 光強衰減指數,決定光強遞減的有多快。
onlyShadow 如果爲true,則只產生陰影,不產生光照。
shadowCameraVisible 如果爲true,就可以看到光源的位置及如何生成陰影。
shadowDarkness 陰影的陰暗程度,默認爲0.5,場景渲染完畢之後不能修改。
shadowMapWidth 決定多少像素渲染陰影,如果陰影邊緣有鋸齒可以增加這個值
shadowMapHeight 決定多少像素渲染陰影,如果陰影邊緣有鋸齒可以增加這個值

target屬性我們可以設置場景中的任何一個物體,當前我們也可以設置空間的任何一點。

var target = new THREE.Object3D();
target.position = new THREE.Vector3(5,0,0);

spotLight.target = target;

DirectionalLight:模擬太陽光

整個區域的光強是一樣的。

可以產生陰影

屬性:
direction
color
intensity

方向光和點光源有很多相同的屬性。

特有屬性:

對於點光源來說,要想產生陰影,我們不得不定義生成引用的光錐。
方向光所有的光線是平行的,所以不會有光錐,取而代之的是一個方塊。

可以使用下面幾個屬性定義一個方塊。

directionalLight.shaowCameraNear = 2;
directionalLight.shadowCameraFar = 200;
directionalLight.shadowCameraLeft = -50;
directionalLight.shadowCameraRight = 50;
directionalLight.shadowCameraTop = 50;
directionalLight.shadowCameraBottom = -50;

HemisphereLight:模擬更加自然的室外光線,反光面,光線微弱的天空

//參數見屬性
var hemiLight = new THREE.HemisphereLight(0x0000ff,0x00ff00,0.6);
hemiLight.position.set(0,500,0);
scene.add(hemiLight);

屬性:
groundColor:從地面發出的光線的顏色
Color : 從天空發出的光線的顏色
intensity

AreaLight

創建一個矩形的光源。

在Three.js庫的擴展中。

AreaLight是一種複雜的光源,需要使用WebGLDeferredRenderer(WebGL延遲渲染器)

如果我們的場景中有大量的光源,而且性能也有問題,就應該考慮使用 WebGLDeferredRenderer延遲渲染器。

js庫:
WebGLDeferredRenderer.js
ShaderDeferred.js
RenderPass.js
EffectComposer.js
CopyShader.js
ShaderPass.js
FXAAShader.js
MashPass.js

var renderer = new THREE.WebGLDeferredRenderer({

    width:window.innerWidth,
    height:window.innerHeight,
    scale:1
    antialias:true,
    tonemapping:THREE.FilmicOperator,
    brightness:2.5

});

第十章會解釋這些參數的含義。

var areaLight = new THREE.AreaLight(0xff0000,3);//光強3
areaLight.position.set(x,y,z);
areaLight.rotation.set(Math.PI/2);
areaLight.width  = 4;
areaLight.height = 9.9;
scene.add(areaLight);

默認情況下,光源是不可見的。

我們可以在光源的地方創建一個平面,來代替光源。

var plane = new THREE.CubeGeometry(4,10,0);
var planeMat = new THREE.MeshBasicMaterial({color:0xff0000});
var plane1 = new THREE.Mesh(plane,planeMat);
plane1.position = areaLight.position;
scene.add(plane1);

LensFlare:鏡頭眩光

var lensFlare = new THREE.LensFlare(texture,size,distance,blending,color);

texture:紋理,決定眩光的樣子
size:決定眩光多大。如果爲-1,則使用紋理的大小。
distance:光源(0)到相機的距離(1)
blending:融合,當我們爲眩光提供多種材質時,該屬性決定這些材質怎麼融合。默認的融合模式是THREE.AdditiveBlending,它可以提供一種半透明的眩光。
color:顏色

var textureFlare0 = THREE.ImageUtils.loadTexture('../...');
var flareColor = new THREE.Color(0xffaacc);
var lensFlare = new THREE.LensFlare(textureFlare0,350,0.0,THREE.AdditiveBlending,flareColor);

lensFlare.position = spotLight.position;
scene.add(lensFlare);

進一步美化場景:

var textureFlare3 = THREE.ImageUtils.loadTexture('../...');

lensFlare.add(textureFlare3,60,0.6,THREE.AdditiveBlending);
lensFlare.add(textureFlare3,70,0.7,THREE.AdditiveBlending);
lensFlare.add(textureFlare3,120,0.9,THREE.AdditiveBlending);
lensFlare.add(textureFlare3,70,1.0,THREE.AdditiveBlending);
發佈了98 篇原創文章 · 獲贊 68 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章