Babylon.js 7.0開發入門教程

Babylon.js 是一個功能強大的開源 3D 引擎,能夠使用 JavaScript 渲染交互式 3D 和 2D 圖形。它是為 Web 甚至 VR 創建游戲、演示、可視化和其他 3D 應用程序的絕佳選擇。Babylon.js最新版本是7.0。

Babylon.js 是免費、開源和跨平臺的,是 Unity 和 Unreal Engine 等專有 3D 引擎的絕佳替代品。它也是 Three.js 和 PlayCanvas 等其他開源 3D 引擎的絕佳替代品,因為它提供開箱即用的 TypeScript 類型,針對性能進行了優化,并提供了高級調試工具。它的開發人員體驗非常出色,并且擁有龐大且活躍的社區,這使其成為初學者和專家創建 Web 3D 應用程序的絕佳選擇。

NSDT工具推薦:?Three.js AI紋理開發包?-?YOLO合成數據生成器?-?GLTF/GLB在線編輯?-?3D模型格式在線轉換?-?可編程3D場景編輯器?-?REVIT導出3D模型插件?-?3D模型語義搜索引擎?-?Three.js虛擬軸心開發包?-?3D模型在線減面?-?STL模型在線切割?

1、Babylon.js開發入門

Babylon.js 支持 ES6 和 CommonJS 模塊導入:

  • CommonJS Babylon.js npm 包支持 CommonJS/ES6 導入、UMD 和 AMD 導入??
  • 對于通過 Tree Shaking 尋求優化的開發人員,Babylon.js 提供了 ES6 軟件包。其中包括用于核心功能的?@babylonjs/core,以及?@babylonjs/materials、?@babylonjs/loaders、?@babylonjs/gui?等附加模塊。重要的是不要混合 ES6 和遺留包??

如果你想使用 CommonJS 模塊導入,你可以安裝 Babylon.js,如下所示:

npm install --save babylonjs

然后,將其包含在你的 JavaScript 或 TypeScript 文件中:

import * as BABYLON from "babylonjs";

如果你想使用 ES6 模塊導入,可以安裝 Babylon.js,如下所示:

npm install --save @babylonjs/core

然后,將其包含在你的 JavaScript 或 TypeScript 文件中:

import { Engine, Scene } from "@babylonjs/core";

我更喜歡 ES6 模塊導入,因為它們允許進行樹搖動,這可以顯著減少最終包的大小。但是,在本教程中,我將使用 CommonJS 模塊導入,因為 Babylon.js 游樂場使用的是 CommonJS 模塊導入。

2、創建第一個Babylon.js 場景

Babylon.js Playground?(游樂場)是學習和開發 Babylon.js 的必備工具。這是一個用戶友好的環境,你可以在其中編寫代碼并立即在實時場景中查看結果。游樂場配有默認場景,嘗試它是一個很好的開始方式。

除了使用默認場景之外,如果想查看特定功能的示例,你還可以搜索游樂場。例如,如果你搜索“物理學”,會發現幾個實際應用中的物理學示例。

游樂場還經常用于在尋求幫助和幫助他人時在?Babylon.js 論壇上分享代碼片段。我經常發現自己在谷歌上搜索特定的 Babylon.js 問題或功能,并找到一個游樂場示例來幫助我理解和解決我的問題。

2.1 創建和修改網格

網格是 3D 圖形的基礎。在 Babylon.js 中,創建基本網格(如球體)涉及幾行代碼:

var sphere = BABYLON.MeshBuilder.CreateSphere("sphere",{ diameter: 2, segments: 32 },scene
);
sphere.position.y = 1;

你還可以創建材質并將其分配給網格以更改其外觀。例如,要將地平面設為紅色,你可以編寫:

const groundMaterial = new BABYLON.StandardMaterial("Ground Material", scene);
groundMaterial.diffuseColor = BABYLON.Color3.Red();
ground.material = groundMaterial;

紋理也可以添加到材質中:

var groundTexture = new BABYLON.Texture(Assets.textures.checkerboard_basecolor_png.rootUrl,scene
);
groundMaterial.diffuseTexture = groundTexture;

2.2 導入和使用網格

