国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Three.js--》理解光源對物體產生影響的重要性

這篇具有很好參考價值的文章主要介紹了Three.js--》理解光源對物體產生影響的重要性。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

上篇文章?前端開發(fā)者掌握3d技術不再是夢,初識threejs 作為three.js入門篇講解了許多內容但是沒有深入了解其原理以及實現方法,僅僅只是展示了實現的內容及代碼,本篇文章將深入講解實現效果其背后用到的知識與原理。

目錄

使用相機控件軌道控制器

理解光源影響

環(huán)境光

點光源

聚光燈光源

平行光

燈光與陰影的關系設置


使用相機控件軌道控制器

平時開發(fā)調試代碼或者展示模型的時候,可以通過相機控件 OrbitControls 實現旋轉縮放預覽效果

旋轉:拖動鼠標左鍵、縮放:滾動鼠標中鍵、平移:拖動鼠標右鍵。使用控件步驟如下:

引入第三方控件js文件,如下:

// 導入軌道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

使用OrbitControls,可以參考一下官方文檔對這方面的知識進行的講解,如下:

Three.js--》理解光源對物體產生影響的重要性

創(chuàng)建軌道控制器之后,創(chuàng)設置好的照相機和要觀察的物體對象作為參數傳入,并每次經過渲染函數的調用還實現查看物體方向的作用:

// 創(chuàng)建軌道控制器
new OrbitControls(camera,renderer.domElement)

export function render(){
  // 使用渲染器,通過相機將場景渲染出來
  renderer.render(scene,camera)
  // 接下來渲染下一幀的時候就會調用render函數
  requestAnimationFrame(render)
}
// 先開始就渲染一下
render()

Three.js--》理解光源對物體產生影響的重要性

理解光源影響

實際生活中物體表面的明暗效果是會受到光照的影響,threejs中同樣也要模擬光照Light對網絡模型Mesh表面的影響,threejs提供的網格材質,有的受光照影響,有的不受光照影響,其用到的網絡材質如下:

Three.js--》理解光源對物體產生影響的重要性

如果你設置的是不受光照影響的網格材質,做不做光源都沒有影響,物體表面顏色基本沒啥區(qū)別,但是你一旦設置了受光照影響的網格材質,就必須做光源,否則物體是不顯示的,這很容易理解啊,在黑夜中你是看不見物體的,只有有了光源你才能看到物體,這是一個道理。

Three.js提供了多種模擬生活中光源的API,在官方文檔中搜索關鍵詞 light 就可以看到,如下:

Three.js--》理解光源對物體產生影響的重要性

環(huán)境光

環(huán)境光 AmbientLight 沒有特定的方向,只是整體改變場景的光照明暗。按我個人的理解就是,環(huán)境光就相當于太陽光,雖然不能有很強的光照強度,但是其能照亮每一處地方,如下:

Three.js--》理解光源對物體產生影響的重要性

Three.js--》理解光源對物體產生影響的重要性

Three.js--》理解光源對物體產生影響的重要性

點光源

點光源顧名思義,就是一個點向各個方向發(fā)散光源,其相關函數設置可參考官方文檔。

Three.js--》理解光源對物體產生影響的重要性

Three.js--》理解光源對物體產生影響的重要性

可以看到下圖的樣式,我將點光源的位置設置在y坐標軸上,被點光源照射的地方呈現物體原本的顏色,而沒有被照射的地方則呈現出黑色,如下:

Three.js--》理解光源對物體產生影響的重要性

雖然大家可能知道事是這么回事,但是不知道事的人是真不知道這事是怎么回事,為了讓不知道事的人知道這是怎么回事,我們可以這么會事,通過點光源輔助觀察對象 PointLightHelper 來可視化光源,如下:

Three.js--》理解光源對物體產生影響的重要性

Three.js--》理解光源對物體產生影響的重要性

搭配環(huán)境光的話,效果更明顯,如下:

Three.js--》理解光源對物體產生影響的重要性

Three.js--》理解光源對物體產生影響的重要性

聚光燈光源

聚光燈光源就是一個點沿著一個方向射出,隨著光線照射的變遠,光線圓錐體的尺寸也逐漸變大

Three.js--》理解光源對物體產生影響的重要性

// 聚光燈光源
const spotLight = new THREE.SpotLight(0xffffff,0.5)
spotLight.position.set(10,5,5)
spotLight.castShadow = true
// 從聚光燈的位置以弧度表示聚光燈的最大范圍
spotLight.angle = Math.PI / 6
// 設置光源隨著距離的衰減程度
spotLight.distance = 100
// 設置聚光錐的半影衰減百分比
spotLight.penumbra = 0
// 設置沿著光照距離的衰減量
spotLight.decay = 0
scene.add(spotLight)

