Threejs_12 物體陰影的實現

所以在Threejs的畫布世界之中,一個物體有自己的影子呢?

陰影效果的實現

你需要先知道在threejs世界中,有哪些燈光或者材質是可以產生陰影效果的

環境光沒有陰影 平行光有陰影(太陽) 點光源有陰影(燈泡) 聚光燈有陰影(手電筒) 平面光源沒有陰影(明亮的窗戶)

基礎網格材質不支持陰影 標準網格材質支持陰影 并且很逼真 代價是性能犧牲 Lambert網格材質(非光澤表面) 支持 Phong網格材質(光澤表面) 支持 ?物理網格材質 支持 比標準網格更逼真 代價是性能犧牲 MeshToon 支持

1.做一個平面,一個球體

// 做一個球體
const SphereGeometry = new THREE.SphereGeometry(1, 20, 20);
// 材質
const material = new THREE.MeshStandardMaterial({});
const sphere = new THREE.Mesh(SphereGeometry, material);
scene.add(sphere);// 創建平面
const planeGeometry = new THREE.PlaneGeometry(10, 10);
const plane = new THREE.Mesh(planeGeometry, material);
plane.position.set(0, -1, 0);
plane.rotation.x = -Math.PI / 2;
scene.add(plane);

2.添加光源

小球由于沒有光照,所以我們還看不見他,所以給他添加一個光照。添加一個環境光和一個直線光源。

// 燈光
// 環境光
const light = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(light);// 直線光源
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLight.position.set(10, 10, 10);

?

我們的平面和小球就能看到了

3.渲染器設置開啟陰影效果

我們的渲染器是默認關閉陰影效果的,主要是為了性能考慮,所以在我們需要使用陰影效果的時候需要給他開啟。

// 開啟場景中的陰影貼圖
renderer.shadowMap.enabled = true;

4.各種陰影效果開啟

在實現陰影效果的時候,所有有關的參數都是需要打開的,比如說我們需要設置平面接受陰影,然后小球開啟產生陰影,然后光源開啟產生陰影。

// 小球投射陰影
sphere.castShadow = true;// 平面接收陰影
plane.receiveShadow = true;//設置直線光源產生陰影
directionalLight.castShadow = true;

這時候,我們的陰影效果就產生了。

全部代碼

// 環境光沒有陰影 平行光有陰影(太陽) 點光源有陰影(燈泡) 聚光燈有陰影(手電筒) 平面光源沒有陰影(明亮的窗戶)// 基礎網格材質不支持陰影 標準網格材質支持陰影 并且很逼真 代價是性能犧牲 Lambert網格材質(非光澤表面) 支持 Phong網格材質(光澤表面) 支持  物理網格材質 支持 比標準網格更逼真 代價是性能犧牲 MeshToon 支持//導入 threejs
import * as THREE from "three";
//導入軌道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
//導入補時動畫庫
import * as TWEEN from "three/examples/jsm/libs/tween.module.js";// 創建場景
const scene = new THREE.Scene();// 創建相機
const camera = new THREE.PerspectiveCamera(45, // 視角window.innerWidth / window.innerHeight, // 寬高比 窗口的寬高進行設置的0.1, // 近平面   相機最近最近能看到的物體1000 // 遠平面   相機最遠能看到的物體
);//設置相機位置
camera.position.set(0, 0, 10);scene.add(camera);// 創建渲染器
const renderer = new THREE.WebGLRenderer();// 設置渲染器的大小  (窗口大小)
renderer.setSize(window.innerWidth, window.innerHeight);// 開啟場景中的陰影貼圖
renderer.shadowMap.enabled = true;// 將渲染器的dom元素添加到body中
document.body.appendChild(renderer.domElement);//設置相機的焦點 (相機看向哪個點)
camera.lookAt(0, 0, 0);//添加世界坐標輔助器  (紅色x軸,綠色y軸,藍色z軸)一個線段 參數為 線段長度
const axesHelper = new THREE.AxesHelper(5);//添加到場景之中
scene.add(axesHelper);// 添加軌道控制器 (修改偵聽位置)  一般監聽畫布的事件  不監聽document.body
const controls = new OrbitControls(camera, renderer.domElement);//渲染函數
function animate() {controls.update();//請求動畫幀requestAnimationFrame(animate);//渲染renderer.render(scene, camera);//更新補時動畫TWEEN.update();
}//渲染
animate();// 監聽窗口的變化 重新設置渲染器的大小 畫布自適應窗口
window.addEventListener("resize", () => {// 重新設置渲染器的大小renderer.setSize(window.innerWidth, window.innerHeight);// 重新設置相機的寬高比camera.aspect = window.innerWidth / window.innerHeight;// 重新計算相機的投影矩陣camera.updateProjectionMatrix();
});// 做一個球體
const SphereGeometry = new THREE.SphereGeometry(1, 20, 20);
// 材質
const material = new THREE.MeshStandardMaterial({});
const sphere = new THREE.Mesh(SphereGeometry, material);// 投射陰影
sphere.castShadow = true;scene.add(sphere);// 創建平面
const planeGeometry = new THREE.PlaneGeometry(10, 10);
const plane = new THREE.Mesh(planeGeometry, material);
plane.position.set(0, -1, 0);
plane.rotation.x = -Math.PI / 2;// 接收陰影
plane.receiveShadow = true;scene.add(plane);// 燈光
// 環境光
const light = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(light);// 直線光源
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLight.position.set(10, 10, 10);//設置直線光源產生陰影
directionalLight.castShadow = true;scene.add(directionalLight);

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

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

