Three.js 初級教程大全

本文檔旨在為初學者提供一個全面的 Three.js 入門指南。我們將從 Three.js 的基本概念開始,逐步介紹如何創建場景、添加物體、設置材質、使用光照和相機,以及如何實現簡單的動畫和交互。通過本教程,你將能夠掌握 Three.js 的核心知識,并為進一步學習和開發復雜的 3D 應用打下堅實的基礎。

1. Three.js 簡介

Three.js 是一個基于 JavaScript 的 3D 圖形庫,它簡化了 WebGL 的使用,允許開發者使用更高級別的 API 創建和渲染 3D 場景。WebGL 本身是一個底層的圖形 API,直接操作起來比較復雜,而 Three.js 封裝了 WebGL 的許多細節,使得開發者可以更專注于場景的構建和交互邏輯。

Three.js 的主要特點:

  • 易于使用: 提供了簡潔的 API,降低了 3D 圖形開發的門檻。
  • 跨平臺: 基于 WebGL,可以在支持 WebGL 的瀏覽器上運行。
  • 豐富的特性: 支持各種 3D 模型格式、材質、光照、陰影、動畫等。
  • 活躍的社區: 擁有龐大的用戶群體和豐富的資源。

2. 環境搭建

在使用 Three.js 之前,需要先搭建開發環境。最簡單的方式是直接在 HTML 文件中引入 Three.js 的 CDN 鏈接。

<!DOCTYPE html>
<html><head><title>Three.js 教程</title><style>body {margin: 0;}canvas {display: block;}</style></head><body><script src="https://cdn.jsdelivr.net/npm/three@0.155.0/build/three.min.js"></script><script>// Three.js 代碼將在這里編寫</script></body>
</html>

也可以使用 npm 安裝 Three.js,并在項目中使用模塊化的方式引入。

npm install three
import * as THREE from 'three'
3. 基本概念

Three.js 中有幾個核心概念需要理解:

  • Scene (場景): 3D 世界的容器,所有物體、光照和相機都添加到場景中。
  • Camera (相機): 定義了觀察場景的視角。
  • Renderer (渲染器): 將場景渲染到屏幕上。
  • Geometry (幾何體): 定義了物體的形狀,例如立方體、球體等。
  • Material (材質): 定義了物體的外觀,例如顏色、紋理等。
  • Mesh (網格): 幾何體和材質的組合,是場景中實際可見的物體。
  • Light (光照): 照亮場景,影響物體的顏色和陰影。
    在這里插入圖片描述
4. 創建第一個 Three.js 場景

下面是一個簡單的 Three.js 場景,包含一個立方體:

// 1. 創建場景
const scene = new THREE.Scene()// 2. 創建相機
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
)
camera.position.z = 5// 3. 創建渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)// 4. 創建幾何體
const geometry = new THREE.BoxGeometry(1, 1, 1)// 5. 創建材質
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 })// 6. 創建網格
const cube = new THREE.Mesh(geometry, material)
scene.add(cube)// 7. 渲染循環
function animate() {requestAnimationFrame(animate)cube.rotation.x += 0.01cube.rotation.y += 0.01renderer.render(scene, camera)
}animate()

代碼解釋:

  1. 創建場景: new THREE.Scene() 創建了一個新的場景。

  2. 創建相機: new THREE.PerspectiveCamera() 創建了一個透視相機,參數分別是:

    • 75:視野角度(FOV)。
    • window.innerWidth / window.innerHeight:寬高比。
    • 0.1:近平面。
    • 1000:遠平面。
    • camera.position.z = 5 將相機沿 Z 軸移動 5 個單位,以便觀察立方體。
  3. 創建渲染器: new THREE.WebGLRenderer() 創建了一個 WebGL 渲染器。
    renderer.setSize() 設置渲染器的大小,使其與窗口大小一致。
    document.body.appendChild(renderer.domElement) 將渲染器的 DOM 元素添加到頁面中。

  4. 創建幾何體: new THREE.BoxGeometry() 創建了一個立方體幾何體,參數分別是立方體的寬度、高度和深度。

  5. 創建材質: new THREE.MeshBasicMaterial() 創建了一個基礎材質,參數是材質的顏色。

  6. 創建網格: new THREE.Mesh() 創建了一個網格,將幾何體和材質組合在一起。
    scene.add(cube) 將立方體添加到場景中。

  7. 渲染循環: animate() 函數是一個循環,不斷更新場景并渲染。
    requestAnimationFrame(animate) 請求瀏覽器在下一次重繪之前調用 animate() 函數。
    cube.rotation.x += 0.01cube.rotation.y += 0.01 使立方體沿 X 軸和 Y 軸旋轉。
    renderer.render(scene, camera) 使用相機渲染場景。

5. 幾何體

Three.js 提供了多種幾何體,例如:

  • THREE.BoxGeometry:立方體。
  • THREE.SphereGeometry:球體。
  • THREE.PlaneGeometry:平面。
  • THREE.CylinderGeometry:圓柱體。
  • THREE.TorusGeometry:圓環。

