­

ThreeJS 立方體貼圖

  • 2020 年 3 月 12 日
  • 筆記

前言

什麼要貼圖?

在上一篇《ThreeJS 掏洞術》中,利用ThreeBSP完成了在『牆』上掏出『門』或『窗戶』洞的效果。但那個所謂的『牆』一點也不像,試想誰家的牆是綠色的呀,而且就算換成其他顏色也是不行的,因為色彩太單調了,實際上在我們現實世界中,物體表面的色彩通常都是豐富的。所以要讓幾何體看起來真實、精緻就需要貼圖。

其實簡單一句話形容就是:就像家裡裝修時要給大白牆貼上壁紙一樣。

那麼本文將『簡單描述』一下給立方體貼圖的過程,我之所以說『簡單描述』是因為這裡涉及的領域比較多,所以文中的內容就不做過多擴展描述了,只簡述關於《ThreeJS 立方體貼圖》的乾貨。

示例

什麼是貼圖?

貼圖學名叫做 Texture Mapping ,譯作 紋理映射、紋理貼圖、材質貼圖。

簡單說就是:把一張圖片貼到幾何體的表面上。

那麼下面開始寫程式碼!

必要操作:使用TextureLoader對象的load函數,將圖片載入為紋理對象,並使用該紋理對象創建一個MeshBasicMaterial (基本材質)。以下素材,下載可以右鍵點擊另存為。

let mesh = new THREE.Mesh(          new THREE.BoxGeometry(300, 300, 300),          new THREE.MeshBasicMaterial( {              map: new THREE.TextureLoader().load('./crate.jpg') }          )      );  scene.add(mesh);

這樣就將圖片覆蓋到了立方體的6個面上,以下是效果圖

如果你想6個面分別貼不同的圖的話也好辦,最簡單的方法是,Mesh構造函數的第二個參數,可以直接傳一個Material數組,所以我們可以創建對應6個面的MeshBasicMaterial數組,那麼現在演示如何將下面6個圖片分別貼到6個面上。

//創建紋理載入器對象  let textureLoader = new THREE.TextureLoader();  let mesh = new THREE.Mesh(      new THREE.BoxGeometry(300, 300, 300),      [          //下標0:右面材質          new THREE.MeshBasicMaterial({              map: textureLoader.load('./img/tietu_demo_5.jpg')          }),          //下標1:左面材質          new THREE.MeshBasicMaterial({              map: textureLoader.load('./img/tietu_demo_6.jpg')          }),          //下標2:上面材質          new THREE.MeshBasicMaterial({              map: textureLoader.load('./img/tietu_demo_7.jpg')          }),          //下標3:下面材質          new THREE.MeshBasicMaterial({              map: textureLoader.load('./img/tietu_demo_8.jpg')          }),          //下標4:前面材質          new THREE.MeshBasicMaterial({              map: textureLoader.load('./img/tietu_demo_9.jpg')          }),          //下標5:後面材質          new THREE.MeshBasicMaterial({              map: textureLoader.load('./img/tietu_demo_10.jpg')          }),      ]  );  scene.add(mesh);

效果如下圖:

本文到此結束,有時間會寫一篇關於UV Mapping的貼圖方式,比這個稍微複雜點,其實也很簡單,今天就先到這裡,歡迎評論,提意見!


轉發請註明本文鏈接。