Babylon.js 允許導入復雜的網格,可以在場景中縮放和定位:

BABYLON.SceneLoader.ImportMesh("",Assets.meshes.MyCustomMesh.rootUrl,Assets.meshes.MyCustomMesh.filename,scene,function (newMeshes) {newMeshes[0].scaling = new BABYLON.Vector3(0.1, 0.1, 0.1);}
);

2.3 使場景具有互動性

交互性是網絡體驗的一個關鍵方面。將控件附加到相機可以通過單擊和拖動操作進行用戶交互。

var camera = new BABYLON.ArcRotateCamera("Camera",0,0,10,BABYLON.Vector3.Zero(),scene
);
camera.attachControl(canvas, true);

2.4 添加虛擬現實支持

虛擬現實是一項令人興奮的新技術,可以讓用戶更加身臨其境地體驗 3D 環境。 Babylon.js 內置了對虛擬現實的支持,只需幾行代碼即可啟用:

const experience = await scene.createDefaultXRExperienceAsync();
const camera = experience.baseExperience.camera;
camera.attachControl(true);

你只需創建 XR 體驗,從基礎體驗中獲取相機,并將其附加到畫布上,你就應該為 VR 做好準備。如果沒有 VR 耳機,你仍然可以使用沉浸式 Web 模擬器 Chrome 擴展程序在 VR 中測試場景。

2.5 添加物理

物理是許多 3D 應用的重要組成部分。 Babylon.js 有一個內置的物理引擎,可以通過幾行代碼啟用:

var gravityVector = new BABYLON.Vector3(0, -9.81, 0);
var physicsPlugin = new BABYLON.CannonJSPlugin();
scene.enablePhysics(gravityVector, physicsPlugin);

可以通過設置網格的?physicsImpostor屬性將物理應用于網格:

sphere.physicsImpostor = new BABYLON.PhysicsImpostor(sphere,BABYLON.PhysicsImpostor.SphereImpostor,{ mass: 1, restitution: 0.9 },scene
);

2.6 添加燈光

燈光對于創建逼真的場景至關重要。在 Babylon.js 中,有四種主要類型的燈光,每種類型都提供獨特的屬性和效果:

  • 定向光:模仿陽光,在整個場景中發出平行光線。它由方向向量定義并且具有無限范圍。
  • 點光:類似于燈泡,從空間中的單個點向各個方向均勻地輻射光。
  • 聚光燈:功能類似于手電筒,從給定方向的特定位置發出錐形光束。其照明面積和衰減由角度和指數參數控制。
  • 半球光:模擬周圍環境照明,由方向定義,通常向上。其效果受設置不同顏色屬性的影響。

每種燈光類型都可以使用強度和范圍等屬性進行自定義,并且可以控制它們照亮哪些網格。對于更復雜的光照場景,可以利用光照貼圖來預先計算和存儲光照效果。

例如,要向場景添加定向光,可以編寫:

var light = new BABYLON.DirectionalLight("DirectionalLight",new BABYLON.Vector3(0, -1, 0),scene
);

2.7 添加陰影

陰影是創建真實場景的重要組成部分,因為它們可以提供有關對象相對位置和距離的線索,從而增強深度和維度的感知,從而幫助傳達場景的 3D 結構。 Babylon.js 有多種類型的陰影,包括 PCF、PCFSoft 和 PCSS。例如,要將 PCF 陰影添加到場景中,您可以編寫:

var shadowGenerator = new BABYLON.ShadowGenerator(1024, light);
shadowGenerator.usePoissonSampling = true;
shadowGenerator.bias = 0.0001;
shadowGenerator.normalBias = 0.01;
shadowGenerator.setDarkness(0.5);
shadowGenerator.useBlurExponentialShadowMap = true;
shadowGenerator.blurKernel = 32;
shadowGenerator.blurScale = 2;
shadowGenerator.blurBoxOffset = 1;
shadowGenerator.useKernelBlur = true;shadowGenerator.addShadowCaster(sphere);

2.8 添加音頻

音頻是許多 3D 應用程序的重要組成部分。 Babylon.js 有一個內置的音頻引擎,可以通過幾行代碼啟用:

var audioEngine = new BABYLON.AudioEngine();

