Topics

曾經憧憬的 3D 呈現(WebGL)挑戰時期 ― 用 Three.js 和 Blender 玩玩看的分享

  • column

以前在各種網站上瀏覽時,首屏那些會動起來的物件,或是帶有縱深感的動畫,總讓我看得「哇!」一聲就被吸引。當時心想「我也想做出這樣的東西!」,於是就開始接觸 Three.js 和 Blender。

就是抱著這樣的憧憬進入 Liberogic,但老實說…… 最近的工作大多是業務系統應用程式和 Headless CMS 建置等比較務實的開發內容呢(笑)。我可沒有在酸喔~!

已經快邁入第 4 年了,現在想一邊回想當年對「會動的 Web」的憧憬,一邊輕鬆地回顧一下 WebGL 的基礎知識。

什麼是 WebGL

WebGL 是一種在網站上顯示 3D 圖形的技術,Chrome、Firefox、Safari 等所有主要瀏覽器都能運作。

過去主流是 Flash Player 等外掛程式,但在智慧型手機上很難運作,這是一個問題。

相較之下,WebGL 原生支援,因此可以說它是開啟了行動裝置時代 3D 呈現的技術。

實際動手試試看

用 Three.js 在瀏覽器中顯示 3D 內容

Three.js 是一個可使用 JavaScript輕鬆建立 3D 內容的函式庫,且可用於商業用途。

首先,作為 WebGL 的基本概念,需要 Renderer、Scene 和 Camera。

Renderer 是 Three.js 的主要物件。將 Scene 與 Camera 傳遞給 Renderer 後,位於攝影機視錐範圍內的 3D Scene 部分會以 2D 影像的形式繪製(渲染)到 canvas 上。

WebGL 的概念、Renderer、Scene、Camera 之間的關係
const scene = new THREE.Scene();

const camera = new THREE.PerspectiveCamera(
  1000, // 視野角
  window.innerWidth / window.innerHeight, // 側面
  75, // 近く
  1000 // 遠い
);
camera.position.set(0, 0, 400);

//マウスで制御
const controls = new OrbitControls(camera, document.body);

//html側の<canvas id="myCanvas"></canvas>を取得
const renderer = new THREE.WebGLRenderer({
  canvas: document.querySelector("#myCanvas"),
  antialias: true,
});

//setSize()メソッドでサイズを設定
renderer.setSize(window.innerWidth, window.innerHeight);
//背景色も変更可能
renderer.setClearColor("#000")

//htmlの<canvas id="myCanvas"></canvas>へ流し込み
document.body.appendChild(renderer.domElement);

接著,3D 立方體是使用稱為網格(Mesh)的顯示物件來建立。要建立網格,需要準備幾何體(形狀)與材質(素材)。

//ジオメトリ(立方体)
const geometry = new THREE.BoxGeometry(100, 100, 100)

//マテリアル(色)
const material = new THREE.MeshNormalMaterial
const box = new THREE.Mesh(geometry, material);
//Sceneに追加
scene.add(box);

//ライト
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(1, 1, 1);
//Sceneに追加
scene.add(light);

最後加入動畫。

周圍粒子效果的實作,這次將省略!

function animate() {
  requestAnimationFrame(animate);

  box.rotation.x += 0.005;
  box.rotation.y += 0.005;
  renderer.render(scene, camera);
}

animate()

將已設定的 camera 以及 geometry、material、light 放入 scene 後進行渲染,即可在瀏覽器中繪製出來。

顯示影片逐字稿(日文)

00:00 (直方体のジオメトリが3Dレンダリングされてブラウザに表示されている)

使用 Blender 建立 3D 模型

Blender是一套開源的整合型軟體,可免費涵蓋 3D建模、動畫、渲染、遊戲開發與影片剪輯等全部3D製作流程。僅使用 Blender 無法製作 WebGL 網站。

Blender 與 Three.js 的概念相同:先以網格物件建立形狀,再透過材質設定顏色與物質質感。接著使用燈光調整光線照射方式與陰影效果,並調整攝影機的位置與方向後進行渲染。

一邊調整面、線與點,一邊將網格物件塑形。
使用材質節點(Material Node)為物件加上顏色與紋理。

透過組合節點,可以製作漸層效果、金屬質感與發光效果,打造出逼真的材質表現。

參考:https://www.youtube.com/watch?v=DsNZzUZPhw4

在瀏覽器中以 Three.js 顯示以 Blender 製作的 3D 模型

將以 Blender 製作的 3D 模型匯出為 .glb 檔案,並匯入 Three.js 中。

從 Three.js 函式庫匯入 OrbitControls、GLTFLoader 與 DRACOLoader 等功能。

OrbitControls 是用於以滑鼠控制攝影機的工具,GLTFLoader 與 DRACOLoader 則分別用於載入 GLTF 格式的 3D 模型,以及其壓縮版本 DRACO 格式的 3D 模型。

我在瀏覽器中顯示了建模的蘋果!

不過,當我用 Three.js 將 Blender 製作的模型顯示在瀏覽器中時,因為渲染環境的差異與材質的相容性問題,顏色和質感看起來會有所不同。若要達到預期的外觀,還需要做一些調整。

顯示影片逐字稿(日文)

00:00 (Blenderで作成したりんごのモデリングをThree.jsでブラウザ表示した様子)

近來的日常案件多半是 CMS 整合與業務應用程式的前端設計/建置,我自己的工作中,接觸 3D 表現的機會已經少了許多。

但像這樣實際玩過之後,我重新感受到「果然很有趣」。

或許正是因為當年對會動的網頁的憧憬,才讓我自然而然地被現代技術所吸引。

好,今天也來聊聊 Next 和 Nuxt!

回到現場後,我會以另一種方式繼續製作會動的網頁。 🚀

關於撰寫本文的人

主要以標記(markup)為核心,並使用 JavaScript、React 與 Next.js 進行前端開發。若我參與的網站能順利上線,我會非常開心!興趣是彈吉他。喜歡貓咪和烤地瓜🐱🍠

Hirattch

前端工程師 / 2022 年入職

查看此員工的文章

我們的優勢在於穩健的團隊體制與快速的應對能力

Liberogic 由經驗豐富的資深人員積極推動專案,因此獲得客戶的高度評價。
我們會妥善指派專案經理與總監,致力於順利推進整體專案。 我們採取依據專案需求適才適所分配資源的方式,避免因全程投入而增加不必要的成本,並且在掌握業務內容、製作與提交估價方面的速度也廣受好評。

注: 本公司不積極承接類似 SES 的駐點業務等,敬請事先諒解。

可搭配 Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webex 等幾乎所有主要的專案管理工具與聊天工具使用。

歡迎諮詢您的 Web 相關問題。

案例分析