【前端】threeJS學習(長期更新)

簡介?

Three.js是用JavaScript編寫的第三方庫,用于實現3D功能,基于WebGL進行封裝。

一個3D模型的建立主要由以下幾個部分組成(基本版):
?* ? ?創建場景scene--相機camera--渲染器renderer--(燈光light);
?* ? ?創建模型(geometry+material+mesh)或導入模型gltf/glb;
?* ? ?添加相機控件controls--動畫渲染循環animate;

?*? ? 其他動畫操作,可學習gasp動畫庫。

一、引入threeJS

// 引入three.js---npm install three@0.157.0 -S

import * as THREE from "three";

?二、場景、相機、渲染器

1、創建3D場景對象Scene
const scene = new THREE.Scene();
2、創建透視投影相機對象
// const camera = new THREE.PerspectiveCamera();   //正投影相機是OrthographicCamera
// 定義threejs輸出Canvas畫布的尺寸(單位:像素px)
const width = window.innerWidth; //寬度
const height = window.innerHeight; //高度
// (fov,aspect,near,far),30:視場角度, width / height:Canvas畫布, 1:近裁截面, 3000:遠裁截面
const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
//相機在Three.js三維坐標系中的位置---根據需要設置相機位置具體值
camera.position.set(292, 223, 185);
//相機觀察目標指向Threejs 3D空間中某個位置
camera.lookAt(0, 0, 0); //坐標原點---camera.lookAt(mesh.position);指向mesh對應的位置
3、創建webGL渲染器對象
//屬性:antialias是否抗鋸齒
const renderer = new THREE.WebGLRenderer();
//設置three.js渲染區域的尺寸(像素px)
renderer.setSize(width, height);
//WebGLRenderer執行渲染方法生成canvas畫布,并把相機拍照的場景在畫布上呈現
renderer.render(scene, camera);
// console.log("threeJS", THREE.Scene); //測試場景
// 獲得生成的canvas畫布(domElement就是生成的那張照片==canvas畫布==html元素)
document.body.appendChild(renderer.domElement);
// 將Canvas畫布插入到任意HTML元素中
// document.getElementById('app').appendChild(renderer.domElement);

?三、燈光及陰影

燈光:

1、PointLight:點光源,類似于燈泡,向四周發射光線的發光點。

2、SpotLight:聚光源,沿著特定方向逐漸發散,照射范圍在三維空間中構成一個圓錐體。

3、DirectionalLight:平行光,沿著特定方向發射。

4、AmbientLight:環境光,沒有特定方向,只是整體改變場景的光照明暗,無法投射陰影,均勻照射對物體明暗對比無法呈現。

5、HemisphereLight:半球光,可以很好地表現天空和地面顏色照射到物體上時的效果,不能投射陰影,對物體明暗對比比較明顯。

以點光源舉例:

const pointLight = new THREE.PointLight(0xffffff, 1.0);
pointLight.intensity = 1.0; //光照強度
// 設置光源衰減,默認2.0
pointLight.decay = 0.0; //設置光源不隨距離衰減
//點光源位置
pointLight.position.set(400, 0, 0); //點光源放在x軸上
scene.add(pointLight); //點光源添加到場景中// 點光源輔助觀察--創建一個虛擬的球形網 Mesh的輔助對象來可視化模擬光線
const pointLightHelper = new THREE.PointLightHelper(pointLight, 50);
scene.add(pointLightHelper);
陰影:

陰影的開啟需要全方位的開啟,渲染器及光源開啟陰影,模型要接受陰影,模型需開啟陰影,地面接收陰影。

// 首先渲染器開啟陰影
renderer.shadowMap.enabled = true;
renderer.shadowMapEnabled = true;// 光源開啟陰影
directionalLight.castShadow = true;
directionalLight.shadow.mapSize = new Vector2(1024, 1024);// 地板接受陰影開啟
floor.receiveShadow = true;// 模型Mesh開啟陰影
// 物體需要開啟“引起陰影”和“接收陰影”:
gltf.scene.traverse(obj => {if(obj.isMesh) {obj.castShadow = true;obj.receiveShadow = true;}
})

四、模型

一個3d模型是由物體形狀及材質組成的網格模型。

通常模型可進行自己搭建及導入模型兩個途徑:

1、模型搭建

①?Geometry 形狀

????????Geometry 通過存儲模型用到的點集和點間關系(哪些點構成一個三角形)來描述物體形狀。

② Material 材質
????????Material 其實是物體表面除了形狀以外所有可視屬性的集合,例如色彩、紋理、光滑度、透明度、反射率、折射率、發光度。

③?Mesh 模型

????????Mesh 用三角形組成的網格來描述三維模型,隨著三角形數量的增加,它的表面越來越平滑/準確。

Geometry在threejs中有提供諸如 長方體、圓柱、圓錐等基礎形狀,更為復雜的形狀需自行構建,通常可用以下形狀組成:

④ Point 點

????????Point 在三維空間中的某一個點可以用一個坐標點來表示,點的集合,可以由一組頂點坐標組成。

⑤ Line 線

????????Line 既可以直接定義線條材質,也可以通過定義兩個坐標點,來構造一條線。