Three.js--》理解光源對物體產生影響的重要性

平行光

平行光 DirectionalLight 就是沿著特定方向發(fā)射,如下:

Three.js--》理解光源對物體產生影響的重要性

Three.js--》理解光源對物體產生影響的重要性

Three.js--》理解光源對物體產生影響的重要性

平行光與Mesh表面光線是存在反射規(guī)律的,平行光照射到網格模型Mesh表面,光線和模型表面構成一個入射角度,入射角度的不同,對光照的反射能力不同,光線照射到漫反射網絡材質對應Mesh表面,Mesh表面對光線反射程度取決于入射角度,如下:

Three.js--》理解光源對物體產生影響的重要性

燈光與陰影的關系設置

在進行3d建模的時候,我們也可以給物體設置一個陰影,這樣讓3d立體的效果更加明顯,我在第一篇文章也講解到了關于陰影的設置,接下來我將詳細講解一下添加陰影的步驟。注意:添加陰影一定不要使用環(huán)境光作為光源,因為環(huán)境光是沒有方向的;當然也不要使用基礎網格材質,因為這種材質是不受光照影響的。如果要做到燈光與影響需要做到以下步驟:

1)材質要滿足能夠對光照有反應,光源不選擇環(huán)境光

2)設置渲染器開啟陰影的計算:renderer.shadowMap.enabled = true

3)設置光照投射投影:directionalLight.castShadow = true

4)設置物體投射陰影:sphere.castShadow = true

5)設置物體接收陰影:plane.receiveShadow = true

Three.js--》理解光源對物體產生影響的重要性

陰影屬性:我們除了能設置陰影以外,我們還可以給陰影添加一些屬性,讓陰影的呈現更具有靈活性,如下:

radius:將此值設置大于1的值將模糊陰影的邊緣。

Three.js--》理解光源對物體產生影響的重要性

Three.js--》理解光源對物體產生影響的重要性

mapSize:定義陰影貼圖的寬度和高度。

Three.js--》理解光源對物體產生影響的重要性

Three.js--》理解光源對物體產生影響的重要性

當然我們也可以設置投射相機的屬性來改變陰影的效果,后面文章講解的gui庫可以結合這個動態(tài)的改變值的大小,這樣的效果更加明顯。

// 設置投射相機的屬性
pointLight.shadow.camera.near = 0.5
pointLight.shadow.camera.far = 500
pointLight.shadow.camera.top = 5
pointLight.shadow.camera.bottom = -5
pointLight.shadow.camera.left = -5
pointLight.shadow.camera.right = 5

當然每次修改相關值之后,必須調用更新攝像機投影矩陣。

Three.js--》理解光源對物體產生影響的重要性

仔細對比一下光源對物體的影響。給出本文完整代碼,如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-437558.html

import * as THREE from 'three';

// 導入軌道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

// 1.創(chuàng)建場景
const scene = new THREE.Scene();
// 2.創(chuàng)建相機
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
// 設置x、y、z軸坐標,即設置相機位置
camera.position.set(0,0,10)
// 將相機添加到場景之中
scene.add(camera)
// 3.添加物體,創(chuàng)建幾何體
const cubeGeometry = new THREE.BoxGeometry(1,1,1) // 設置幾何體大小
const cubeMaterial = new THREE.MeshLambertMaterial({color:0xff0000}) // 設置幾何體材質
// 根據幾何體和材質創(chuàng)建物體
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)

// 修改物體的位置
cube.position.y = 1.5
cube.rotation.set(Math.PI / 4,0,0,"XYZ")
// 物體投射投影
cube.castShadow = true

// 將幾何體添加到場景之中
scene.add(cube)
// 4.初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 設置渲染的尺寸大小
renderer.setSize(window.innerWidth,window.innerHeight)
// 開啟場景中的陰影貼圖
renderer.shadowMap.enabled = true
// 將webgl渲染的canvas內容添加到body上
document.body.appendChild(renderer.domElement)

// 創(chuàng)建地面網格參照
const planeGeometry = new THREE.PlaneGeometry(30,30) // 平面幾何的寬高
const PlaneMateial = new THREE.MeshStandardMaterial({color:0xF8F8FF}) // 幾何平面的顏色
const plane = new THREE.Mesh(planeGeometry,PlaneMateial)
plane.rotation.x = -0.5*Math.PI
plane.position.set(0,0,0)
// 平面接收投影
plane.receiveShadow = true
scene.add(plane)