可以通過創建聲音對象將音頻添加到場景中:

var sound = new BABYLON.Sound("Sound",`${Assets.sound.cannonBlast.rootUrl}${Assets.sound.cannonBlast.filename}`,scene,null,{ loop: true, autoplay: true }
);

這個特定的示例將在場景中循環播放“炮彈爆炸”聲音。大炮爆炸資源已預加載到 Babylon.js 游樂場中。如果您要在應用程序中加載自定義資源,您只需提供一個指向文件系統上的聲音文件的 URL。有關更多詳細信息,您可以查看有關 Babylon.js 中播放聲音的文檔。

2.9 添加用戶界面元素

用戶界面元素可用于向場景添加交互性。 Babylon.js 提供了一個構建在?DynamicTexture?之上的 GUI 庫擴展。

例如,要將一個對話框添加到包含按鈕的場景中,可以編寫:

var guiManager = new BABYLON.GUI.GUI3DManager(scene);const slate = new BABYLON.GUI.HolographicSlate("down");
slate.minDimensions = new BABYLON.Vector2(5, 5);
slate.dimensions = new BABYLON.Vector2(5, 5);
slate.titleBarHeight = 0.75;
slate.title = "Button!";
guiManager.addControl(slate);var button = BABYLON.GUI.Button.CreateSimpleButton("button", "Click me!");
button.width = 0.5;
button.height = 0.25;
button.background = "green";
button.textBlock.color = "white";
button.onPointerClickObservable.add(() => {alert("Hi!");
});slate.content = button;
slate.position = new BABYLON.Vector3(-2, 2, 0);

要使用 ES6 版本,你需要安裝?@babylonjs/gui?包:

npm install --save @babylonjs/gui

然后,將其導入 JavaScript 或 TypeScript 文件,如下所示:

import { GUI3DManager, HolographicSlate, Button } from "@babylonjs/gui";
提示:如果你不喜歡允許用戶傾斜 HolographicSlate 的控件,可以在將石板添加到場景后,通過設置? slate._gizmo._rootMesh.setEnabled(false);?來禁用它們。

2.10 添加動畫

動畫可用于向場景添加運動。 Babylon.js 有多種類型的動畫,包括關鍵幀、骨骼和變形目標。

例如,要將關鍵幀動畫添加到場景中,可以編寫:

var animationBox = new BABYLON.Animation("myAnimation","scaling.x",30,BABYLON.Animation.ANIMATIONTYPE_FLOAT,BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE
);
var keys = [];
keys.push({frame: 0,value: 1,
});
keys.push({frame: 20,value: 0.2,
});
keys.push({frame: 100,value: 1,
});
animationBox.setKeys(keys);
sphere.animations.push(animationBox);
scene.beginAnimation(sphere, 0, 100, true);

以下是該代碼的作用的解釋:

動畫創建。

創建一個名為“myAnimation”的?BABYLON.Animation?對象來為?scaling.x?屬性設置動畫,表明動畫將影響對象的寬度。它以每秒 30 幀的速度運行,值表示為浮點數,并連續循環。

定義關鍵幀。

定義了三個關鍵幀:

  • 在第 0 幀,比例為 1(原始尺寸)。
  • 在第 20 幀,比例減小到 0.2。
  • 在第 100 幀處,比例返回到 1。
應用和啟動動畫。

動畫被分配給球體對象并立即開始,在第 0 幀和第 100 幀之間循環。這會在球體的寬度上創建脈動效果。

要更深入地了解動畫,可以查看?Babylon.js 動畫文檔。

2.11 調試

調試是任何開發過程的重要組成部分。 Babylon.js 有一個內置的調試層,可以通過幾行代碼啟用:

scene.debugLayer.show();

調試層提供了一個用戶友好的界面,用于檢查和修改場景。它還可以向你顯示當前的幀速率和其他性能指標,并允許你導出性能數據。

如果使用 ES6 模塊導入,則需要安裝?@babylonjs/inspector?包:

npm install --save @babylonjs/inspector

然后,將其導入 JavaScript 或 TypeScript 文件,如下所示:

import "@babylonjs/inspector";

2.12 托管和共享你的場景

