從零開始學習three.js(15):一文詳解three.js中的紋理映射UV

1. UV 映射基礎概念

1.1 什么是 UV 坐標?

在三維計算機圖形學中,UV 坐標是將二維紋理映射到三維模型表面的坐標系統。UV 中的 U 和 V 分別代表2D紋理空間的水平(X)和垂直(Y)坐標軸,與三維空間中的 XYZ 坐標形成區分。

  • UV 坐標系范圍:[0,0] 到 [1,1]
  • 每個頂點對應一個UV坐標
  • 紋理采樣器通過UV值獲取紋理顏色

1.2 坐標系差異

// Three.js 中的坐標系對比
三維模型坐標:(x, y, z) ∈ [-∞, +∞]
紋理UV坐標:(u, v) ∈ [0, 1]
屏幕像素坐標:(x, y) ∈ [0, viewportSize]

2. Three.js 中的 UV 實現

2.1 Geometry 與 BufferGeometry

// 經典 Geometry 的UV設置
const geometry = new THREE.Geometry();
geometry.faceVertexUvs[0].push([new THREE.Vector2(0, 0),new THREE.Vector2(1, 0),new THREE.Vector2(0.5, 1)
]);// BufferGeometry 的UV設置
// 自定義平面幾何體
const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array([...]); // 頂點坐標
const uv = new Float32Array([0, 0, // 頂點0的UV1, 0, // 頂點1的UV1, 1, // 頂點2的UV0, 1  // 頂點3的UV
]);
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));
geometry.setAttribute('uv', new THREE.BufferAttribute(uv, 2)); // 關鍵UV設置[1,5](@ref)

2.2 內置幾何體的UV映射

映射類型特點適用場景Three.js實現
??平面映射??正交投影,無透視變形墻面、地面PlaneGeometry默認UV2
??立方體映射??6面獨立展開盒子、建筑BoxGeometry自動生成4
??球形映射??極坐標展開行星、球體SphereGeometry經線展開6
??圓柱映射??環形展開管道、柱體需手動設置UV3
2.2.1 BoxGeometry
  • 6個立方體面共享同一張紋理
  • 每個面UV范圍:[ (0,0), (1,1) ]
  • 默認沿表面均勻展開,,但可能存在接縫
2.2.2 SphereGeometry
  • 經線方向:U坐標(0到1)
  • 緯線方向:V坐標(0到1)
  • 極點處UV密度較高
  • 采用球形投影,UV 在兩極可能出現拉伸。
2.2.3 CylinderGeometry
  • 側面:U環繞圓柱,V沿高度
  • 頂部/底面:圓形UV展開

3. UV 操作實戰技巧

3.1 動態修改UV坐標

// 獲取UV屬性數組
const uvAttribute = geometry.getAttribute('uv');
const uvs = uvAttribute.array;// 修改第三個頂點的U坐標
uvs[2 * 2] = 0.75; // 索引計算:頂點索引 * 分量數 + 偏移// 必須標記更新
uvAttribute.needsUpdate = true;

3.2 紋理重復與偏移

const texture = new THREE.TextureLoader().load('tile.jpg');
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.MirroredRepeatWrapping;
texture.repeat.set(2, 3);
texture.offset.set(0.5, 0.25);

4. 高級 UV 應用

4.1 多重紋理混合

// 著色器代碼示例
varying vec2 vUv;
uniform sampler2D texture1;
uniform sampler2D texture2;void main() {vec4 texColor1 = texture2D(texture1, vUv);vec4 texColor2 = texture2D(texture2, vUv * 2.0);gl_FragColor = mix(texColor1, texColor2, 0.5);
}

4.2 UV 動畫

function animate() {requestAnimationFrame(animate);// 水平滾動紋理texture.offset.x += 0.01;// 動態修改UV坐標const uvs = geometry.attributes.uv.array;for(let i=0; i<uvs.length; i+=2){uvs[i] += Math.sin(Date.now() * 0.001) * 0.01;}geometry.attributes.uv.needsUpdate = true;
}

4.3 頂點著色器中的 UV 控制

通過自定義著色器實現復雜效果:

// 頂點著色器
varying vec2 vUv;
uniform float time;void main() {vUv = uv + vec2(time * 0.1, 0.0);gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}

4.4 法線映射與 UV 的關系

法線貼圖依賴 UV 坐標確定法線方向:

const material = new THREE.MeshStandardMaterial({normalMap: normalTexture,normalScale: new THREE.Vector2(0.5, 0.5) // 控制法線強度
});

4.5 光照烘焙與 UV

在 Blender 中烘焙光照后導出帶有uv2的模型:

// 在Three.js中啟用第二組UV
geometry.setAttribute('uv2', new THREE.BufferAttribute(uv2Array, 2));
material.aoMap = aoTexture;
material.aoMap.uvTransform = new THREE.Matrix3().fromArray(uvTransform);

5. 常見問題解決方案

5.1 紋理拉伸問題

  • 成因:UV分布不均勻

  • 解決方案:

    1. 使用更密集的幾何細分
    2. 制作UDIM紋理集
    3. 應用三平面投影