// 添加一個環(huán)境光
const ambient = new THREE.AmbientLight(0xffffff,0.2)
scene.add(ambient)

// 創(chuàng)建一個點光源
const pointLight = new THREE.PointLight(0xffffff,1.0)
// 設置點光源位置
pointLight.position.set(0,5,0)
// 設置光照投影
pointLight.castShadow = true
// 設置陰影貼圖模糊度
pointLight.shadow.radius = 20
// 設置陰影貼圖的分辨率
pointLight.shadow.mapSize.set(4096,4096)
// 設置點光源投射相機的屬性
pointLight.shadow.camera.near = 0.5
pointLight.shadow.camera.far = 500
pointLight.shadow.camera.top = 5
pointLight.shadow.camera.bottom = -5
pointLight.shadow.camera.left = -5
pointLight.shadow.camera.right = 5

scene.add(pointLight)
// 可視化點光源
const pointLightHelper = new THREE.PointLightHelper( pointLight, 0.1 );
scene.add(pointLightHelper)

// // 聚光燈光源
// const spotLight = new THREE.SpotLight(0xffffff,0.5)
// spotLight.position.set(10,5,5)
// spotLight.castShadow = true
// // 從聚光燈的位置以弧度表示聚光燈的最大范圍
// spotLight.angle = Math.PI / 6
// // 設置光源隨著距離的衰減程度
// spotLight.distance = 100
// // 設置聚光錐的半影衰減百分比
// spotLight.penumbra = 0
// // 設置沿著光照距離的衰減量
// spotLight.decay = 0
// scene.add(spotLight)

// // 添加一個平行光
// const directionalLight = new THREE.DirectionalLight(0xffffff,1)
// // 設置光源方向
// directionalLight.position.set(8,10,5)
// // 方向光指向對象網格模型Mesh,即照射的對象,可以不設置,默認的位置是0,0,0
// directionalLight.target = cube
// scene.add(directionalLight)
// // 可視化平行光
// const dirLightHelper = new THREE.DirectionalLightHelper(directionalLight,5,0xff0000)
// scene.add(dirLightHelper)


// 添加坐標軸輔助器
const axesHelper = new THREE.AxesHelper(5) // 數值代表線的長度
scene.add(axesHelper) // 添加到場景之中

// 創(chuàng)建軌道控制器
new OrbitControls(camera,renderer.domElement)

export function render(){
  cube.position.x +=0.01
  cube.rotation.x +=0.01
  if(cube.position.x>5){
    cube.position.x = 0
  }
  // 使用渲染器,通過相機將場景渲染出來
  renderer.render(scene,camera)
  // 接下來渲染下一幀的時候就會調用render函數
  requestAnimationFrame(render)
}
// 先開始就渲染一下
render()