相關文章

GB/T 40623-2021 船用防靜電升高地板檢測

防靜電升高地板是指由地板構架、可拆地板和防靜電貼面搭建的地板。 GB/T 40623-2021 船用防靜電升高地板測試: 測試項目 測試方法 尺寸偏差與形位公差 GB/T 40623 表面處理 GB/T 40623 外觀 GB/T 40623 升高地板電性能 GB/T 40623 升高地板的載荷性能-系…

代碼隨想錄二刷 | 鏈表 |環形鏈表II

代碼隨想錄二刷 | 鏈表 |環形鏈表II 題目描述解題思路 & 代碼實現判斷鏈表是否有環如何找到環的入口 題目描述 142.環形鏈表II 給定一個鏈表的頭節點 head ,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 null。 如…

想發EI國際學術會議,但學校要求知網,這種情況該如何解決?

#學術發表# #國際會議# #知網要求# 近期后臺有私信想把論文發表在EI國際會議上,但是畢業要求又規定必須在知網上發表。看起來處境比較困難,作為一名師兄,我來分享下我的建議。 先要明確知網和EI國際會議的不同和各自的優劣: 知…

圖神經網絡:消息傳遞算法

一、說明 圖網絡-GNN(Graph Neural Networks)是近幾年研究的主題之一,雖不及深度神經網絡那么火爆,但在一些領域,如分子化學方面是不得不依賴的理論。本文就一些典型意義的圖神經網絡消息傳遞展開闡述。 二、圖網絡簡述…

Vue 3 渲染機制解密:從模板到頁面的魔法

Vue 3 渲染機制解密 前言Vue 3的響應性系統1. **Reactivity API:**2. **Proxy 對象:**3. **Getter 和 Setter:**4. **依賴追蹤:**5. **批量更新:**6. **異步更新:**7. **遞歸追蹤:**8. **刪除屬性:** 虛擬DOM的角色1. **減少直接操作真實 DOM:**2. **高效的批量更新:**3. **跨平…

【java】想要限制每次查詢的結果集不能超過10000行,該如何實現?

文章目錄 前言 前言 對于一些Saas化軟件,當某個租戶在執行查詢SQL時,如果查詢條件出現了BUG,導致去查了所有租戶的數據,這種情況是非常嚴重的,此時就需要在架構層面做限制,禁止一些特殊SQL的執行&#xff…

@PropertySource適配通配符加載到Environment的一種方案

PropertySource可將配置文件加載到內存,時間有限說干的,PropertySource注解有4個參數,其中value表示要加載文件的路徑,這個參數不支持通配符。還有一個參數PropertySourceFactory是加載配置文件的工廠,這兩個參數配合使…

【GUI】-- 13 貪吃蛇小游戲之食物及成績判斷

GUI編程 04 貪吃蛇小游戲 4.4 第四步:食物及成績判斷 首先,添加食物與分數的數據定義: //食物的坐標int foodX;int foodY;Random random new Random();//積分面板數據結構int score;在初始化方法中,添加(畫出)食物與分數&…

CSDN最新最全pytest系列——pytest-base-url插件之配置可選的項目系統UR

