当前位置: 首页 > news >正文

Babylon.js学习之路《二、开发环境搭建与第一个Hello World》

在这里插入图片描述

文章目录

  • 1. 引言
  • 2. Babylon.js 的使用
    • 2.1 Babylon.js广场
    • 2.2 Babylon.js 文档
    • 2.3 Babylon.js沙盒
  • 3. Web项目引入 Babylon.js
    • 3.1 HTML项目引入
    • 3.2 ES6/NPM引入
  • 4. 快速体验:Babylon.js 的“Hello World”
    • 创建第一个三维场景
  • 5. 变量解析
    • 5.1 引擎
    • 5.2 MeshBuilder
    • 5.3 引入场景或模型
    • 5.4 操控引入的模型
  • 7. 总结与下一章预告
    • 7.1 必要元素
    • 7.2 下一章预告


1. 引言

工作原因,去年接触了WebGL的项目,明显的感受到了作为前端开发人员的乐趣。这种体验是后台管理系统不能比的。虽然我也开发过复杂的管理系统功能,但是三维场景的吸引力显然不在同一个维度。
因此,我想深入学习一下WebGL,从熟悉的框架Babylon.js入手,循序渐进,巩固已经了解的知识点,扩展知识面,做到精通Babylon.js。
在这个过程中,我会记录自己用到的每一个知识点,每个可能踩坑的地方。我尽量不使用AI生成的内容,以自己的语言表达,手敲每一个文字。


2. Babylon.js 的使用

2.1 Babylon.js广场

  • 在学习和开发Babylon时,最重要的工具是Babylon.js Playground。
  • Babylon.js操场是个非常好用的工具,对于新手非常友好。相当于提前为你集成好了Babylon.js的开发环境,只要输入Babylon.js框架相关的代码即可,并在右侧查看即时更新。
  • 不仅如此,Babylon.js操场还有大量实际例子,可以通过关键字搜索相关的例子。比如哪个属性不太明白,直接搜索就能查到属性的用法。
    在这里插入图片描述

2.2 Babylon.js 文档

  • Babylon.js提供了丰富的API,能帮助开发人员尽可能轻松地实现自己想要的功能
  • 并且,Babylon.js提供了功能强大的API学习网站,可以通过文档学习想知道的功能
  • 直接访问官网:https://doc.babylonjs.com
  • 左侧导航栏,选择API,即可查看开发文档
    在这里插入图片描述
    在这里插入图片描述

2.3 Babylon.js沙盒

  • Babylon.js沙盒是一个功能强大的、基于web的3D资源查看器和调试工具,适用于使用Babylon.js的开发人员和设计师。支持用户通过直观的界面加载和检查3D模型、纹理、动画和材质。沙盒是测试和微调项目的重要工具。
  • 地址:https://sandbox.babylonjs.com/
  • 支持的文件格式:.gltf、.glb、.obj、.stl、.babylon
    在这里插入图片描述
    在这里插入图片描述

3. Web项目引入 Babylon.js

3.1 HTML项目引入

  • 虽然可以通过CDN引入,但是不应该用于生产环境,CDN的目的是为学习。
  • Download 下载Babylon.js在云端的模板文件。
  • DownLoad 下载包含本地版本Babylon.max.js的模板文件
<script src="https://cdn.babylonjs.com/babylon.js"></script>

3.2 ES6/NPM引入

  • 所有babylon ES6包都可以在npm作用域@babylonjs中找到。
  • @babylonjs/core-巴比伦的核心。
  • @babylonjs/材料-巴比伦支持的先进材料的集合。
  • @babylonjs/loaders-巴比伦的所有官方加载器(OBJ、STL、glTF)。
  • @babylonjs/post processes-巴比伦的后处理。
  • @babylonjs/程序纹理-官方支持的程序纹理。
  • @babylonjs/序列化器-场景/网格序列化器。
  • @babylonjs/gui-Babylon.js图形用户界面模块。
  • @babylonjs/viewer-独立的Babylon.js查看器。
  • @babylonjs/inspector-用于可视化调试的Babylon.js检查器。
  • @babylonjs/KTX2解码器-巴比伦的KTX2解码器模块。

安装Babylon.js

