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.rhkb.cn/news/323733.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件开发故事 - 我对 CTO 撒谎并挽救了项目

原文:GrumpyOldDev - 2024.04.18 这是几年前的事情了。还记得在我职业生涯的初期,父亲曾告诉我,做好工作往往意味着要在上司的阻碍下做好需要做的事情。他的意思是,你可以让上司成功并感到快乐;也可以让上司做每一个决…

面试算法之哈希专题

赎金信 class Solution { public:bool canConstruct(string ransomNote, string magazine) {// 小写字母int r_cnt[26];int m_cnt[26];for(int i 0; i< magazine.size(); i) {m_cnt[magazine[i]-a]; // 统计}// 对比for(int i 0; i< ransomNote.size(); i) {if(m_cnt[r…

树与二叉树之间的转换

树转化成二叉树&#xff1a;兄弟相连留长子 1.加线&#xff1a;在兄弟之间加一条线 2.抹线&#xff1a;对每个结点&#xff0c;除了其左孩子外&#xff0c;去除其与其余孩子之间的关系 3.旋转&#xff1a;以树的根结点为轴心&#xff0c;将整树顺时针转45 二叉树转化成为树…

Day65:代码随想录训练营总结

两个月的算法训练营之旅圆满落幕&#xff0c;回首这段时光&#xff0c;我深感自己错过了许多早日成长的机会&#xff0c;如今不禁懊悔没有更早地报名参与。 这段充实的日子里&#xff0c;我遵循着训练营精心设计的计划&#xff0c;攻克了上百道力扣题目。从最初对编程语法的生…

react18【实战】tab切换,纯前端列表排序(含 lodash 和 classnames 的安装和使用)

技术要点 动态样式 className{tabItem ${currentType item.value && "active"}}安装 lodash npm i --save lodash使用 lodash 对对象数组排序&#xff08;不会改变源数组&#xff09; _.orderBy(dataList, "readNum", "desc")src\De…

如何正确使用防静电擦拭纸以确保产品质量

在现代工业生产中&#xff0c;防静电擦拭纸扮演着至关重要的角色&#xff0c;它们被广泛应用于各种电子产品、精密仪器以及其他对静电敏感的领域。然而&#xff0c;要想确保防静电擦拭纸发挥最佳效果&#xff0c;正确的使用方法至关重要。下面优斯特将介绍如何正确使用防静电擦…

调试代码问题汇总

1.最常见的就是数据库密码不对。根据调试视频将你的数据库密码设置正确&#xff0c;数据库密码是数字的优先直接连如果不成功可以加个双引号或者单引号。 提示&#xff1a;java.sql.SQLException: Access denied for user rootlocalhost (using password: YES) 2.原本配置好的…

什么是HTTP/2?

HTTP/2&#xff08;原名HTTP 2.0&#xff09;即超文本传输协议第二版&#xff0c;使用于万维网。HTTP/2主要基于SPDY协议&#xff0c;通过对HTTP头字段进行数据压缩、对数据传输采用多路复用和增加服务端推送等举措&#xff0c;来减少网络延迟&#xff0c;提高客户端的页面加载…

C++ -- 函数重载 、引用、 内联函数、auto、基于范围的for循环、指针空值nullptr

目录 1.函数重载 1.1函数重载: 1.2函数重载需要注意&#xff1a; 1.3函数重载的一些特殊情况 1.4为什么C语言不支持函数重载&#xff0c;C支持函数重载&#xff1f;底层逻辑是&#xff1f; 2.引用 2.1 引用特性 2.2 常引用 2.3 权限问题&#xff08;权限放大&#xff0c;…

QT:QT与操作系统

文章目录 信号槽与事件QT多线程概述原理完成倒计时程序 UDP回显服务器服务端客户端 信号槽与事件 在之前的信号槽中&#xff0c;已经有了一个基本的认识&#xff0c;那么对于QT中事件的理解其实就非常的类似&#xff0c;当用户进行某种操作的时候&#xff0c;就会触发事件&…

【洛谷】动态规划之最长公共子序列

前言&#xff1a; 本系列目的是记录日常所刷的题&#xff0c;有的是自己想出来的题&#xff0c;有的是看了大佬题解后想明白的题 题目 P1439 【模板】最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前提&#xff1a; 两个排列都是1到n的排列&#xff0c;说…

linux安装 mysql

环境&#xff1a;centOS8 一、安装 1 安装wget库 sudo yum -y install wget 2. 安装 mysql 换yum源 亲测成功&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 换yum源 1.下载对应版本的repo文件 wget -O CentOS-Base.repo http://mirrors…

ESLint: Unexpected ‘debugger‘ statement.(no-debugger)(debugger报红)

ESLint: Unexpected debugger statement.(no-debugger) 解决办法&#xff1a; 找到.eslintrc.js文件中rules的no-debugger更改为0即可

200-500人规模工厂网络方案(中小企业网络)

一、方案概述 工厂一般有单独的弱电房&#xff0c;类似这种 里面采用的方案如下&#xff1a; 主要考虑有线、无线、财务、办公、访客等业务&#xff0c;便于维护管理和后续扩容 还需要 Wi-Fi覆盖零死角高速率&#xff0c;工作不卡顿 同时考虑AV反病毒、IPS入侵防御、用户准…

【LLama】Llama3 的本地部署与lora微调(基于xturn)

系列课程代码文档&#xff08;前2节课可跳过&#xff09;&#xff1a;https://github.com/SmartFlowAI/Llama3-Tutorial 课程视频&#xff1a;https://space.bilibili.com/3546636263360696/channel/series XTuner &#xff1a;https://github.com/InternLM/xtuner/blob/main/R…

内网安全-代理Socks协议路由不出网后渗透通讯CS-MSF控制上线简单总结

我这里只记录原理&#xff0c;具体操作看文章后半段或者这篇文章内网渗透—代理Socks协议、路由不出网、后渗透通讯、CS-MSF控制上线_内网渗透 代理-CSDN博客 注意这里是解决后渗透通讯问题&#xff0c;之后怎么提权&#xff0c;控制后面再说 背景 只有win7有网&#xff0c;其…

对XYctf的一些总结

对XYctf的一些总结 WEB 1.http请求头字段 此次比赛中出现的&#xff1a; X-Forwarded-For/Client-ip&#xff1a;修改来源ip via&#xff1a;修改代理服务器 还有一些常见的字段&#xff1a; GET&#xff1a;此方法用于请求指定的资源。GET请求应该安全且幂等&#xff0c…

C++ 如何进阶?

一、C基础&#xff08;3个月&#xff09; 1、面向对象的三大特性&#xff1a;封装、继承、多态 2、类的访问权限&#xff1a;private、protected、public 3、类的构造函数、析构函数、赋值函数、拷贝函数 4、移动构造函数与接贝构造函数对比 5、深接贝与浅贝的区别 6、空…

超标量处理器设计:重排序缓存(ROB)

★超标量处理器的很多地方用到了重排序缓存&#xff0c;但是我对它不是很了解&#xff0c;所以我整理一下重排序缓存的知识点。 重排序缓存(ROB)在确保乱序执行的指令能够正确地完成和提交(Commit)&#xff0c;也可以用来寄存器重命名。 ROB是一个先进先出的表&#xff0c;每个…

教你解决PUBG绝地求生游戏中闪退掉线无法重连回去的问题

《绝地求生》&#xff08;PUBG&#xff09;&#xff0c;作为一款在全球范围内掀起热潮的战术竞技游戏&#xff0c;以其栩栩如生的战场环境和令人心跳加速的生存冒险博得了广大玩家的青睐。然而&#xff0c;一些玩家在经历了一场惊心动魄的对局后&#xff0c;却面临了一个不大不…