5.2 接縫處理技巧

  • 原因:UV 坐標不連續或導出時頂點 UV 重復。

  • 解決方案

  1. 在 Blender 中使用Smart UV Project重新展開。

  2. 導出時勾選Merge by Distance選項。

  3. 在 Three.js 中調整 UV 坐標:

    const uvArray = geometry.attributes.uv.array;
    for (let i = 0; i < uvArray.length; i += 2) {uvArray[i] = uvArray[i] % 1;uvArray[i + 1] = uvArray[i + 1] % 1;
    }
    geometry.attributes.uv.needsUpdate = true;
    

6. 性能優化建議

  1. 合并UV集:將多個材質的UV合并到同一紋理圖集
  2. 使用壓縮紋理格式:推薦 KTX2或者Basis Universal 格式
  3. 避免動態UV更新:靜態幾何體應凍結UV緩沖區
  4. LOD策略:根據距離切換UV細節層級

7. 調試工具推薦

  1. UV檢查材質
const debugMaterial = new THREE.MeshBasicMaterial({map: new THREE.TextureLoader().load('uv-grid.png')
});
  1. Three.js編輯器:可視化UV展開
  2. Blender + Three.js導出:專業級UV編輯流程

結語

UV映射是連接3D模型與2D紋理的核心橋梁。通過深入理解Three.js的UV實現機制,開發者可以創建更復雜的材質效果、優化渲染性能,并解決實際項目中的各種紋理映射難題。實際開發中需注意:紋理尺寸需為2的冪、不同材質類型對UV的支持差異、移動端性能優化等。建議結合WebGL著色器編程,進一步挖掘UV系統的潛力。

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

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

相關文章

代碼復用與分層

1. 代碼復用與分層 函數&#xff1a;將常用的代碼塊封裝成函數&#xff0c;提供自己或者團隊使用。 庫&#xff1a;將代碼打包成靜態或者動態庫&#xff0c;提供出來一個頭文件供自己或者團隊使用。比如stm32中的HAL庫。 框架&#xff1a;通常實現一個完整的系統性的代碼&am…

人臉真假檢測:SVM 與 ResNet18 的實戰對比

在人工智能蓬勃發展的當下&#xff0c;人臉相關技術廣泛應用于安防、金融、娛樂等諸多領域。然而&#xff0c;隨著人臉合成技術的日益成熟&#xff0c;人臉真假檢測成為保障這些應用安全的關鍵環節。本文將深入探討基于支持向量機&#xff08;SVM&#xff09;結合局部二值模式&…

類加載器, JVM類加載機制

1.類加載器 Java里有如下幾種類加載器 1.引導類加載器 負責加載支撐JVM運行的位于JRE的lib目錄下的核心類庫&#xff0c;比如rt.jar、charsets.jar等 2.擴展類加載器 負責加載支撐JVM運行的位于JRE的lib目錄下的ext擴展目錄中的JAR類包 3.應用程序類加載器 負責加載Class…

Hadoop 2.x設計理念解析

目錄 一、背景 二、整體架構 三、組件詳解 3.1 yarn 3.2 hdfs 四、計算流程 4.1 上傳資源到 HDFS 4.2 向 RM 提交作業請求 4.3 RM 調度資源啟動 AM 4.4 AM運行用戶代碼 4.5 NodeManager運行用戶代碼 4.6 資源釋放 五、設計不足 一、背景 有人可能會好奇&#xf…

串口屏調試 1.0

http://wiki.tjc1688.com 先把商家的鏈接貼過來 淘晶馳T1系列3.2寸串口屏tft液晶屏顯示屏HMI觸摸屏超12864液晶屏 這是主包的型號 打開這個玩意 有十個基本的功能區 新建工程 在界面的右邊&#xff0c;指令一定要寫在page前面&#xff0c;這里的波特率等等什么的都可以…

《設計數據密集型應用》——閱讀小記

設計數據密集型應用 這本書非常推薦看英語版&#xff0c;如果考過了CET-6就可以很輕松的閱讀這本書。 當前計算機軟件已經不是單體的時代了&#xff0c;分布式系統&#xff0c;微服務現在是服務端開發的主流&#xff0c;如果沒有讀過這本書&#xff0c;則強力建議讀這本書。 …

【SpringMVC】詳解cookie,session及實戰

目錄 1.前言 2.正文 2.1cookie與session概念 2.2返回cookie參數 2.3設置session 3.小結 1.前言 哈嘍大家好吖&#xff0c;今天繼續來給大家來分享SpringMVC的學習&#xff0c;今天主要帶來的是cookie與session的講解以及通過postman和fiddler來實戰&#xff0c;廢話不多…

令狐沖的互聯網大廠Java面試之旅

場景描繪&#xff1a;互聯網大廠Java面試 在某個陽光明媚的上午&#xff0c;令狐沖來到了風清揚所在的互聯網大廠&#xff0c;準備迎接他的Java開發工程師面試。風清揚是一位以嚴謹和深厚技術功底著稱的面試官&#xff0c;令狐沖稍顯緊張&#xff0c;但他相信自己的準備。 第…