npm install @babylonjs/core

引入全部Babylon.js

import * as BABYLON from "@babylonjs/core/Legacy/legacy.js";

加载特定的类

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

4. 快速体验:Babylon.js 的“Hello World”

创建第一个三维场景

  • 想象一下,站在一片空白的画布前,握着一支代码组成的笔。这支画笔可以在画布上绘制出任何3D 世界:雄伟的山脉、浩瀚的海洋、繁华的城市,甚至是充满幻想的外星景观。

  • 在开始创作之前,需要了解一些基本概念和工具:
    1、画布: 在 BabylonJS 中,这块画布就是 HTML5 Canvas 元素。它是 3D 场景的渲染目标,也是用户与 3D 世界交互的窗口。
    2、引擎: BabylonJS 引擎就是画笔。提供了丰富的 API,涵盖了从创建场景、添加物体到应用
    3、光源: 光照是 3D 世界中不可或缺的一部分。它不仅影响物体的外观,还决定了场景的氛围和情感基调。
    4、相机: 相机决定了我们观察 3D 世界的方式。不同的相机类型和设置可以带来截然不同的视觉效果和用户体验。
    5、物体: 几何体 和 网格 是构成 3D 世界的基本元素。从简单的立方体到复杂的人物模型,物体是 3D 场景中可见的实体。
    6、颜料: 材质 和 纹理 就是颜料。它们赋予 3D 物体外观和质感,使其看起来更加真实和生动。

  • 无论是创建整个世界还是只是将一个模型放置在网页中,都需要一个场景来包含世界或模型,一个相机来查看它,一个灯光来照亮它,当然,还需要至少一个可视对象作为模型。

  • 所有模型,无论是一个盒子还是一个复杂的角色,都是由三角形或小平面的网格组成的。

  • 在这里插入图片描述

  • 用一个HTML文件做例子,CDN引入Babylon.js。引入的js文件比较多,大多数都用不到,只是做个示范。

  • 在这里插入图片描述

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Babylon.js sample code</title><!-- Babylon.js --><script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.6.2/dat.gui.min.js"></script><script src="https://preview.babylonjs.com/ammo.js"></script><script src="https://preview.babylonjs.com/cannon.js"></script><script src="https://preview.babylonjs.com/Oimo.js"></script><script src="https://preview.babylonjs.com/earcut.min.js"></script><script src="https://preview.babylonjs.com/babylon.js"></script><script src="https://preview.babylonjs.com/materialsLibrary/babylonjs.materials.min.js"></script><script src="https://preview.babylonjs.com/proceduralTexturesLibrary/babylonjs.proceduralTextures.min.js"></script><script src="https://preview.babylonjs.com/postProcessesLibrary/babylonjs.postProcess.min.js"></script><script src="https://preview.babylonjs.com/loaders/babylonjs.loaders.js"></script><script src="https://preview.babylonjs.com/serializers/babylonjs.serializers.min.js"></script><script src="https://preview.babylonjs.com/gui/babylon.gui.min.js"></script><script src="https://preview.babylonjs.com/inspector/babylon.inspector.bundle.js"></script><style>html,body {overflow: hidden;width: 100%;height: 100%;margin: 0;padding: 0;}#renderCanvas {width: 100%;height: 100%;touch-action: none;}</style></head><body>// 创建画布,作为三维场景的容器<canvas id="renderCanvas"></canvas><script>// 定位到容器var canvas = document.getElementById("renderCanvas");var startRenderLoop = function (engine, canvas) {engine.runRenderLoop(function () {if (sceneToRender && sceneToRender.activeCamera) {sceneToRender.render();}});}var engine = null;var scene = null;var sceneToRender = null;var createDefaultEngine = function () {return new BABYLON.Engine(canvas, true, {preserveDrawingBuffer: true,stencil: true,disableWebGL2Support: false});};const createScene = () => {const scene = new BABYLON.Scene(engine);const camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 2, Math.PI / 2.5, 3, new BABYLON.Vector3(0, 0, 0));camera.attachControl(canvas, true);const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0));const box = BABYLON.MeshBuilder.CreateBox("box", {});return scene;}window.initFunction = async function () {var asyncEngineCreation = async function () {try {return createDefaultEngine();} catch (e) {console.log("the available createEngine function failed. Creating the default engine instead");return createDefaultEngine();}}window.engine = await asyncEngineCreation();if (!engine) throw 'engine should not be null.';startRenderLoop(engine, canvas);window.scene = createScene();};initFunction().then(() => {sceneToRender = scene});// Resizewindow.addEventListener("resize", function () {engine.resize();});</script></body>
</html>

