Three.js 進階(燈光陰影關系和設置、平行光、陰影相機)

本篇主要學習內容 :

  1. 燈光與陰影
  2. 聚光燈
  3. 點光源
  4. 平行光
  5. 陰影相機和陰影計算
  6. 投射陰影接受陰影

點贊 + 關注 + 收藏 = 學會了

1.燈光與陰影

1、材質要滿足能夠對光有反應

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

3、設置光照投射陰影 directionalLight.castShadow = true

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

5、設置物體接受陰影 plane.receiveShadow = true

常見光源如下,入門時學習環境光和點光源:

請添加圖片描述

2.聚光燈

SpotLight聚光源可以認為是一個沿著特定方向逐漸發散的光源,照射范圍在三維空間中構成一個圓錐體。
請添加圖片描述

const spotLight = new THREE.SpotLight('#ffffff', 0.5)
spotLight.position.set(5, 5, 5)
spotLight.castShadow = true
spotLight.intensity = 2
// 設置陰影模糊度
spotLight.shadow.radius = 20
// 設置陰影貼圖的分辨率
spotLight.shadow.mapSize.set(4096, 4096) //1024倍數
spotLight.target = sphere
spotLight.angle = Math.PI / 6
// 從光源發出光最大距離的衰減程度
spotLight.distance = 0
// 半影衰減百分比0-1
spotLight.penumbra = 0
// 沿著光照距離的衰減程度
spotLight.decay = 0

3. 點光源

PointLight可以類比為一個發光點,就像生活中一個燈泡以燈泡為中心向四周發射光線。

請添加圖片描述

const pointLight = new THREE.PointLight('red', 0.5)
pointLight.position.set(2, 2, 2)
pointLight.castShadow = true
// 設置陰影模糊度
pointLight.shadow.radius = 20
// 設置陰影貼圖的分辨率
pointLight.shadow.mapSize.set(4096, 4096) //1024倍數
// 從光源發出光最大距離的衰減程度
pointLight.distance = 0
// 半影衰減百分比0-1
pointLight.penumbra = 0
// 沿著光照距離的衰減程度
pointLight.decay = 0

4. 平行光

DirectionalLight沿特定方向發射,自定義光源位置

請添加圖片描述

const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5)
directionalLight.position.set(5, 5, 5)
directionalLight.castShadow = true
// 設置陰影模糊度
directionalLight.shadow.radius = 20
// 設置陰影貼圖的分辨率
directionalLight.shadow.mapSize.set(2048, 2048) //1024倍數
// 設置平行光頭攝像機屬性
directionalLight.shadow.camera.near = 0.5 //近平面距離
directionalLight.shadow.camera.far = 500 //遠平面距離
directionalLight.shadow.camera.top = 5 //Y軸正方向上的邊界
directionalLight.shadow.camera.bottom = -5 //Y軸下方向上的邊界
directionalLight.shadow.camera.left = -5 //X軸負方向上的邊界
directionalLight.shadow.camera.right = 5 //X軸正方向上的邊界

請添加圖片描述

5.陰影相機

5.1)設置相機.shadow.camera長方體范圍

根據3D場景渲染范圍,去設置.shadow.camera長方體尺寸參數,一般比你要渲染的范圍稍微大一些即可,過小陰影不顯示或顯示不完整,過大很多可能陰影偏模糊,你可以比較下面兩個參數的陰影渲染差異。

directionalLight.shadow.camera.left = -50*10;
directionalLight.shadow.camera.right = 50*10;
directionalLight.shadow.camera.left = -50*100;
directionalLight.shadow.camera.right = 50*100;
5.2) 調節光源位置

光源位置影響平行光陰影相機.shadow.camera的位置,所以要根據渲染范圍調整光源的位置。

你可以比較測試兩個不同的光源位置,對應陰影渲染效果。

directionalLight.position.set(100, 60, 50);
directionalLight.position.set(100*2, 60*2, 50*2);
5.3) 確定陰影計算范圍

其實平行光陰影范圍的設置,你可以類比以前正投影機位置、長方體可視化空間的設置。

  • 1.先大概確定下3D場景中需要陰影計算范圍,不用精確,有一個數量級就行,比如幾百、幾千。
  • 2..shadow.camera.left.right.top.bottom.near.far屬性定義的長方體空間
  • 3..shadow.camera的位置(光源位置影響.shadow.camera的位置)

需要陰影范圍數量級:z方向尺寸1000左右,xy方向100左右。

for (let i = -3; i < 4; i++) {const mesh2 = mesh.clone();// 設置產生投影的網格模型mesh2.castShadow = true;mesh2.position.z = 100 * i;group.add(mesh2);
}
5.4) 根據尺寸數量級設置陰影渲染范圍