一旦你對自己的創作感到滿意,可以將其下載為 HTML 文件并將其托管在 GitHub Pages 等平臺上,以便全世界都可以訪問。

你還可以通過Playground URL 與其他人分享你的場景。例如,默認場景的 URL 為 :https://playground.babylonjs.com/#6QY4X1#1?。

如果想將場景與你選擇的框架集成,可以查看?Babylon.js 外部庫文檔,其中可以找到 Babylon.js 與 React、Vue 或 Ionic Angular 等框架一起使用的示例。

3、結束語

Babylon.js 是一個功能強大的開源 3D 引擎,能夠使用 JavaScript 渲染交互式 3D 和 2D 圖形。它得到了良好的支持和維護,通過許多交互式游樂場示例和支持性社區論壇提供了良好的開發人員體驗,使其成為創建游戲、演示、可視化和其他網絡 3D 應用程序(最終甚至是本機平臺)的絕佳選擇。


原文鏈接:Babylon.js 7.0 開發入門 - BimAnt

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/9810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/9810.shtml
英文地址,請注明出處:http://en.pswp.cn/web/9810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 每日一題 ---- 【1463.摘櫻桃 II】

LeetCode 每日一題 ---- 【1463.摘櫻桃 II】 1463.摘櫻桃II方法:動態規劃(遞推) 1463.摘櫻桃II 方法:動態規劃(遞推) 昨天是摘櫻桃I,今天是II,與昨天的區別主要在于,今…

【進程替換】多進程程序替換原理 | 進程程序替換函數 | execlexecv | execlpexecvp

目錄 多進程程序替換 多進程程序替換原理 進程程序替換函數詳解 execl&execv execlp&execvp execle&execvpe execve 多進程程序替換 我們想要進程替換的同時不影響舊的進程(使用多進程版)fork創建子進程,讓子進程去替換執…

2008NOIP普及組真題 4. 立體圖

線上OJ: 一本通-1977:【08NOIP普及組】立體圖 核心思想: 本題采用模擬方法一個一個畫小方塊(雖然畫的是立體空間的積木,但本質還是在二維平面上畫圖形) 本題的難點在于: 1、如何確定二維平面畫…

tengine-docker鏡像制作

1.下載 wget https://tengine.taobao.org/download/tengine-3.0.0.tar.gz 或者直接下載這個包括下邊兩個配置文件了 https://download.csdn.net/download/cyw8998/89286114 2.編輯nginx.conf文件 #####user nobody; worker_processes 1;#error_log logs/error.log; #er…

淺析擴散模型與圖像生成【應用篇】(二十三)——Imagic

23. Imagic: Text-Based Real Image Editing with Diffusion Models 該文提出一種基于文本的真實圖像編輯方法,能夠根據純文本提示,實現復雜的圖像編輯任務,如改變一個或多個物體的位姿和組成,并且保持其他特征不變。相比于其他文…

c語言題庫之序列合并

文章目錄 前言C語言題目:分析1. 合并邏輯2.圖解合并邏輯 代碼實現注意事項總結思考 前言 在編程中,我們經常遇到需要將兩個有序序列合并為一個有序序列的問題。下面,我們就來詳細探討一下如何解決這個問題,包括輸入處理、合并邏輯…

python 根據網址和關鍵詞批量下載影像

最近用到了GLASS的LAI產品,但這個產品的文件夾分得很細,我需要的影像又有8個瓦片,一個一個點擊很麻煩,于是探索了批量下載的方法 一、下載1幅 import requests import re import os import requests import re# 網頁URLurl &…

深入理解Java HashSet類及其實現原理

哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云;歡迎大家常來逛逛 今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一…

Java中什么是多態?多態的實現原理是什么?多態在Java中的意思實現方式是什么?多態在框架設計中有什么作用應用場景?

什么是多態? 多態是面向對象編程中的一個重要概念,它允許不同類的對象對同一消息做出響應。在 Java中,多態通常體現為子類對象可以替代父類對象的特性。這意味著你可以使用父類的引用來引用子類的對象。 多態的實現原理: 多態的…

如何在 CentOS 上安裝并配置 Redis

