超越 Three.js? Babylon.js 將成為構(gòu)建元宇宙重要工具?

哈嘍,大家好 我是xy???????。構(gòu)建 3D 場景,也許大家第一個想到的可能是 Threejs, 那么今天就來給大家推薦另外一個庫,Babylon.js , 它將會變成構(gòu)建元宇宙重要工具之一



上圖就是官方的案例之一,是不是很炫酷,以下就來給大家簡單介紹下 Babylon.js 的使用

babylon.js 是什么?
Babylon.js 是一個非常簡單的 JavaScript API,微軟旗下 WebGL 框架, 對所有開發(fā)人員都非常友好,它的意義就是簡化開發(fā)流程,讓更多 Web 開發(fā)者能夠在自己的應用程序中利用 GPU 資源。用于構(gòu)建 HTML5,WebGL,WebVR 和 Web Audio 的 3D 游戲和體驗. 除了游戲, 用來在頁面實現(xiàn)一些 3D 場景也是沒問題的

安裝 Babylon.js
npm install --save babylonjs
這將安裝 babylonjs 的 javascript 文件,還將包含 TypeScript 聲明文件。

要在 ts 文件中聲明,請使用:

import * as BABYLON from 'babylonjs';
創(chuàng)建場景
 <script>
  // 創(chuàng)建畫布
 var canvas = document.getElementById("show1");
  // 創(chuàng)建渲染引擎
 var engine = new BABYLON.Engine(canvas, true);
  // 創(chuàng)建一個場景并返回
 var create_scene = function(){

 var scene = new BABYLON.Scene(engine);
 /* 創(chuàng)建一個弧形旋轉(zhuǎn)攝像機. 參數(shù)說明如下:
 * "Camera": 攝像機名稱
 * 第一個 Math.PI / 2 : alpha, 可以理解為水平角度.具體請看文檔
 * 第二個 Math.PI / 2 : beta, 可以理解為垂直角度.具體請看文檔
 * 2: radius, 這個是半徑的意思.
 * new BABYLON.Vector3(0, 0, 5) : target position.目標點的三維位置,可以理解為中心.這是一個向量類的實例
 * scene: scene,場景變量.
 * 詳細文檔請看這里: 看著圖比較好理解的.https://doc.babylonjs.com/babylon101/cameras#arc-rotate-camera
 */

 var camera = new BABYLON.ArcRotateCamera("Camera", Math.PI / 2, Math.PI / 2, 2, new BABYLON.Vector3(0, 0, 5), scene);

 /* 讓攝像機控制畫布.
 * canvas: element 是一個dom對象.
 * true: noPreventDefault 是否阻止元素的默認事件.
 * api: https://doc.babylonjs.com/api/classes/babylon.targetcamera
 */

 camera.attachControl(canvas, true);

 /* 創(chuàng)建2個光源. HemisphericLight是半球形光源.PointLight是點光源.
 * 第一個參數(shù): name. 名字.
 * 第二個參數(shù): direction, 方向,是一個向量的實例.
 * 第三個參數(shù): scene, 場景.
 * api: https://doc.babylonjs.com/api/classes/babylon.hemisphericlight#constructor
 */

 var light1 = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(1, 1, 0), scene);
 var light2 = new BABYLON.PointLight("light3", new BABYLON.Vector3(0, 1, -1), scene);

 /* 創(chuàng)建一個球形的控制網(wǎng)格. options參數(shù),請看api
 * 第一個參數(shù) name: 字符串, 名字
 * 第二個參數(shù) options: object, 參數(shù)對象.
 * 第三個參數(shù) scene: 場景
 * api: https://doc.babylonjs.com/api/classes/babylon.meshbuilder#createsphere
 */

 var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", {diameter: 2}, scene);
 return scene;
 };

 var scene = create_scene();

 /* 不停的渲染場景.
 * runRenderLoop 是一個渲染循環(huán).
 * api: https://doc.babylonjs.com/api/classes/babylon.engine#runrenderloop
 */

 engine.runRenderLoop(function(){
 scene.render();   // 渲染場景


 });
 window.addEventListener("resize", function(){
 engine.resize();
 });

 </script>
渲染效果展示:



創(chuàng)建基礎模型
1.MeshBuilder 方法
創(chuàng)建模型的方法一般是:

var shape = BABYLON.MeshBuilder.Create Shape(名稱,配置項,場景);
配置項的參數(shù)允許你設置形狀大小以及是否可以更新它之類的操作。

2.創(chuàng)建立方體
創(chuàng)建一個默認的立方體

var box = BABYLON.MeshBuilder.CreateBox("box", {}, scene);





創(chuàng)建一個帶有配置項的立方體

var myBox = BABYLON.MeshBuilder.CreateBox("myBox", {height: 5, width: 2, depth: 0.5}, scene);
size (number)每個邊的長度
height (number)立方體的高度
width (number)立方體的寬度
depth (number)立方體的深度
faceColors (Color4[])六個顏色對象組成的數(shù)組,每個顏色代表一個面的顯示顏色 每個面默認 Color(1,1,1,1)
faceUV (Vector4[]) 由六個四維向量組成的數(shù)組,每個代表一個面的 uv 映射 每個面的 uv 映射從 0,0 到 1,1
updatable (boolean)如果網(wǎng)格是可更新的,則設置為 true false
sideOrientation (number)面的顯示方向 DEFAULTSIDE
3.創(chuàng)建球體
var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", {}, scene); //默認的球體
創(chuàng)建一個設置配置項的球體