照片to谷歌地球/奧維地圖使用指南

軟件介紹 照片to谷歌地球/奧維地圖是一款由WTSolutions開發的跨平臺圖片處理工具&#xff0c;能夠將帶有GPS信息的照片導入Google Earth&#xff08;谷歌地球&#xff09;或奧維地圖。該軟件支持Windows、Mac、iOS、Linux和Android系統&#xff0c;無需下載安裝&#xff0c;直…

客戶端建立一個連接需要占用客戶端的端口嗎

客戶端建立TCP連接時需占用本地端口&#xff0c;具體機制如下&#xff1a; 一、端口占用的必要性 四元組唯一性? TCP連接通過?源IP、源端口、目標IP、目標端口?四元組唯一標識。客戶端發起連接時&#xff0c;必須綁定本地端口以完成通信標識。 動態端口分配? 客戶端操作…

【生存技能】ubuntu 24.04 如何pip install

目錄 原因解決方案說明 在接手一個新項目需要安裝python庫時彈出了以下提示: 原因 這個報錯是因為在ubuntu中嘗試直接使用 pip 安裝 Python 包到系統環境中&#xff0c;ubuntu 系統 出于穩定性考慮禁止了這種操作 這里的kali是因為這臺機器的用戶起名叫kali,我也不知道為什么…

智能時代下,水利安全員證如何引領行業變革?

當 5G、AI、物聯網等技術深度融入水利工程&#xff0c;傳統安全管理模式正經歷顛覆性變革。在這場智能化浪潮中&#xff0c;水利安全員證扮演著怎樣的角色&#xff1f;又將如何重塑行業人才需求格局&#xff1f; 水利工程智能化轉型對安全管理提出新挑戰。無人機巡檢、智能監測…

TDengine 在智能制造中的核心價值

簡介 智能制造與數據庫技術的深度融合&#xff0c;已成為現代工業技術進步的一個重要里程碑。隨著信息技術的飛速發展&#xff0c;智能制造已經成為推動工業轉型升級的關鍵動力。在這一進程中&#xff0c;數據庫技術扮演著不可或缺的角色&#xff0c;它不僅承載著海量的生產數…

微調ModernBERT為大型語言模型打造高效“過濾器”

ModernBERT&#xff08;2024 年 12 月&#xff09;是最近發布的小型語言模型&#xff0c;由 Answer.AI、LightOn 和 HuggingFace 共同開發。它利用了現代優化技術&#xff0c;如用于 8,192 token 上下文窗口的 RoPE 和 GeGLU layers&#xff0c;在保持效率的同時提升性能。jina…

電網拓撲分析:原理與應用

在現代電力系統中&#xff0c;電網拓撲分析是一項至關重要的技術&#xff0c;它為電力系統的安全、穩定和高效運行提供了堅實的基礎。電網拓撲描述了電力系統中各元件&#xff08;如發電機、變壓器、輸電線路、負荷等&#xff09;之間的連接關系&#xff0c;通過拓撲分析&#…

OSPF案例

拓撲圖&#xff1a; 要求&#xff1a; 1&#xff0c;R5為ISP&#xff0c;其上只能配置IP地址&#xff1b;R4作為企業邊界路由器&#xff0c; 出口公網地址需要通過PPP協議獲取&#xff0c;并進行chap認證 2&#xff0c;整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b;…

2D橫板跳躍游戲筆記(查漏補缺ing...)

1.Compression&#xff08;壓縮質量&#xff09;&#xff1a;可以改為None&#xff0c;不壓縮的效果最好&#xff0c;但占用內存 2.Filter Mode&#xff08;過濾模式&#xff09;&#xff1a;可以選擇Point&#xff08;no filter&#xff09; 3.Pixels Per Unit&#xff1a;是…

MAD-TD: MODEL-AUGMENTED DATA STABILIZES HIGH UPDATE RATIO RL

ICLR 2025 spotlight paper 構建能夠在少量樣本下學習出優良策略的深度強化學習&#xff08;RL&#xff09;智能體一直是一個極具挑戰性的任務。為了提高樣本效率&#xff0c;近期的研究嘗試在每獲取一個新樣本后執行大量的梯度更新。盡管這種高更新-數據比&#xff08;UTD&am…

Dia瀏覽器:AI驅動瀏覽網頁,究竟怎么樣?(含注冊申請體驗流程)

名人說&#xff1a;博觀而約取&#xff0c;厚積而薄發。——蘇軾《稼說送張琥》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄 一、Dia瀏覽器簡介1. 什么是Dia瀏覽器2. 開發背景與公司簡介3. 與傳統瀏覽器的區別 …

SSL/TLS 證書與數字簽名:構建互聯網信任的詳解

在浩瀚的數字世界中&#xff0c;信任是安全通信的基石。當我們通過瀏覽器訪問一個 HTTPS 網站、進行在線支付&#xff0c;或者下載一個重要的軟件更新時&#xff0c;我們如何能確信自己正在與合法的、未被仿冒的對方進行交互&#xff1f;我們又如何能保證傳輸的數據沒有被中途竊…