比如光線是從斜上方照射下來,模型y方向高度100左右,這時候y可以設置為100左右,xz也可以根據渲染范圍先給個大概尺寸。

directionalLight.position.set(100, 100, 100);
// 平行光默認從.position指向坐標原點

光線方向,你可以改變xz坐標來調整

directionalLight.position.set(-100, 100, -100);

渲染范圍可以都先給個幾百量級的值,不用精準,先設置,在微調。

// 設置三維場景計算陰影的范圍
directionalLight.shadow.camera.left = -100;
directionalLight.shadow.camera.right = 100;
directionalLight.shadow.camera.top = 100;
directionalLight.shadow.camera.bottom = -100;
directionalLight.shadow.camera.near = 0.5;
directionalLight.shadow.camera.far = 100;

6. 投射陰影接受陰影

6.1)開啟場景陰影貼圖
renderer.shadowMap.enabled = true
document.body.appendChild(renderer.domElement)
6.2)設置光照投射陰影
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5)
directionalLight.position.set(5, 5, 5)
directionalLight.castShadow = true
6.3)接受投射陰影
// 定義一個球  幾何體 材質  缺一不可!!!!
let sphereGeometry = new THREE.SphereGeometry(1, 20, 20)
let material = new THREE.MeshStandardMaterial()
let sphere = new THREE.Mesh(sphereGeometry, material)
//投射陰影
sphere.castShadow = true
console.log(sphere, 'sphere')
scene.add(sphere)

感謝:b站up主:老陳打碼 以及 threejs中文網 教學及參考文檔
到此threejs進階學習結束,道阻且長,行則將至。與諸君共勉。 ??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71959.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71959.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71959.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【 <一> 煉丹初探:JavaWeb 的起源與基礎】之 Tomcat 的工作原理:從啟動到請求處理的流程

<前文回顧> 點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、Tomcat…

【GPT入門】第11課 FunctionCall調用本地代碼入門

【GPT入門】第11課 FunctionCall調用代碼入門 1. 手撕FunctionCall2.代碼3.functionCall的結果 1. 手撕FunctionCall 為了了解&#xff0c;funcationCall底層&#xff0c;手寫一個functionCall多方法&#xff0c;并調用&#xff0c;體驗 思路&#xff1a; 任務&#xff1a;讓…

MySQL主從架構配合ShardingJdbc實現讀寫分離

文章目錄 目錄架構搭建讀寫分離pom.xmlfdy-live-user-provider 模塊application.ymlfdy-db-sharding.yamlShardingJdbcDatasourceAutoInitConnectionConfig.java 目錄 架構搭建 基于Docker去創建MySQL的主從架構 讀寫分離 pom.xml <dependency><groupId>mysql…

計網面試準備

正確理解網絡數據傳輸過程 同一路由器的不同接口屬于不同局域網&#xff0c;廣播只能在同一個局域網

NLP常見任務專題介紹(1)-關系抽取(Relation Extraction, RE)任務訓練模板

?? 關系抽取(Relation Extraction, RE)任務訓練示例 本示例展示如何訓練一個關系抽取模型,以識別兩個實體之間的關系。 1?? 任務描述 目標:從文本中提取兩個實體之間的語義關系,例如 “人物 - 組織”、“藥物 - 疾病”、“公司 - 創始人” 等。輸入:句子 + 標注的實…

【技術白皮書】內功心法 | 第二部分 | Telnet遠程登錄的工作原理

遠程登錄的工作原理 背景介紹遠程登錄遠程登錄的服務模式遠程登錄服務的實現基礎遠程登錄服務的運行模式Telnet服務為什么不被操作系統管理 Telnet協議的原理網絡虛終端&#xff08;NVT&#xff09;結束標示NVT的原理NVT屏蔽差異 背景介紹 絕大多數計算機都是運行多用戶操作系…

在 Spring Boot 中實現基于 TraceId 的日志鏈路追蹤

1 前言 1.1 什么是 TraceId? TraceId 是一個唯一的標識符,用于跟蹤分布式系統中的請求。每個請求從客戶端發起到服務端處理,再到可能的多個微服務調用,都會攜帶這個 TraceId,以便在整個請求鏈路中進行追蹤和調試。 1.2 日志鏈路追蹤的意義 日志鏈路追蹤可以幫助開發者…

游戲引擎學習第150天

回顧與當天計劃 我們在這里完全不使用任何庫&#xff0c;所以我們完全是引擎和庫免疫的, 正如大家所知道的&#xff0c;我們正在編寫自己的資源處理系統&#xff0c;準確來說&#xff0c;是一個資源加載系統。過去一周我們已經完成了很多工作&#xff0c;現在只剩下最后幾步&a…

