iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
Modern Web

WebXR未來新視界:Babylon.js打造Web的VR/AR/XR體驗系列 第 8

[Day08] 透過Babylon.js的playground 瞭解構築3D 世界的基礎元素和常用種類

  • 分享至 

  • xImage
  •  

讓我們以**The Very First Step範例當開場**,先大致理解構築3D 世界的基礎概念,我們在範例中的最後一步step 5 結束時會得到的程式碼長這個樣子:

var createScene = function () {
    // This creates a basic Babylon Scene object (non-mesh)
    var scene = new BABYLON.Scene(engine);

    var camera = new BABYLON.ArcRotateCamera("camera", BABYLON.Tools.ToRadians(90), BABYLON.Tools.ToRadians(65), 10, BABYLON.Vector3.Zero(), scene);

    // This attaches the camera to the canvas
    camera.attachControl(canvas, true);

    // This creates a light, aiming 0,1,0 - to the sky (non-mesh)
    var light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0), scene);

    // Default intensity is 1. Let's dim the light a small amount
    light.intensity = 0.7;

    // Our built-in 'ground' shape.
    var ground = BABYLON.MeshBuilder.CreateGround("ground", {width: 6, height: 6}, scene);
    let groundMaterial = new BABYLON.StandardMaterial("Ground Material", scene);
    ground.material = groundMaterial;
    let groundTexture = new BABYLON.Texture(Assets.textures.checkerboard_basecolor_png.path, scene);
    groundMaterial.diffuseColor = BABYLON.Color3.Red();
    ground.material.diffuseTexture = groundTexture;

    BABYLON.ImportMeshAsync(Assets.meshes.Yeti.rootUrl + Assets.meshes.Yeti.filename, scene).then(function({meshes}){
        meshes[0].scaling = new BABYLON.Vector3(0.1, 0.1, 0.1);
    });

    return scene;
};

首先我們看到他先要createScene,這是個於電腦圖學中經典的場景圖(Scene Graph)。如果有3D 開發經驗,可能在Three.js, Unity 也看到過。因為場景圖是用來組織3D 世界物件的樹狀結構。

Engine (引擎):與瀏覽器的WebGL/WebGPU 溝通,並將 3D 場景實際畫到網頁的 <canvas> 元素上。

場景 (Scene) 則是這棵樹的根節點 (root node),他像是個巨大的片場,所有的其他物件(攝影機、燈光、3D 模型)都長在這個場景上。官網有更多場景的說明。如果要拿html來比喻,宣告 scene,就如同在開發 HTML 時宣告 <body> 標籤一樣重要。

剛剛提到場景中會有的常見物件如攝影機、燈光、3D 模型,在構築3D 世界的時候,這三項可說是組成一個場景的常見基本元素:

攝影機(Camera):我們建構3D世界非常需要攝影機來知道目前的視角在哪裡,就如同片場中的攝影機,整個片場很大但只會看到從攝影機看出去的視角、視野。常用的有:

中文名稱 英文名稱 (Babylon.js) 比喻 主要用途
通用攝影機 UniversalCamera 第一人稱主角 自由漫遊、第一人稱體驗
弧形旋轉攝影機 ArcRotateCamera 衛星、模型觀察者 3D 模型展示、產品預覽、編輯器
跟隨攝影機 FollowCamera 跟拍攝影師 第三人稱遊戲、跟隨特定物件
WebXR 攝影機 WebXRCamera 使用者的頭 VR / AR 體驗

對於初學者來說,ArcRotateCamera 是最容易上手且功能強大的攝影機,適合用來學習和搭建大多數的場景。

燈光(Light):照明與物體的明暗就靠燈光。就如同片場的燈光,有分如太陽光的平行光;或是如同一般光源的點光源。也有不同顏色的光。常見的光源有這些:

燈光類型 比喻 Babylon.js 類別 主要用途
半球光 環境光/天空光 BABYLON.HemisphericLight 基礎環境光,提亮場景
平行光 太陽光 BABYLON.DirectionalLight 模擬太陽光,產生平行陰影
點光源 燈泡 BABYLON.PointLight 模擬燈泡、火焰等點狀光源
聚光燈 手電筒 BABYLON.SpotLight 模擬手電筒、舞台燈等聚焦光源

3D 模型(Mesh):我們在場景中的所有看的見的物件就是各種3D 模型**。主流的模型大多會以多邊形建模 (Polygon Modeling)的方式建,特別是在遊戲和即時渲染領域。任何複雜的物體(比如一隻手、一輛車)都可以被簡化為由許多微小的三角形拼接而成。這些由頂點 (Vertices)邊 (Edges) 和 面 (Faces) 組成的集合,稱為網格 (Mesh)**也就是模型。

Mesh 就像演員或道具,是構成3D 世界的主體。模型有不同的形狀、材質和顏色,載入模型後,最基本、最常見的操作是變換 position (位置)、rotation (旋轉) 和 scaling (縮放),來改變大小和位置。模型的格式大多會是glTF。babylon.js 有很多內建的基礎模型,像是

中文名稱 英文名稱 創建方法
方塊/立方體 Box CreateBox
球體 Sphere CreateSphere
平面 Plane CreatePlane
地面 Ground CreateGround
圓柱體 Cylinder CreateCylinder
圓錐體 Cone CreateCylinder (將頂部直徑設為0)
環狀體 Torus CreateTorus
繩結體 TorusKnot CreateTorusKnot
線條 Lines CreateLines
虛線 DashedLines CreateDashedLines
帶狀體 Ribbon CreateRibbon
管狀體 Tube CreateTube
二十面體球 IcoSphere CreateIcoSphere
多邊形 Polygon CreatePolygon

讓我們回到程式碼再解讀一次,就能看到的宣告 scene、 camera、 light 分別對應到場景、攝影機、燈光。而**ground** 對應到內建的基礎模型(Mesh)當成了地板,並賦予他顏色和材質。最後引入雪怪這個Mesh,Vector3是指三維向量,0.1是原尺寸10%,所以是長寬高都是10%的雪怪物件出現在畫面中。

現在了解一個場景該有的樣子,就可以接續官網的教學Features


上一篇
[Day07] Babylon.js 好用嗎? 來初步認識Babylon.js吧
下一篇
[Day09] 用Babylon.js在網頁上放置模型(Feature - 單元一)
系列文
WebXR未來新視界:Babylon.js打造Web的VR/AR/XR體驗12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言