從前,我經常瀏覽各種網站,被首屏中轉圈旋轉的物體或具有深度感的動畫所吸引,心想「哇,太厲害了!」當時我就產生了「我也想自己做出這樣的東西!」的念頭,於是開始接觸Three.js和Blender。
我就是帶著這份憧憬加入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 的主要物件。將 Scene 和 Camera 傳遞給它後,就會將相機視錐體Renderer內的 3D Scene部分作為 2D 影像渲染(繪製)到畫布上。
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 經過渲染後,就會在瀏覽器中顯示。
顯示影片文字記錄(日語)
(直方体のジオメトリが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 程式庫匯入OrbitControls、GLTFLoader 和DRACOLoader各項功能。
OrbitControls 是用於透過滑鼠控制攝影機的工具程式,而GLTFLoader 和DRACOLoader 分別用於載入 GLTF 格式的 3D 模型和其壓縮版本 DRACO 格式的 3D 模型。
在瀏覽器中顯示了建模的蘋果!
不過,在用 Three.js 將 Blender 建立的模型顯示在瀏覽器中時,由於渲染環境的差異和材質的相容性問題,色彩和紋理看起來會有所不同。要達到想要的外觀效果需要進行一些調整。
顯示影片文字記錄(日語)
(Blenderで作成したりんごのモデリングをThree.jsでブラウザ表示した様子)
日常的專案大多是 CMS 整合或業務應用的前端設計/構築,作為我個人的工作來說,接觸 3D 表現的機會反而變少了。
但是,在這樣玩耍的時候,我重新感受到「果然還是很有趣啊」。
正是因為對那時候的動態網頁懷有憧憬,或許才自然而然地被現代技術所吸引。
好吧,今天又要用 Next 和 Nuxt 了!
回到現場,繼續以另一種形式製作動態網頁。 🚀
我主要從事標記語言、JavaScript、React 和 Next.js 的前端開發。看到自己參與的網站順利上線時最開心!興趣是彈吉他。喜歡貓咪和烤地瓜🐱🍠
Hiracchi
前端工程師 / 2022年入職