⑥ Curve 曲線

????????Curve 平滑的路徑或形狀,可用來創建諸如圓弧、橢圓等形狀。

//創建一個長方體幾何對象Geometry
const geometry = new THREE.BoxGeometry(100, 100, 100);
//創建一個材質對象Material---MeshBasicMaterial不受光照影響,MeshLambertMaterial受光照影響
const material = new THREE.MeshBasicMaterial({collor: 0xff0000, //0xff0000設置材質顏色為紅色transparent: true, //開啟透明opacity: 0.5, //設置透明度
});
// 兩個參數分別為幾何體geometry、材質material
const mesh = new THREE.Mesh(geometry, material); //網格模型對象Mesh
//設置網格模型在三維空間中的位置坐標,默認是坐標原點
mesh.position.set(0, 10, 0);
// 將網格模型添加到三維場景
scene.add(mesh);/點、線、曲線創建舉例
const point1 = new THREE.Vector3(4,8,9);
const line = new THREE.Line( geometry, material, THREE.LinePieces );
const curve= new THREE.EllipseCurve(0, 0, 100, 50);	//橢圓中心坐標以及x和y方向半徑
2、模型導入

通常是使用gltf或glb格式的模型文件,可參考3D模型庫:https://sketchfab.com。

//創建GLTFLoader實例
const loader = new GLTFLoader();
//加載gltf、glb模型
loader.load("bydSA3/scene.gltf", (gltf) => {//模型加載成功后的回調函數scene.add(gltf.scene); //將模型添加到場景中},(xhr) => {//加載過程中的回調函數console.log((xhr.loaded / xhr.total)*100+"% loaded");},(error) => {//加載出錯的回調函數console.error("An error happened", error);}
);

五、相機控件

相機控件可實現鼠標的左鍵旋轉,滑動鍵縮放,右鍵平移

也可利用相機控件實現模型自轉:

//定義旋轉縮放平移相機控件
const controls = new OrbitControls(camera, renderer.domElement);
controls.autoRotate = false;
//在animate方法中更新OrbitControls
controls.update();controls.autoRotate = true; //模型自轉

六、動畫渲染

動畫渲染需要對場景進行繪制的循環,而其他很多操作都是使用動畫庫tween.js,gasp庫等

// 動畫循環
const animate = () => {//對場景進行繪制的循環requestAnimationFrame(animate);……renderer.render(scene, camera);
};
animate();

動畫庫使用舉例:

import TweenLite from "gsap";
// 參數:動畫目標、動作時間、起始狀態(已省略)、終點狀態
TweenLite.to(component1.position, 1.5, {y: 1.5,ease: Power4.easeOut,
});

X、資源教程

1、Three.js中文網教程:http://www.webgl3d.cn/

2、Three.js教j程(api文檔):https://threejs.org/docs/

3、web GL中文網:http://www.hewebgl.com/

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

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

相關文章

Linux系統--權限

大家好,上一次我們學習了關于Linux中的基礎指令,那么我們今天來繼續學習Linux的新的內容:權限。那么話不多說,我們開始今天的學習: 目錄 Linux權限 1. Linux權限的概念 2. Linux權限管理 3. ?件權限值的表??法…

論文筆記 <交通燈> <多智能體>DERLight雙重經驗回放燈機制

今天看的論文是這篇 主要提出了傳統優先級經驗回放(PER)在復雜交通場景中效率低下,使用二叉樹存儲樣本,導致大規模樣本時計算復雜度高。而且不丟棄樣本,造成存儲空間浪費。 雙重經驗池: 為了解決以上問題…

Chromium 136 編譯指南 macOS篇:環境準備與系統配置(一)

1. 引言 在瀏覽器技術的星空中,Chromium 猶如一顆最亮的明星,照亮了整個互聯網的發展軌跡。作為推動現代 Web 技術革命的核心引擎,Chromium 不僅是 Google Chrome 的技術基石,更是 Microsoft Edge、Opera、以及眾多定制瀏覽器的共…

linux機器間無密碼如何傳輸文件

1. scp傳輸時的問題 $ scp deepseek_r1_distill_qwen1.5b_content_audit_fp16_20250613_2_Q4_K_M.gguf xxx192.168.xxx:/home/xxx/pretrained_model/output The authenticity of host 192.168.xxx (192.168.xxx) cant be established. ED25519 key fingerprint is SHA256:deOs…

PySpark 使用pyarrow指定版本

背景說明 在 PySpark 3.1.3 環境中,當需要使用與集群環境不同版本的 PyArrow (如 1.0.0 版本)時,可以通過以下方法實現,而無需更改集群環境配置 完整操作說明 去pyarrowPyPI下載對應版本的whl文件后綴whl直接改成zip解壓后有兩個文件夾&am…

安卓APP投屏調試工具使用教程

安卓APP投屏調試工具使用教程 一、準備工作(一)下載ADB工具(二)配置ADB的環境變量(三)檢查是否成功安裝(四)adb核心命令說明 二、無線調試流程(一)環境要求&a…

huggingface網站里的模型和數據集

直接下載肯定是不太行,平時訪問都不容易,更別提下載東西了,但是我們可以通過國內鏡像進行快速下載。 鏡像網址: hf-mirror地址:HF-Mirror 進入網站之后,在搜索框里搜索你想下載的內容,接下來…

Node.js 路由請求方式大全解:深度剖析與工程實踐

文章目錄 🌐 Node.js 路由請求方式大全解:深度剖析與工程實踐一、📜 HTTP 請求方法全景圖🏆 核心方法深度對比HTTP 請求方法概念對比表🛠? 特殊方法應用場景 二、🎨 各方法深度解析1. GET - 數據查看器&am…

JS-實現一個鏈式調用工具庫

要求: 支持鏈式調用,如:_chain(data).map().filter().value()實現map、filter、等常用方法支持惰性求值(延遲執行、直到用到value()時才真正計算)。 鏈式調用的實現原理的關鍵點是:函數執行完以后&#x…

【人工智能數學基礎】實變函數與泛函分析

數學分析、解析幾何、高等代數、實變函數、常微分方程、近世代數、微分幾何、復變函數、點集拓撲、概率論、數理統計、數理邏輯、偏微分方程、泛函分析、動力系統、數學物理方程、數論導引、群與代數表示、微分流形、代數拓撲、代數幾何、金融數學、多元統計分析、應用隨機過程…

css3 背景色漸變

在 CSS 中,使用漸變色需要用到 gradient 屬性,而 gradient 屬性分為 線性漸變 linear-gradient 與 徑向漸變 radial-gradient。今天主要是說一下 linear-gradient 線性漸變屬性。 例如:background: linear-gradient(90deg, #e7f1fc, #f5f9fb…

將圖片合成為視頻(基于 OpenCV)

本文將介紹如何使用 Python 和 OpenCV 將一組圖像文件合成為一個視頻文件。你將學會: 使用 os 模塊遍歷文件夾中的圖像 使用 cv2.VideoWriter 寫入視頻 設置分辨率與幀率參數 對圖像尺寸進行統一處理 簡單的視頻生成應用開發 1. 所需模塊與安裝 本章需要以下 …

HanLP 使用教程:從安裝到實戰應用

HanLP 使用教程:從安裝到實戰應用 HanLP 是由hankcs開發的一款高效、多功能的中文自然語言處理(NLP)工具包,支持分詞、詞性標注、命名實體識別(NER)、依存句法分析、關鍵詞提取、文本摘要等任務。本教程將…

MySQL 分組函數全面詳解與最佳實踐

MySQL 分組函數全面詳解與最佳實踐 MySQL 分組函數(聚合函數)的核心知識、注意事項和高級應用技巧: 📊 分組函數核心列表 函數描述示例COUNT()計算行數COUNT(*)SUM()計算數值總和SUM(salary)AVG()計算平均值AVG(score)MAX()獲取…

華為OD 最小循環子數組

1. 題意 給定一個由若干整數組成的數組 nums,請檢查數組是否是由某個子數組重復循環拼接而成,請輸出這個最小的子數組。 2. 題解 利用 k m p kmp kmp中的 n e x t next next數組性質,我們可以求出 n u m s nums nums中的最長公共 前綴后綴…

FreeCAD創作參數化凹形和水波紋式雨水箅子

這種非常流行的美觀的雨水篦子是都市的寵愛,大家要多多去用。 用FC來創建參數化后,設計人員可以隨意修改參數,滿足自身的要求,調整各部件的位置,達到滿意的布局,非常快捷。 水波紋雨水篦子 凹形雨水篦子

如何用一臺服務器用dify私有部署通用的大模型應用?

dify是什么?如何用一臺服務器用dify私有部署通用的大模型應用? Dify 是一款開源的大語言模型(LLM) 應用開發平臺。它融合了后端即服務(Backend as Service)和LLMOps的理念,使開發者可以快速搭建生產級的生成式 AI 應用…

海洋捕食算法優化BP神經網絡

引言BP神經網絡因梯度下降法的固有缺陷,常出現訓練震蕩和早熟收斂。海洋捕食算法(MPA)受海洋生物覓食行為啟發,其分階段搜索策略(高速游動→自適應步長→局部開發)能有效平衡全局探索與局部開發。本文通過MPA優化BP初始權值及學習率,構建混合優化模型。 方法論2.1 MPA算…

C++/OpenCV 圖像預處理與 PaddleOCR 結合進行高效字符識別

C/OpenCV 圖像預處理與 PaddleOCR 結合進行高效字符識別 在許多實際應用場景中,直接從原始圖片中提取文字的準確率可能不盡人意。圖像中的噪聲、光照不均、角度傾斜等問題都會嚴重干擾 OCR (Optical Character Recognition) 引擎的識別效果。本文將詳細介紹如何利用…

線程的學習

1. 線程 1. 線程是一個進程內部的控制序列 2. 線程在進程內部運行,本質是在進程地址空間內運行 3. 進程:承擔分配系統資源的基本實體 線程:CPU調度的基本單位 4. 線程在進程地址空間內運行 進程訪問的大部分資源都是通過地址空間訪問的 …