如何在 CentOS 上安裝并配置 Redis 但是太陽,他每時每刻都是夕陽也都是旭日。當他熄滅著走下山去收盡蒼涼殘照之際,正是他在另一面燃燒著爬上山巔散烈烈朝暉之時。 ——史鐵生 環境準備 本教程將在 CentOS 7 或 CentOS 8 上進行。確保你的系統已更新到最…

Channel實現Flutter與原生平臺之間的雙向通信

文章目錄 (一)通過MessageChannel實現Flutter與原生平臺之間的雙向通信Flutter端實現MessageChannel通信步驟:Android端實現MessageChannel通信步驟: (二)通過MethodChannel實現Flutter與原生平臺之間的雙向…

uniapp/微信小程序實現加入購物車點擊添加飛到購物車動畫

1、預期效果 2、實現思路 每次點擊添加按鈕時,往該按鈕上方添加一個懸浮元素,通過位移動畫將元素移到目標位置。 1. 為每個點擊元素設置不同的class,才能通過uni.createSelectorQuery來獲取每個元素的節點信息; 2. 添加一個與…

c++:(map和set的底層簡單版本,紅黑樹和AVL樹的基礎) 二叉搜索樹(BST)底層和模擬實現

文章目錄 二叉搜索樹的概念二叉搜索樹的操作二叉搜索樹的查找find 二叉搜索樹的模擬實現構造節點insertfinderase(細節巨多,面試可能會考)a.葉子節點b.有一個孩子左孩子右孩子 c.有兩個孩子注意: erase代碼 中序遍歷 二叉搜索樹的應用k模型k模型模擬實現的總代碼 k-value模型k-…

7-Zip命令行調用命令收集(20個)

列出壓縮文件的內容: 7z l archive.7z 解壓壓縮文件到當前目錄: 7z x archive.7z 解壓壓縮文件到指定目錄: 7z x archive.7z -o"C:\path\to\extract" 創建新的壓縮文件 (添加到archive.7z): 7z a archive.7z file_to_compress 創建包含多個文件的壓縮文件: 7z a arc…

【JVM】了解JVM規范中的虛擬機結構

目錄 JVM規范的主要內容 1)字節碼指令集(相當于中央處理器CPU) JVM指令分類 2)Class文件的格式 3)數據類型和值 4)運行時數據區 5)棧幀 6)特殊方法 7)類庫 JVM規范的主要內容 1&#…

Vue3+ElementPlus+TS開發業務功能的問題匯總(持續更新)

1.開發表單彈框功能時遇到兩個問題:加入了校驗規則后,無論下拉框是否選擇數據下面的紅色提示都會觸發顯示不會自動隱藏 ; 另外,新增的功能在提交后數據無法重置,這種在修改時可能會出現,但新增正常情況是不…

走進C++:C到C++的過渡

目錄 什么是C呢? C的發展史 多了一些吃前來很香的“語法糖”。 語法糖一:命名空間 命名空間有個強大的功能 如何使用 語法糖二:缺省參數 語法糖三:函數重載 語法糖四:引用 引用傳參 引用返回 引用和…

【ZZULIOJ】1100: 求組合數(函數專題)(Java)

目錄 題目描述 輸入 輸出 樣例輸入 Copy 樣例輸出 Copy 提示 code 題目描述 馬上要舉辦新生程序設計競賽了,與以往不同的是,本次比賽以班為單位,為了全面衡量一個班級的整體水平,要求從一個班的m位同學中任選k位同學代表本…

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer與fence機制(2)

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer與fence機制(2) 計算fps幀率 用 adb shell dumpsys SurfaceFlinger --list 查詢當前的SurfaceView,然后有好多行,再把要查詢的行內容完整的傳給 ad…

算法訓練Day35 | ● 343. 整數拆分 ● 96.不同的二叉搜索樹

343. 整數拆分 class Solution { public:int integerBreak(int n) {vector<int> dp(n1, 0);dp[2] 1;for(int i3; i<n1; i){for(int j 1; j<i/2; j){dp[i] max(dp[i], max(j*(i-j), j*dp[i-j]));}}return dp[n];} };參考文章&#xff1a;代碼隨想錄-343. 整數拆分…