欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

threejs太陽(yáng)光與陰影效果實(shí)例代碼

 更新時(shí)間:2022年04月05日 09:17:49   作者:Mool  
在Threejs中類(lèi)似于我們現(xiàn)實(shí)世界,物體顯示的顏色是由物體本身的顏色及光照的顏色相互疊加而得到的,這篇文章主要給大家介紹了關(guān)于threejs太陽(yáng)光與陰影效果的相關(guān)資料,需要的朋友可以參考下

前言

這篇文章實(shí)現(xiàn)智慧城市中模擬太陽(yáng)光隨時(shí)間變化產(chǎn)生對(duì)應(yīng)場(chǎng)景效果。為了場(chǎng)景能夠更逼真,我們一般會(huì)通過(guò)對(duì)接天氣以及陽(yáng)光等各種環(huán)境因素同步到場(chǎng)景中,使得場(chǎng)景能夠更貼近現(xiàn)實(shí)。比如一些常見(jiàn)的天氣系統(tǒng),下雨、下雪、陰天、霧霾等,我之后會(huì)獨(dú)立一篇文章中提現(xiàn)。這邊文章主要介紹一系列燈光,主要是平行光對(duì)于太陽(yáng)的模仿,以及一些材質(zhì)的問(wèn)題~

燈光與材質(zhì)基礎(chǔ)篇

常見(jiàn)的燈光:

       - 點(diǎn)光源 (點(diǎn)光源可以理解為一個(gè)同時(shí)向四面八方散發(fā)光線(xiàn),我們通常用來(lái)模擬燈泡,可以產(chǎn)生陰影)

       - 平行光 (平行光可以想象成一個(gè)從無(wú)限遠(yuǎn)照射來(lái)的光束,通常用來(lái)模擬太陽(yáng)光,可以產(chǎn)生陰影)

       - 聚光燈 (聚光燈字面意思就是類(lèi)似舞臺(tái)燈光一樣,照射突出特定圓弧形范圍,可以產(chǎn)生陰影)

       - 環(huán)境光 (一般用于改變整體場(chǎng)景的亮度,也是最常用的光源之一)

這里提一嘴材質(zhì):(僅僅列舉常用的)

       - 網(wǎng)格基礎(chǔ)材質(zhì)(MeshBasicMaterial,不支持陰影)

       - FBR材質(zhì)

           - 物理標(biāo)準(zhǔn)材質(zhì)(MeshStandardMaterial)

           - MeshPhysicalMaterial

           - 以上兩者FBR材質(zhì)相對(duì)于高光網(wǎng)格材質(zhì)效果更好

       - MeshPhongMaterial(高光網(wǎng)格材質(zhì),高亮表面、鏡面反射)

       - MeshLambertMaterial(網(wǎng)格Lambert材質(zhì),暗淡,漫反射)

這里簡(jiǎn)單做一下介紹,不懂的同學(xué)可以具體去了解某個(gè)材質(zhì)

太陽(yáng)光

添加平行光-----從東至西調(diào)整位置-----調(diào)整亮度以及顏色-----添加過(guò)渡模擬太陽(yáng)光

接下來(lái)介紹本文的重點(diǎn),如何模擬太陽(yáng)光照的變化。其實(shí)原理非常簡(jiǎn)單,就是添加平行光,調(diào)整場(chǎng)景模型的陰影關(guān)系,根據(jù)時(shí)間實(shí)時(shí)變化平行光的位置以及光照強(qiáng)度以及顏色即可模擬~

整體調(diào)用代碼

由于是一個(gè)demo,所以注重效果,一切從簡(jiǎn)實(shí)現(xiàn)功能

sun() { //兩秒變化一次平行光
  let i=0
  setInterval(()=>{
    this.initSun(i)
    i++
  },2000)
}

簡(jiǎn)單實(shí)現(xiàn)通過(guò)定時(shí)器以及提前寫(xiě)好對(duì)應(yīng)位置光照的信息。主要是思想,酌情根據(jù)自己的需求可以改變~

這里這么寫(xiě)主要是實(shí)現(xiàn)效果,真實(shí)的應(yīng)該根據(jù)系統(tǒng)時(shí)間將太陽(yáng)光做出調(diào)整,包括根據(jù)天氣原因,換湯不換藥,主要還是

手動(dòng)調(diào)整并存儲(chǔ)為json通過(guò)傳入時(shí)間以及天氣去做出轉(zhuǎn)化~ 