var mySphere = BABYLON.MeshBuilder.CreateSphere("mySphere", {diameter: 2}, scene);
segments (number)水平的分段數(shù)
diameter (number)球體的直徑
diameterX (number)X 軸上的球的直徑 diameter
diameterY (number) Y 軸上的直徑 diameter
diameterZ (number)Z 軸上的直徑 diameter
arc (number)沿緯度線顯示區(qū)域 值介于 0 到 1 1
slice (number)沿經(jīng)度繪制顯示 值介于 0 到 1 1
updatable (boolean)如果網(wǎng)格是可更新的,則設置為 true false
sideOrientation (number)面的顯示方向 DEFAULTSIDE
4.創(chuàng)建平面
var plane = BABYLON.MeshBuilder.CreatePlane("plane", {}, scene);
創(chuàng)建一個帶有配置項的平面

var myPlane = BABYLON.MeshBuilder.CreatePlane("myPlane", {width: 5, height: 2}, scene);
size (number)平面每個邊的長度
height (number)平面的高度
width (number)平面的寬度
updatable (boolean)如果網(wǎng)格是可更新的,則設置為 true false
sideOrientation (number)面的顯示方向 DEFAULTSIDE
frontUVs (Vector4[])正面 UV 映射,只有在 sideOrientation 設置為雙面(BABYLON.Mesh.DOUBLESIDE)時使用 Vector4(0,0,1,1)
backUVs (Vector4[])背面 UV 映射,只有在 sideOrientation 設置為雙面(BABYLON.Mesh.DOUBLESIDE)時使用 Vector4(0,0,1,1)
sourcePlane (Plane)這是數(shù)學平面,用于修改平面網(wǎng)格的位置朝向 空值
sourcePlane 是一個平面網(wǎng)格的獨特選擇,它提供了一種方法來定向和定位它。
現(xiàn)在只考慮它的方向在創(chuàng)建上是矢量(0,0,1)現(xiàn)在你要讓方向成為矢量(0,1,1)然后你用它來創(chuàng)建一個源平面

var sourcePlane = new BABYLON.Plane(0,0,1,0);
這就創(chuàng)建了一個數(shù)學平面,它被用作定位源。第四個參數(shù)是向方向矢量方向移動的距離。這里暫時設為 0。

5.創(chuàng)建地面
var ground = BABYLON.MeshBuilder.CreateGround("ground", {}, scene);
創(chuàng)建一個自定義的地面

var myGround = BABYLON.MeshBuilder.CreateGround("myGround", {width: 6, height: 4}, scene);
size (number)地面每個邊的長度
height (number)地面的高度
width (number)地面的寬度
updatable (boolean)如果網(wǎng)格是可更新的,則設置為 true false
subdivisions (number)將地面分成幾塊



創(chuàng)建天空影像
所謂的天空盒其實就是將一個立方體展開,然后在六個面上貼上相應的貼圖

在實際的渲染中,將這個立方體始終罩在攝像機的周圍,讓攝像機始終處于這個立方體的中心位置,然后根據(jù)視線與立方體的交點的坐標,來確定究竟要在哪一個面上進行紋理采樣。具體的映射方法為:設視線與立方體的交點為(x,y,z)(x,y,z),在 x、y、zx、y、z 中取絕對值最大的那個分量,根據(jù)它的符號來判定在哪個面上采樣。

每個圖像的名稱應有一個共同的部分,后跟一個由_px,_nx,_py,_ny,_pz 或_nz 給出的位置,分別對應于 x,y 或 z 軸的正(p)或負(n)

var createScene = function () {
    var scene = new BABYLON.Scene(engine);
    var camera = new BABYLON.ArcRotateCamera("Camera", -Math.PI / 2,  Math.PI / 2, 5, BABYLON.Vector3.Zero(), scene);
    camera.attachControl(canvas, true);

 var light = new BABYLON.HemisphericLight("hemiLight", new BABYLON.Vector3(-1, 1, 0), scene);
 light.diffuse = new BABYLON.Color3(1, 0, 0);

 // Skybox
 var skybox = BABYLON.MeshBuilder.CreateBox("skyBox", {size:1000.0}, scene);
 var skyboxMaterial = new BABYLON.StandardMaterial("skyBox", scene);
 skyboxMaterial.backFaceCulling = false;
 skyboxMaterial.reflectionTexture = new BABYLON.CubeTexture("textures/skybox", scene);
 skyboxMaterial.reflectionTexture.coordinatesMode = BABYLON.Texture.SKYBOX_MODE;
 skyboxMaterial.diffuseColor = new BABYLON.Color3(0, 0, 0);
 skyboxMaterial.specularColor = new BABYLON.Color3(0, 0, 0);
 skybox.material = skyboxMaterial;

    return scene;

};
渲染效果展示:




作者:前端小菜雞之菜雞互啄


歡迎關注微信公眾號 :前端開發(fā)愛好者


添加好友備注【進階學習】拉你進技術交流群