5. 变量解析

5.1 引擎

  • 引擎变量是负责与WebGL、Audio等低级API接口的类。创建Babylon场景【将视觉效果渲染到屏幕的上下文】的构造函数需要引擎与这些低级API进行通信。这就是为什么在创建场景时需要引擎变量。

5.2 MeshBuilder

  • BABYLON.MeshBuilder 创建的长方体的中心位于原点,需要三个参数。名称【字符串】、配置项【对象】、场景。这里将配置项设置为没有属性的空对象,该长方体的宽度、高度和深度会默认为单位大小。
const createScene = () => {const scene = new BABYLON.Scene(engine);const camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 2, Math.PI / 2.5, 3, new BABYLON.Vector3(0, 0, 0));camera.attachControl(canvas, true);const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0));const box = BABYLON.MeshBuilder.CreateBox("box", {});return scene;
}

5.3 引入场景或模型

  • 参数:文件地址、文件名、目标场景、配置
BABYLON.ImportMeshAsync(文件地址 + 文件名, 场景, 配置);

5.4 操控引入的模型

  • 为了对结果进行操作并操纵对象,ImportMeshAsync在Promise后面使用then方法调用一个带有Promise结果的函数。结果是一个对象,其中包含属性网格,属性网格包含所有加载的模型。可以使用这个数组或它们的名称来操纵每个网格。
BABYLON.ImportMeshAsync("/relative path/myFile").then((result) => {result.meshes[1].position.x = 20;const myMesh1 = scene.getMeshByName("myMesh_1");myMesh1.rotation.y = Math.PI / 2;
});

7. 总结与下一章预告

7.1 必要元素

  • 这一章介绍了一个三维场景的必要元素:画布、引擎、相机、灯光,后面会详细介绍这些要素

7.2 下一章预告

  • 《创建你的第一个 3D 场景:立方体、球体与平面》:学习添加基本几何体、调整位置/旋转/缩放属性。

相关文章:

  • 在Mac M1/M2上使用Hugging Face Transformers进行中文文本分类(完整指南)
  • JavaSE核心知识点02面向对象编程02-04(包和导入)
  • 【NCCL】DBT算法(double binary tree,双二叉树)
  • 工业设计破局密码:3D 可视化技术点燃产业升级引擎
  • 13.原生测试框架Unittest解决用例组织问题 与测试套件的使用
  • 多视图密集对应学习:细粒度3D分割的自监督革命
  • 【Axios】解决Axios下载二进制文件返回空对象的问题
  • MapReduce报错 HADOOP_HOME and hadoop.home.dir are unset.
  • 课程审核流程揭秘:确保内容合规与用户体验
  • 高频算法面试题总结
  • 【25软考网工】第六章 网络安全(1)网络安全基础
  • 【MYSQL错误连接太多】
  • 如何构建容器镜像并将其推送到极狐GitLab容器镜像库?
  • 自定义prometheus exporter实现监控阿里云RDS
  • 5月9号.
  • 数据分析怎么做?高效的数据分析方法有哪些?
  • 多容器运行
  • Python训练营打卡DAY20
  • Android应用隐私合规:解决极光推送SDK提前收集WiFi信息问题
  • 三维底座+智能应用,重构城市治理未来
  • 巴基斯坦称回应挑衅,对印度发起军事行动
  • 4月证券私募产品备案量创23个月新高,股票策略占比超六成
  • 湖南省职业病防治院通报3岁女童确诊“铊中毒”:去年病例,编辑误写为“近日”
  • 丹麦召见美外交官,强调“不能容忍”美在格陵兰岛间谍活动
  • 两部上戏学生作品亮相俄罗斯“国际大学生戏剧节”
  • 抗战回望21︱《“良民”日记》:一个“良民”在沦陷区的见闻与感受