到了這里,關于Three.js--》理解光源對物體產生影響的重要性的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • WEB 3D技術 three.js 3D賀卡(3) 點光源燈光動畫效果

    WEB 3D技術 three.js 3D賀卡(3) 點光源燈光動畫效果

    經過 上文 WEB 3D技術 three.js 3D賀卡(2) 加入天空與水面效果 我們將水面 和 天空的效果搭建了一下 那么 我們將四周 點光源的效果做一下 首先 我們將 renderer.toneMappingExposure 的值 改為 0.1 讓效果看著明顯一點 這樣 整個界面就會暗下來 然后 我們在任意位置 加入代碼 創(chuàng)建一個點

    2024年01月19日
    瀏覽(106)
  • 深入探討進程間通信的重要性:理解不同的通信機制(下)

    深入探討進程間通信的重要性:理解不同的通信機制(下)

    在上一篇文章中,我們探討了進程間通信的三種常見機制:管道、消息隊列和共享內存。我們了解到,這些機制各有其特點和適用場景,可以根據實際需求選擇合適的機制進行進程間通信。然而,進程間通信并不僅限于這三種方式。 在本文中,我們將繼續(xù)探索進程間通信的知

    2024年02月10日
    瀏覽(21)
  • 深入探討進程間通信的重要性:理解不同的通信機制(上)

    深入探討進程間通信的重要性:理解不同的通信機制(上)

    在操作系統(tǒng)中,進程間通信是指不同進程之間進行信息共享、數據傳輸和消息通知等交互的過程。每個進程在創(chuàng)建時都有自己獨立的虛擬地址空間,但它們共享內核空間。因此,要實現進程間的通信,必須通過內核來進行中介,如下圖所示: 在Linux系統(tǒng)中,提供了多種進程間

    2024年02月10日
    瀏覽(25)
  • 網絡協(xié)議的重要性與應用:理解進程間通信和網絡分層結構(上)

    網絡協(xié)議的重要性與應用:理解進程間通信和網絡分層結構(上)

    進程間通信有多種方式,包括管道、消息隊列、共享內存和信號等。然而,如果不同設備上的進程需要進行通信,就只能通過網絡來實現。由于設備的多樣性,為了兼容各種設備,就需要一個統(tǒng)一通用的網絡協(xié)議。 學習網絡協(xié)議的關鍵是了解其分層結構。之前在計算機基礎專

    2024年02月08日
    瀏覽(22)
  • THREE.JS使用詳細(three.js創(chuàng)建3d物體,three.js的使用方式)

    THREE.JS使用詳細(three.js創(chuàng)建3d物體,three.js的使用方式)

    簡述:three.js封裝了WebGL的底層細節(jié),是一款運行在瀏覽器中的 3D 引擎,可以用它創(chuàng)建各種三維場景,包括了攝影機、光影、材質等各種對象,目前在Git上已經擁有90k+的star,今天用three.js來構建一個三維模型; 1、首先,在項目中需要下載threejs的相關依賴; 2、在js頁面引入使

    2024年01月23日
    瀏覽(231)
  • three.js中物體的燈光與陰影設置

    three.js中物體的燈光與陰影設置

    要讓球體的陰影照射到平面上,需要使用陰影映射技術。具體步驟如下: 在渲染器中啟用陰影: 創(chuàng)建一個平面和一個球體: 創(chuàng)建一個聚光燈: 設置球體和聚光燈的關系: 現在打開瀏覽器預覽,就可以看到球體的陰影照射到了平面上。如果想讓陰影更加自然,可以調整陰影

    2024年02月11日
    瀏覽(20)
  • Three 之 three.js (webgl)鼠標/手指通過射線移動物體的簡單整理封裝

    Three 之 three.js (webgl)鼠標/手指通過射線移動物體的簡單整理封裝

    目錄 Three 之 three.js (webgl)鼠標/手指通過射線移動物體的簡單整理封裝 一、簡單介紹 二、實現原理 三、注意事項 四、效果預覽 五、案例實現步驟 六、關鍵代碼 Three js 開發(fā)的一些知識整理,方便后期遇到類似的問題,能夠及時查閱使用。 本節(jié)介紹, three.js (webgl) 中,

    2024年02月16日
    瀏覽(97)
  • three.js實現鼠標點擊控制物體移動(帶動畫效果,位置精確)

    three.js實現鼠標點擊控制物體移動(帶動畫效果,位置精確)

    通過查閱各種資料,最終確定解決方案,動畫效果使用gsap組件庫實現,也可不用,代碼稍作修改即可。解決鼠標點擊坐標偏移問題,復制可直接運行。 完整代碼如下:

    2024年02月07日
    瀏覽(31)
  • LLMs:《A Survey on Evaluation of Large Language Models大型語言模型評估綜述》理解智能本質(具備推理能力)、AI評估的重要性(識別當前算法的局限性+設

    LLMs:《A Survey on Evaluation of Large Language Models大型語言模型評估綜述》理解智能本質(具備推理能力)、AI評估的重要性(識別當前算法的局限性+設

    LLMs:《A Survey on Evaluation of Large Language Models大型語言模型評估綜述》翻譯與解讀 導讀 :該文章首先介紹了人工智能(AI)對機器智能的專注,并探討了評估AI模型的方法。隨后,重點介紹了大語言模型(LLMs)的背景和特點,以及它們在自然語言處理、推理、生成等各類任務中

    2024年02月03日
    瀏覽(23)
  • TransformControls 是 Three.js 中的一個類,用于在網頁中進行 3D 場景中物體的交互式操作。

    TransformControls 是 Three.js 中的一個類,用于在網頁中進行 3D 場景中物體的交互式操作。

    demo案例 TransformControls 是 Three.js 中的一個類,用于在網頁中進行 3D 場景中物體的交互式操作。讓我們來詳細講解它的輸入參數、輸出、屬性和方法: 輸入參數: TransformControls 構造函數通常接受兩個參數: camera (THREE.Camera):用于渲染場景的攝像機。這個參數是必需的。

    2024年04月15日
    瀏覽(93)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包