版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第threejs太陽光與陰影效果實例代碼目錄前言燈光與材質(zhì)基礎(chǔ)篇太陽光整體調(diào)用代碼太陽光類初始化設(shè)置平行光信息Tween總結(jié)
前言
這篇文章實現(xiàn)智慧城市中模擬太陽光隨時間變化產(chǎn)生對應(yīng)場景效果。為了場景能夠更逼真,我們一般會通過對接天氣以及陽光等各種環(huán)境因素同步到場景中,使得場景能夠更貼近現(xiàn)實。比如一些常見的天氣系統(tǒng),下雨、下雪、陰天、霧霾等,我之后會獨立一篇文章中提現(xiàn)。這邊文章主要介紹一系列燈光,主要是平行光對于太陽的模仿,以及一些材質(zhì)的問題~
燈光與材質(zhì)基礎(chǔ)篇
常見的燈光:
-點光源(點光源可以理解為一個同時向四面八方散發(fā)光線,我們通常用來模擬燈泡,可以產(chǎn)生陰影)
-平行光(平行光可以想象成一個從無限遠(yuǎn)照射來的光束,通常用來模擬太陽光,可以產(chǎn)生陰影)
-聚光燈(聚光燈字面意思就是類似舞臺燈光一樣,照射突出特定圓弧形范圍,可以產(chǎn)生陰影)
-環(huán)境光(一般用于改變整體場景的亮度,也是最常用的光源之一)
這里提一嘴材質(zhì):(僅僅列舉常用的)
-網(wǎng)格基礎(chǔ)材質(zhì)(MeshBasicMaterial,不支持陰影)
-FBR材質(zhì)
-物理標(biāo)準(zhǔn)材質(zhì)(MeshStandardMaterial)
-MeshPhysicalMaterial
-以上兩者FBR材質(zhì)相對于高光網(wǎng)格材質(zhì)效果更好
-MeshPhongMaterial(高光網(wǎng)格材質(zhì),高亮表面、鏡面反射)
-MeshLambertMaterial(網(wǎng)格Lambert材質(zhì),暗淡,漫反射)
這里簡單做一下介紹,不懂的同學(xué)可以具體去了解某個材質(zhì)
太陽光
添加平行光-----從東至西調(diào)整位置-----調(diào)整亮度以及顏色-----添加過渡模擬太陽光
接下來介紹本文的重點,如何模擬太陽光照的變化。其實原理非常簡單,就是添加平行光,調(diào)整場景模型的陰影關(guān)系,根據(jù)時間實時變化平行光的位置以及光照強度以及顏色即可模擬~
整體調(diào)用代碼
由于是一個demo,所以注重效果,一切從簡實現(xiàn)功能
sun(){//兩秒變化一次平行光
leti=0
setInterval(()={
this.initSun(i)
},2000)
}
簡單實現(xiàn)通過定時器以及提前寫好對應(yīng)位置光照的信息。主要是思想,酌情根據(jù)自己的需求可以改變~
這里這么寫主要是實現(xiàn)效果,真實的應(yīng)該根據(jù)系統(tǒng)時間將太陽光做出調(diào)整,包括根據(jù)天氣原因,換湯不換藥,主要還是
手動調(diào)整并存儲為json通過傳入時間以及天氣去做出轉(zhuǎn)化~
Vtotype.initSun=function(type){
letposition={}
letcolor='#ffffff'
letintensity=1
switch(type){
case0:
position={
x:270,
y:150,
z:0
intensity=5
break
case1:
position={
x:258,
y:170,
z:0
intensity=7
color='#fcffc9'
break
case2:
position={
x:245,
y:180,
z:0
intensity=10
color='#ffe69f'
break
case3:
position={
x:0,
y:100,
z:0
intensity=15
color='#ffe69f'
break
case4:
position={
x:-245,
y:180,
z:0
intensity=10
color='#e3894d'
break
case5:
position={
x:-258,
y:160,
z:0
intensity=10
color='#ff8400'
break
default:
position={
x:-270,
y:150,
z:0
intensity=8
color='#ff8400'
break
if(this.directionalLight){
this.directionalLight.setSun(position,color,intensity)
}else{
this.directionalLight=newzhdSun()
this.directionalLight.renderFn(this.renderFunction)
this.directionalLight.init({
position,
color,
intensity,
scene:this.scene,
currentlayers:this.currentlayers
}
太陽光類
這里主要對太陽光類的拆解與分析,封裝的比較粗糙,酌情個人可以優(yōu)化
importTWEENfrom'@tweenjs/tween.js'
import{zhdObject}from'./zhdObject'
exportclasszhdSunextendszhdObject{
constructor(){
super()
this.light=null
//由于添加了TWEEN動畫庫,記得在animate中實時更新TWEEN
TWEEN.update()
初始化
這里做的是向場景中添加平行光,設(shè)置其陰影的范圍以及距離等屬性,因為我這邊涉及層級,所以設(shè)置了平行光的層級
平行光可謂是所有燈光中陰影調(diào)整最麻煩的,想要平行光能夠產(chǎn)生對的陰影效果,模型的產(chǎn)生陰影以及接收陰影要調(diào)整好,并且平行光的照射范圍也要調(diào)整好。我效果圖中不知大家有沒有發(fā)現(xiàn),在正午時刻的時候太陽光照射地面產(chǎn)生了一個長方形的范圍陰影,這里是特地錄制一個相對不那么完美的版本。
產(chǎn)生原因:平行光范圍太小,但是一旦你調(diào)整平行光范圍過大,由于地面是通過多個瓦片加載的,就會出現(xiàn)條紋狀的陰影
如下圖
解決方法:調(diào)整平行光陰影的bias屬性,有助于減少陰影中的偽影
init({position,color,intensity,currentlayers,scene}){
constdirectionalLight=newTHREE.DirectionalLight(color,intensity)//新建一個平行光源,顏色未白色,強度為1
this.light=directionalLight
directionalLight.position.set(position.x,position.y,position.z)//將此平行光源調(diào)整到一個合適的位置
directionalLight.castShadow=true//將此平行光源產(chǎn)生陰影的屬性打開
//設(shè)置平行光的的陰影屬性,即一個長方體的長寬高,在設(shè)定值的范圍內(nèi)的物體才會產(chǎn)生陰影
constd=100//陰影范圍
directionalLight.shadow.camera.left=-d
directionalLight.shadow.camera.right=d
directionalLight.shadow.camera.top=d
directionalLight.shadow.camera.bottom=-d
directionalLight.shadow.camera.near=20
directionalLight.shadow.camera.far=8000
directionalLight.shadow.mapSize.x=2048//定義陰影貼圖的寬度和高度,必須為2的整數(shù)此冪
directionalLight.shadow.mapSize.y=2048//較高的值會以計算時間為代價提供更好的陰影質(zhì)量
directionalLight.shadow.bias=-0.0005//解決條紋陰影的出現(xiàn)
this.setlayers(directionalLight,currentlayers)
scene.add(directionalLight)//將此平行光源加入場景中,我們才可以看到這個光源
returndirectionalLight
}
設(shè)置平行光信息
設(shè)置平行光的信息:包括位置、顏色、強度
setSun(position,color,intensity){
this.setTweens(this.light.position,position,2000)
this.light.color=newTHREE.Color(color)
ensity=intensity
}
Tween
這里簡單介紹TWEEN不懂的可以去看我之前的文章,主要是一個動畫庫,這里做簡單
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年環(huán)境評估(土壤環(huán)境質(zhì)量評估)試題及答案
- 2025年中職(醫(yī)學(xué)檢驗)血常規(guī)檢測實務(wù)綜合測試題及答案
- 2025年大學(xué)(測繪科學(xué)與技術(shù)專業(yè))地理信息系統(tǒng)基礎(chǔ)試題及答案
- 2025年大學(xué)第四學(xué)年(工程項目融資)融資方案設(shè)計階段測試題及答案
- 2025年大學(xué)美術(shù)學(xué)(美術(shù)學(xué)概論)試題及答案
- 2025年大學(xué)安全教育(交通安全知識)試題及答案
- 2025年中職(市場開發(fā)實務(wù))客戶開發(fā)流程階段測試試題及答案
- 2025年中職船舶工程技術(shù)(船舶建造工藝)試題及答案
- 2025年中職道路橋梁工程技術(shù)(路橋施工技術(shù))試題及答案
- 2025年大學(xué)臨床醫(yī)學(xué)(臨床診療技術(shù))試題及答案
- 海南2025年中國熱帶農(nóng)業(yè)科學(xué)院橡膠研究所第一批招聘16人(第1號)筆試歷年參考題庫附帶答案詳解
- 2025-2026人教版數(shù)學(xué)七年級上冊期末模擬試卷(含答案)
- 廣告行業(yè)法律法規(guī)與行業(yè)規(guī)范(標(biāo)準(zhǔn)版)
- 2026年國安民警副科級面試題及實戰(zhàn)解答
- 2026年紀(jì)檢監(jiān)察室工作面試題集
- 浙江省紹興市諸暨市2024-2025學(xué)年四年級上冊期末考試數(shù)學(xué)試卷(含答案)
- 廣東省廣州市天河區(qū)2024-2025學(xué)年七年級上學(xué)期期末考試語文試題(含答案)
- 11340《古代小說戲曲專題》國家開放大學(xué)期末考試題庫
- 工會職工大會制度實施細(xì)則范本
- ups拆除施工方案
- GB/T 21196.4-2007紡織品馬丁代爾法織物耐磨性的測定第4部分:外觀變化的評定
評論
0/150
提交評論