Viewer.prototype.initSun = function (type) {
  let position = {}
  let color = '#ffffff'
  let intensity = 1
  switch (type) {
    case 0:
      position = {
        x: 270,
        y: 150,
        z: 0
      }
      intensity = 5
      break
    case 1:
      position = {
        x: 258,
        y: 170,
        z: 0
      }
      intensity = 7
      color = '#fcffc9'
      break
    case 2:
      position = {
        x: 245,
        y: 180,
        z: 0
      }
      intensity = 10
      color = '#ffe69f'
      break
    case 3:
      position = {
        x: 0,
        y: 100,
        z: 0
      }
      intensity = 15
      color = '#ffe69f'
      break
    case 4:
      position = {
        x: -245,
        y: 180,
        z: 0
      }
      intensity = 10
      color = '#e3894d'
      break
    case 5:
      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 = new zhdSun()
    this.directionalLight.renderFn(this.renderFunction)
    this.directionalLight.init({
      position,
      color,
      intensity,
      scene: this.scene,
      currentlayers: this.currentlayers
    })
  }
}

太陽(yáng)光類(lèi)

這里主要對(duì)太陽(yáng)光類(lèi)的拆解與分析,封裝的比較粗糙,酌情個(gè)人可以?xún)?yōu)化

import TWEEN from '@tweenjs/tween.js'
import {zhdObject} from './zhdObject'
export class zhdSun extends zhdObject {
  constructor() {
    super()
    this.light = null
  }
}
//由于添加了TWEEN動(dòng)畫(huà)庫(kù),記得在animate中實(shí)時(shí)更新TWEEN
TWEEN.update()

初始化

這里做的是向場(chǎng)景中添加平行光,設(shè)置其陰影的范圍以及距離等屬性,因?yàn)槲疫@邊涉及層級(jí),所以設(shè)置了平行光的層級(jí)

平行光可謂是所有燈光中陰影調(diào)整最麻煩的,想要平行光能夠產(chǎn)生對(duì)的陰影效果,模型的產(chǎn)生陰影以及接收陰影要調(diào)整好,并且平行光的照射范圍也要調(diào)整好。我效果圖中不知大家有沒(méi)有發(fā)現(xiàn),在正午時(shí)刻的時(shí)候太陽(yáng)光照射地面產(chǎn)生了一個(gè)長(zhǎng)方形的范圍陰影,這里是特地錄制一個(gè)相對(duì)不那么完美的版本。

產(chǎn)生原因:平行光范圍太小,但是一旦你調(diào)整平行光范圍過(guò)大,由于地面是通過(guò)多個(gè)瓦片加載的,就會(huì)出現(xiàn)條紋狀的陰影

如下圖

解決方法:調(diào)整平行光陰影的bias屬性,有助于減少陰影中的偽影

init({position, color, intensity , currentlayers, scene}) {
  const directionalLight = new THREE.DirectionalLight(color, intensity) // 新建一個(gè)平行光源,顏色未白色,強(qiáng)度為1
  this.light = directionalLight
  directionalLight.position.set(position.x, position.y, position.z) // 將此平行光源調(diào)整到一個(gè)合適的位置
  directionalLight.castShadow = true // 將此平行光源產(chǎn)生陰影的屬性打開(kāi)
  // 設(shè)置平行光的的陰影屬性,即一個(gè)長(zhǎng)方體的長(zhǎng)寬高,在設(shè)定值的范圍內(nèi)的物體才會(huì)產(chǎn)生陰影
  const d =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 // 較高的值會(huì)以計(jì)算時(shí)間為代價(jià)提供更好的陰影質(zhì)量
  directionalLight.shadow.bias = -0.0005 //解決條紋陰影的出現(xiàn)
  this.setlayers(directionalLight, currentlayers)
  scene.add(directionalLight) // 將此平行光源加入場(chǎng)景中,我們才可以看到這個(gè)光源
  return directionalLight
}

設(shè)置平行光信息

設(shè)置平行光的信息:包括位置、顏色、強(qiáng)度

setSun(position, color, intensity) {
  this.setTweens(this.light.position, position, 2000)
  this.light.color = new THREE.Color( color )
  this.light.intensity = intensity
}

Tween

這里簡(jiǎn)單介紹TWEEN不懂的可以去看我之前的文章,主要是一個(gè)動(dòng)畫(huà)庫(kù),這里做簡(jiǎn)單的封裝

setTweens(obj, newObj, duration = 1500) {
  var ro = new TWEEN.Tween(obj)
  ro.to(newObj, duration) // 變化后的位置以及動(dòng)畫(huà)時(shí)間
  ro.easing(TWEEN.Easing.Sinusoidal.InOut)
  ro.onUpdate(function () {
  })
  ro.start()
}

總結(jié)