可以根據需要選擇合適的幾何體,并設置其參數。

6. 材質

Three.js 提供了多種材質,例如:

  • THREE.MeshBasicMaterial:基礎材質,不受光照影響。
  • THREE.MeshLambertMaterial:Lambert 材質,受光照影響,但沒有鏡面反射。
  • THREE.MeshPhongMaterial:Phong 材質,受光照影響,有鏡面反射。
  • THREE.MeshStandardMaterial:標準材質,基于物理的渲染 (PBR),更真實。

可以根據需要選擇合適的材質,并設置其顏色、紋理、光澤度等屬性。

7. 光照

Three.js 提供了多種光照,例如:

  • THREE.AmbientLight:環境光,照亮整個場景。
  • THREE.DirectionalLight:平行光,模擬太陽光。
  • THREE.PointLight:點光源,從一個點向四周發光。
  • THREE.SpotLight:聚光燈,從一個點向一個方向發光。

需要將光照添加到場景中,才能使物體顯示出顏色和陰影。

8. 動畫

可以使用 requestAnimationFrame() 函數創建動畫。在每一幀中,更新物體的位置、旋轉或縮放,然后重新渲染場景。

9. 交互

可以使用 JavaScript 事件監聽器來處理用戶的交互,例如鼠標點擊、鍵盤按鍵等。可以根據用戶的交互來改變場景中的物體或相機。

10. 總結

本教程介紹了 Three.js 的基本概念和使用方法。通過學習本教程,你應該能夠創建簡單的 3D 場景,并實現簡單的動畫和交互。要深入學習 Three.js,可以參考官方文檔、示例代碼和社區資源。祝你學習愉快!

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

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

相關文章

遙感領域解決方案丨高光譜、無人機多光譜、空天地數據識別與計算

一&#xff1a;AI智慧高光譜遙感實戰&#xff1a;手撕99個案例項目、全覆蓋技術鏈與應用場景一站式提升方案在遙感技術飛速發展的今天&#xff0c;高光譜數據以其獨特的光譜分辨率成為環境監測、精準農業、地質勘探等領域的核心數據源。然而&#xff0c;海量的波段數據、復雜的…

(LeetCode 面試經典 150 題) 114. 二叉樹展開為鏈表 (深度優先搜索dfs+鏈表)

題目&#xff1a;114. 二叉樹展開為鏈表 思路&#xff1a;深度優先搜索dfs鏈表&#xff0c;時間復雜度0(n)。 C版本&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : …

《線程狀態轉換深度解析:從阻塞到就緒的底層原理》

目錄 一、線程的五種基本狀態 二、線程從 RUNNABLE 進入阻塞 / 等待狀態的三種典型場景 1. 調用sleep(long millis)&#xff1a;進入 TIMED_WAITING 狀態 2. 調用wait()&#xff1a;進入 WAITING/TIMED_WAITING 狀態 3. 等待 I/O 資源或獲取鎖失敗&#xff1a;進入 BLOCKE…

面經整理-猿輔導-內容服務后端-java實習

部門管理系統設計 題目要求 設計部門 MySQL 數據表實現接口&#xff1a;根據中間部門 ID 獲取其下屬葉子部門 ID設計包含子節點列表的 Java 數據對象&#xff0c;并實現批量獲取功能 一、MySQL 部門表設計 表結構 CREATE TABLE department (id BIGINT PRIMARY KEY AUTO_INCREME…

Openharmony之window_manager子系統源碼、需求定制詳解

1. 模塊概述 Window Manager 模塊是 OpenHarmony 操作系統的核心窗口管理系統,負責窗口的創建、銷毀、布局、焦點管理、動畫效果以及與硬件顯示的交互。該模塊采用客戶端-服務端架構,提供完整的窗口生命周期管理和用戶界面交互支持。 1.1架構總覽 Window Manager Client 應…

《CDN加速的安全隱患與解決辦法:如何構建更安全的網絡加速體系》

CDN&#xff08;內容分發網絡&#xff09;作為提升網站訪問速度的關鍵技術&#xff0c;被廣泛應用于各類互聯網服務中。然而&#xff0c;在享受加速優勢的同時&#xff0c;CDN也面臨諸多安全隱患。本文將解析常見的CDN安全問題&#xff0c;并提供實用的解決辦法&#xff0c;幫助…

【Linux指南】GCC/G++編譯器:庖丁解牛——從源碼到可執行文件的奇幻之旅

不只是簡單的 gcc hello.c 每一位Linux C/C++開發者敲下的第一行編譯命令,幾乎都是 gcc hello.c -o hello 或 g++ hello.cpp -o hello。這像一句神奇的咒語,將人類可讀的源代碼變成了機器可執行的二進制文件。但在這條簡單的命令背后,隱藏著一個如同精密鐘表般復雜的多步流…

地區電影市場分析:用Python爬蟲抓取貓眼_燈塔專業版各地區票房

