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.mzph.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. 整数拆分…