到此這篇關(guān)于threejs太陽(yáng)光與陰影效果的文章就介紹到這了,更多相關(guān)threejs太陽(yáng)光與陰影內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js中console在一行內(nèi)打印字符串和對(duì)象的方法

    js中console在一行內(nèi)打印字符串和對(duì)象的方法

    這篇文章主要介紹了js中console在一行內(nèi)打印字符串和對(duì)象的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • JavaScript表單驗(yàn)證實(shí)例之驗(yàn)證表單項(xiàng)是否為空

    JavaScript表單驗(yàn)證實(shí)例之驗(yàn)證表單項(xiàng)是否為空

    表單驗(yàn)證幾乎在每個(gè)需要注冊(cè)或者是登錄的網(wǎng)站都是必不可少,下面通過(guò)本篇文章給大家介紹JavaScript表單驗(yàn)證實(shí)例之驗(yàn)證表單項(xiàng)是否為空,涉及到j(luò)s表單驗(yàn)證實(shí)例相關(guān)知識(shí),對(duì)js表單驗(yàn)證實(shí)例代碼需要的朋友一起學(xué)習(xí)吧
    2016-01-01
  • JS中forEach()和map()的區(qū)別講解

    JS中forEach()和map()的區(qū)別講解

    forEach和map方法都是基于數(shù)組的迭代器實(shí)現(xiàn)的,它們的主要區(qū)別在于對(duì)回調(diào)函數(shù)的處理方式,這篇文章主要介紹了JS中forEach()和map()的區(qū)別,需要的朋友可以參考下
    2024-02-02
  • JS數(shù)組去重常用方法實(shí)例小結(jié)【4種方法】

    JS數(shù)組去重常用方法實(shí)例小結(jié)【4種方法】

    這篇文章主要介紹了JS數(shù)組去重常用方法,結(jié)合實(shí)例形式總結(jié)分析了4種常用的數(shù)據(jù)去重實(shí)現(xiàn)方法,涉及javascript數(shù)組的遍歷、判斷、追加等相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • 深入探究JS中的異步編程和事件循環(huán)機(jī)制

    深入探究JS中的異步編程和事件循環(huán)機(jī)制

    js是單線(xiàn)程事件循環(huán)模型,同步操作與異步操作時(shí)代碼所依賴(lài)的核心機(jī)制,異步行為是為了優(yōu)化因計(jì)算量大而時(shí)間長(zhǎng)的操作,本文詳細(xì)給大家介紹了JS中的異步編程和事件循環(huán)機(jī)制,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-05-05
  • js的math中缺少的數(shù)學(xué)方法小結(jié)

    js的math中缺少的數(shù)學(xué)方法小結(jié)

    JavaScript?Math對(duì)象包含一些真正有用且強(qiáng)大的數(shù)學(xué)運(yùn)算,但它缺乏大多數(shù)其他語(yǔ)言提供的許多重要運(yùn)算,例如求和,乘積,奇數(shù)和偶數(shù)等等,本文就來(lái)介紹一下
    2023-08-08
  • 一文帶你理解JavaScript中的函數(shù)式編程

    一文帶你理解JavaScript中的函數(shù)式編程

    函數(shù)式編程 是一種 編程規(guī)范,也是一種對(duì)語(yǔ)言程序(比如JavaScript)本身能力的 運(yùn)用方式。本篇文章將從 編程規(guī)范 來(lái)介紹函數(shù)式編程的到底是一種什么樣的規(guī)范,希望對(duì)大家有所幫助
    2023-02-02
  • UEditor 自定義圖片視頻尺寸校驗(yàn)功能的實(shí)現(xiàn)代碼

    UEditor 自定義圖片視頻尺寸校驗(yàn)功能的實(shí)現(xiàn)代碼

    UEditor支持單圖、多圖以及視頻上傳,編輯器配置項(xiàng)支持文件格式、文件大小校驗(yàn),對(duì)于文件寬高尺寸校驗(yàn)暫不支持。本文給大家介紹UEditor 自定義圖片視頻尺寸校驗(yàn)功能的實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧
    2020-10-10
  • JS document對(duì)象簡(jiǎn)單用法完整示例

    JS document對(duì)象簡(jiǎn)單用法完整示例

    這篇文章主要介紹了JS document對(duì)象簡(jiǎn)單用法,結(jié)合完整實(shí)例形式詳細(xì)分析了JS document對(duì)象獲取、輸出、節(jié)點(diǎn)調(diào)用等相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01
  • JS實(shí)現(xiàn)瀏覽器狀態(tài)欄文字閃爍效果的方法

    JS實(shí)現(xiàn)瀏覽器狀態(tài)欄文字閃爍效果的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)瀏覽器狀態(tài)欄文字閃爍效果的方法,通過(guò)時(shí)間函數(shù)定時(shí)觸發(fā)遞歸調(diào)用實(shí)現(xiàn)狀態(tài)欄文字閃爍效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10

最新評(píng)論