在當今高度數據驅動的影視行業&#xff0c;精準把握地區票房表現是制片方、宣發團隊和影院經理做出關鍵決策的基礎。一部電影在北上廣深的表現與二三線城市有何差異&#xff1f;哪種類型的電影在特定區域更受歡迎&#xff1f;回答這些問題&#xff0c;不能再依賴“拍腦袋”和經…

Spark03-RDD02-常用的Action算子

一、常用的Action算子 1-1、countByKey算子 作用&#xff1a;統計key出現的次數&#xff0c;一般適用于K-V型的RDD。 【注意】&#xff1a; 1、collect()是RDD的算子&#xff0c;此時的Action算子&#xff0c;沒有生成新的RDD&#xff0c;所以&#xff0c;沒有collect()&…

[Android] 顯示的內容被導航欄這擋住

上圖中彈出的對話框的按鈕“Cancel/Save”被導航欄遮擋了部分顯示&#xff0c;影響了使用。Root cause: Android 應用的主題是 Theme.AppCompat.Light1. 修改 AndroidManifest.xml 將 application 標簽的 android:theme 屬性指向新的自定義主題&#xff1a;<applicationandr…

分貝單位全指南:從 dB 到 dBm、dBc

引言在射頻、音頻和通信工程中&#xff0c;我們經常會在示波器、頻譜儀或測試報告里看到各種各樣的dB單位&#xff0c;比如 dBm、dBc、dBV、dBFS 等。它們看起來都帶個 dB&#xff0c;實則各有不同的定義和參考基準&#xff1a;有的表示相對功率&#xff0c;有的表示電壓電平&a…

怎么確定mysql 鏈接成功了呢?

asyncio.run(test_connection()) ? Connection failed: cryptography package is required for sha256_password or caching_sha2_password auth methods 根據你提供的錯誤信息,問題出現在 MySQL 的認證插件和加密連接配置上。以下是幾種解決方法: 1. 安裝 cryptography 包…

(5)軟件包管理器 yum | Vim 編輯器 | Vim 文本批量化操作 | 配置 Vim

Ⅰ . Linux 軟件包管理器 yum01 安裝軟件在 Linux 下安裝軟件并不像 Windows 下那么方便&#xff0c;最通常的方式是去下載程序的源代碼并進行編譯&#xff0c;從而得到可執行程序。正是因為太麻煩&#xff0c;所以有些人就把一些常用的軟件提前編譯好并做成軟件包&#xff0c;…

VGG改進(3):基于Cross Attention的VGG16增強方案

第一部分&#xff1a;交叉注意力機制解析1.1 注意力機制基礎注意力機制的核心思想是模擬人類的選擇性注意力——在處理信息時&#xff0c;對重要部分分配更多"注意力"。在神經網絡中&#xff0c;這意味著模型可以學習動態地加權輸入的不同部分。傳統的自注意力(Self-…

代理ip平臺哪家好?專業代理IP服務商測評排行推薦

隨著互聯網的深度發展&#xff0c;通過網絡來獲取全球化的信息資源&#xff0c;已成為企業與機構在競爭中保持優勢的一大舉措。但想要獲取其他地區的信息&#xff0c;可能需要我們通過代理IP來實現。代理IP平臺哪家好&#xff1f;下文就讓我們從IP池資源與技術優勢等細節&#…

PWA》》以京東為例安裝到PC端

如果訪問 瀏覽器右側出現 安裝 或 點擊這個 也可以完成安裝桌面 會出現 如下圖標

Linux系統:C語言進程間通信信號(Signal)

1. 引言&#xff1a;從"中斷"到"信號"想象一下&#xff0c;你正在書房專心致志地寫代碼&#xff0c;這時廚房的水燒開了&#xff0c;鳴笛聲大作。你會怎么做&#xff1f;你會暫停&#xff08;Interrupt&#xff09; 手頭的工作&#xff0c;跑去廚房關掉燒水…

LoRa 網關組網方案(二)

LoRa 網關組網方案 現有需求&#xff1a;網關每6秒接收不同節點的數據&#xff0c;使用SX1262芯片。 以下是完整的組網方案&#xff1a;1. 網絡架構設計 采用星型拓撲&#xff1a; 網關&#xff1a;作為中心節點&#xff0c;持續監聽多個信道節點&#xff1a;分布在網關周圍&am…

服裝外貿系統軟件怎么用才高效防風險?

服裝外貿系統軟件概述 服裝外貿系統軟件&#xff0c;如“艾格文ERP”&#xff0c;是現代外貿企業不可或缺的管理工具。它整合了訂單處理、庫存管理、客戶資源保護、財務控制等多功能模塊&#xff0c;旨在全面提升業務運營效率。通過系統化的管理方式&#xff0c;艾格文ERP能夠從…

【沉浸式解決問題】peewee.ImproperlyConfigured: MySQL driver not installed!

目錄一、問題描述二、原因分析三、解決方案? 推薦&#xff1a;安裝 pymysql&#xff08;純 Python&#xff0c;跨平臺&#xff0c;安裝簡單&#xff09;? 可選&#xff1a;安裝 mysqlclient&#xff08;更快&#xff0c;但需要本地編譯環境&#xff09;? 總結四、mysql-conn…