前言 ①當我們的自動化代碼完成之后,通常期望可以在不同的環境進行測試,此時可以將項目系統的URL單獨拿出來,并且可以通過pytest.ini配置文件和支持pytest命令行方式執行。 ② pytest-base-url 是一個簡單的pytest插件,它通過命…

紐扣電池上架TEMU、亞馬遜美國站需要做什么認證?紐扣電池認證標準16CFR1700.15,16CFR1700.20

近日,Temu連發多條賣家彈窗內容均為商品質量事故違規處理通告。其中一條為賣家銷售的車載吸塵器發生燒毀、冒煙等情況,產生用戶人傷、財損等輿情。經查實是商家偷換關鍵部件鋰電池,導致商品質量下降造成事故。TEMU對于問題車載吸塵器處理結果…

opencv 存儲bgr格式/同理可類推yuv

需求背景 開發rk3588 音視頻硬件編解碼,然后看見他的輸入文件格式。。 只能是裸的文件。不能是壓縮過的。就是不能是jpg/png這種格式,只能是以下的圖像/視頻 的存儲格式.那么我沒有這個格式的,以前hi3559的bgr格式和他要的也不太一致&#x…

設計循環隊列,解決假溢出問題

什么是假溢出? 當我們使用隊列這種基本的數據結構時,很容易發現,隨著入隊和出隊操作的不斷進行,隊列的數據區域不斷地偏向隊尾方向移動。當我們的隊尾指針指向了隊列之外的區域時,我們就不能再進行入隊操作了&#xff…

單鏈表在線OJ題二(詳解+圖解)

1.在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針 本題的意思是要刪除鏈表中重復出現的節點,然后返回刪除重復節點后的鏈表。 我們可以直接用一個哨兵位以便于觀察鏈表…

【GIT】代碼倉庫服務器變更本地修改并推送

author: jwensh date: 20231122 問題背景 沒有使用域名的 gitlb 服務器搬移(IP地址變了), 以至于 gitlab 管理的項目無法進行連接及推送。因為涉及到多個項目工程,所以可以用本地配置修改的方式來進行重新關聯(這種修…

指針變量和地址

A.指針變量和地址 理解了內存和地址的關系&#xff0c;我們再回到C語?&#xff0c;在C語?中創建變量其實就是向內存申請空間&#xff0c;比如&#xff1a; #include <stdio.h> int main() {int a 10;return 0; } ?如&#xff0c;上述的代碼就是創建了整型變量a&…

spring-boot-admin-starter-server監控springboot項目

文章目錄 場景實現具體操作展示 場景 監控三件套Prometheus、Grafana、Alertmanager 部署起來太復雜,如果公司沒有運維而且項目很小就可以使用spring-boot-admin-starter-server替代。這個包使用起來還是很簡單的, 下面就實現一個對springCloud項目的監控 實現 參考 項目 具體操…

算法通關村第十二關|青銅|字符串轉換整數

1.轉換成小寫字母 原題&#xff1a;力扣709. 字符串大寫轉小寫有現成的API使用&#xff0c;但是我們也可以自己來實現。 使用或運算進行加操作能提高效率&#xff0c;因為 32 對應的二進制表示為 00100000 &#xff0c;而大寫字母的范圍 [65, 90] 的二進制表示在 00100000 的…

經典中的經典之字符串

前言&#xff1a;前段時間發燒了&#xff0c;所以耽誤了很多事情&#xff0c;一直沒有更新&#xff0c;多穿點衣服&#xff0c;感冒不好受。 接下來有時間就會陸續更新一些基礎的算法題&#xff0c;題目都很經典&#xff0c;大家可以先嘗試著做&#xff0c;再看 解析。 第一…

Windows常用cmd網絡命令詳解

中午好&#xff0c;我的網工朋友。 上回給你們梳理了一些有趣的cmd命令&#xff0c;很多朋友希望再拓展一下&#xff0c;這不就來了&#xff1f; 今天從windows切入&#xff0c;給你分享一些常用cmd網絡命令&#xff0c;如果能熟悉上手&#xff0c;很多功能都可以快速實現&am…

Java Class 類文件格式看這一篇就夠了

本文將揭開Java Class文件的神秘面紗&#xff0c;帶你了解Class文件的內部結構&#xff0c;并從Class文件結構的視角告訴你&#xff1a; 為什么Java Class字節碼文件可以“寫一次&#xff0c;遍地跑”&#xff1f;為什么常量池的計數從1開始&#xff0c;而不是和java等絕大多數…