Flutter中stream學習

Flutter中stream學習 概述Stream的基礎概念stream的常用方法Stream.fromFuture(Future<T> future)Stream.fromFutures(Iterable<Future<T>> futures)Stream.fromIterable(Iterable<T> elements)Stream.periodic(Duration period, [T computation(int c…

基于javaweb的SSM房屋租賃管理系統設計和實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論…

物聯網商業模式

物聯網商業模式是一種戰略規劃&#xff0c;它融合了物聯網技術來創造價值并獲取收入。它與傳統商業模式的不同之處在于&#xff0c;它利用互聯設備來改善運營、提升客戶體驗以及優化服務項目。在當今由科技驅動的世界中&#xff0c;這種商業模式通過利用實時數據來提供創新服務…

從0開始的操作系統手搓教程45——實現exec

目錄 建立抽象 實現加載 實現sys_execv &#xff01;&#xff01;&#xff01;提示&#xff1a;因為實現問題沒有測試。所以更像是筆記&#xff01; exec 函數的作用是用新的可執行文件替換當前進程的程序體。具體來說&#xff0c;exec 會將當前正在運行的用戶進程的進程體&…

【python爬蟲】酷狗音樂爬取練習

注意&#xff1a;本次爬取的音樂僅有1分鐘試聽&#xff0c;僅作學習爬蟲的原理&#xff0c;完整音樂需要自行下載客戶端。 一、 初步分析 登陸酷狗音樂后隨機選取一首歌&#xff0c;在請求里發現一段mp3文件&#xff0c;復制網址&#xff0c;確實是我們需要的url。 復制音頻的…

Linux開發工具----vim

目錄 Linux編輯器-vim使用 1. vim的基本概念 正常/普通/命令模式(Normal mode) 插入模式(Insert mode) 底行模式(last line mode) 2. vim的基本操作 3. vim正常模式命令集 4. vim底行模式命令集 5. vim操作總結 (本篇文章相當于vim常用命令字典) Linux編輯器-vim使用 我們先來看…

基于云函數的自習室預約微信小程序+LW示例參考

全階段全種類學習資源&#xff0c;內涵少兒、小學、初中、高中、大學、專升本、考研、四六級、建造師、法考、網賺技巧、畢業設計等&#xff0c;持續更新~ 文章目錄 [TOC](文章目錄) 1.項目介紹2.項目部署3.項目部分截圖4.獲取方式 1.項目介紹 技術棧工具&#xff1a;云數據庫…

卷積神經網絡與計算機視覺:從數學基礎到實戰應用

卷積神經網絡與計算機視覺&#xff1a;從數學基礎到實戰應用 摘要 本文深入解析卷積神經網絡&#xff08;CNN&#xff09;的核心原理及其在計算機視覺中的應用。首先介紹卷積與互相關的數學定義及在神經網絡中的實際應用差異&#xff0c;接著從系統設計視角分析卷積的線性代數…

從Manus到OpenManus:多智能體協作框架如何重構AI生產力?

文章目錄 Manus&#xff1a;封閉生態下的通用AI智能體OpenManus&#xff1a;開源社區的閃速復刻挑戰與未來&#xff1a;框架落地的現實邊界當前局限性未來演進方向 OpenManus使用指南1. 環境配置2. 參數配置3. 替換搜索引擎4. 運行效果 協作框架開啟AI生產力革命 Manus&#xf…

js 使用 Web Workers 來實現一個精確的倒計時,即使ios手機鎖屏或頁面進入后臺,倒計時也不會暫停。

## 效果如上 <!-- 將 main.js 和 worker.js 放在同一個目錄下&#xff0c;然后在 HTML 文件中引入 main.js --><!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&q…

深入理解 Linux 中的 -h 選項:讓命令輸出更“人性化”

在 Linux 系統中&#xff0c;命令行工具是系統管理員和普通用戶最常用的交互方式之一。然而&#xff0c;命令行輸出往往充滿了技術性術語和數字&#xff0c;對于初學者或非技術用戶來說可能顯得晦澀難懂。幸運的是&#xff0c;許多 Linux 命令都提供了一個非常實用的選項&#…

Docker Compose國內鏡像一鍵部署dify

克隆代碼 git clone https://github.com/langgenius/dify.git進入docker目錄 cd docker修改.env部分 # 將環境模版文件變量重命名 cp .env.example .env # 修改 .env,修改nginx的host和端口,避免端口沖突 NGINX_SERVER_NAME192.168.1.223 NGINX_PORT1880 NGINX_SSL_PORT1443…