Topics

我所憧憬的3D表現(WebGL)時代 ― 用Three.js與Blender試玩的故事

  • column

從前,我經常瀏覽各種網站,被首屏中轉圈旋轉的物體或具有深度感的動畫所吸引,心想「哇,太厲害了!」當時我就產生了「我也想自己做出這樣的東西!」的念頭,於是開始接觸Three.jsBlender

我就是帶著這份憧憬加入Liberogic的,但從結果來說……最近我的日常工作大多是比較踏實的實作,像是業務系統應用或headless CMS構築之類的呢(笑)別誤會,我並沒有貶低啦~!

如今已進入第四年了,回想起當初對「動態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 的主要物件。將 SceneCamera 傳遞給它後,就會將相機視錐體Renderer內的 3D Scene部分作為 2D 影像渲染(繪製)到畫布上。

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 立方體部分。建立網格需要準備幾何體(形狀)和材質(素材)。

//ジオメトリ(立方体)
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 相同,都是使用網格物件建立形狀,透過材質賦予顏色和物質質感。接著透過光源調整光線照射和陰影的方式,並調整攝影機的位置和方向,最後進行渲染。

透過調整面、線和點來塑造網格物件的形狀。
使用材質節點來加入顏色和紋理。

透過組合節點,可以建立漸層、金屬質感、發光效果等逼真的質感。

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

在 Three.js 中顯示 Blender 建立的 3D 模型

將 Blender 建立的 3D 匯出為 .glb 檔案,再整合到 Three.js 中。

從 Three.js 程式庫匯入OrbitControlsGLTFLoaderDRACOLoader各項功能。

OrbitControls 是用於透過滑鼠控制攝影機的工具程式,而GLTFLoaderDRACOLoader 分別用於載入 GLTF 格式的 3D 模型和其壓縮版本 DRACO 格式的 3D 模型。

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

不過,在用 Three.js 將 Blender 建立的模型顯示在瀏覽器中時,由於渲染環境的差異和材質的相容性問題,色彩和紋理看起來會有所不同。要達到想要的外觀效果需要進行一些調整。

顯示影片文字記錄(日語)

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

日常的專案大多是 CMS 整合或業務應用的前端設計/構築,作為我個人的工作來說,接觸 3D 表現的機會反而變少了。

但是,在這樣玩耍的時候,我重新感受到「果然還是很有趣啊」。

正是因為對那時候的動態網頁懷有憧憬,或許才自然而然地被現代技術所吸引。

好吧,今天又要用 Next 和 Nuxt 了!

回到現場,繼續以另一種形式製作動態網頁。 🚀

本文作者

我主要從事標記語言、JavaScript、React 和 Next.js 的前端開發。看到自己參與的網站順利上線時最開心!興趣是彈吉他。喜歡貓咪和烤地瓜🐱🍠

Hiracchi

前端工程師 / 2022年入職

查看此員工的文章

信心十足的團隊體制與迅速的應對能力是我們的優勢

Liberogic 擁有經驗豐富的人員積極推進專案,因而獲得客戶的高度評價。
我們恰當地安排專案經理和總監,致力於順利推進整個專案。 我們避免不必要的全面投入而導致成本增加,而是採用適材適所配置資源的方式,因此在業務把握到估價制作與提交的速度上也備受好評。

請注意,我們不積極進行 SES 形式的駐場業務。

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

請諮詢我們解決您的網站問題。

案例分析