天天看點

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(,,);

spotLight.target = target;
           

DirectionalLight:模拟太陽光

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

可以産生陰影

屬性:

direction

color

intensity

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

特有屬性:

對于點光源來說,要想産生陰影,我們不得不定義生成引用的光錐。

方向光所有的光線是平行的,是以不會有光錐,取而代之的是一個方塊。

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

directionalLight.shaowCameraNear = ;
directionalLight.shadowCameraFar = ;
directionalLight.shadowCameraLeft = -;
directionalLight.shadowCameraRight = ;
directionalLight.shadowCameraTop = ;
directionalLight.shadowCameraBottom = -;
           

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

//參數見屬性
var hemiLight = new THREE.HemisphereLight(x0000ff,x00ff00,);
hemiLight.position.set(,,);
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:
    antialias:true,
    tonemapping:THREE.FilmicOperator,
    brightness:

});
           

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

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

預設情況下,光源是不可見的。

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

var plane = new THREE.CubeGeometry(,,);
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(xffaacc);
var lensFlare = new THREE.LensFlare(textureFlare0,,,THREE.AdditiveBlending,flareColor);

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

進一步美化場景:

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

lensFlare.add(textureFlare3,,,THREE.AdditiveBlending);
lensFlare.add(textureFlare3,,,THREE.AdditiveBlending);
lensFlare.add(textureFlare3,,,THREE.AdditiveBlending);
lensFlare.add(textureFlare3,,,THREE.AdditiveBlending);
           

繼續閱讀