Babylonjs基础入门-Babylon.js第一个demo程序演示详细讲解
Babylon.js游乐场初体验,Babylon.js第一个demo程序
Babylon.JS是什么
Babylon.JS是在Web上编写3D程序的一套框架。好像亮哥已经第二次说了,不要闲烦哦,因为如果你有女朋友了,会更烦。
代码下载请单击这里Babylon.JS案例代码下载
游乐场(The Playground)
Babylon.JS提供了一个在线编辑器,它叫做The Playground,它是制作自己场景的最快捷,最简单的方法。The Playground是游乐场的意思,这个名字有点古怪,可能不好理解,你只需要知道,The Playground是一个实验学习Babylon.JS的地方,就很好理解了。
好了,废话说太多了,容易引起人方案,我们直接点击进入Babylon Playground来看看吧。
有时候网络不好,可能打不开,耐心等待,可能需要2分钟左右才能打开。
游乐场的使用
游乐场的使用相对来说比较简单,左边输入代码,点击顶部的执行按钮,右边就出现结果了。如下图所示:
上面游乐场中有个下载按钮比较重要,点击代码,你能下载一份源代码下来研究。
先不管左边的代码是什么意思,因为一来就看这么多的代码,其实有点难懂。所以,解决烦恼的办法就是逃避烦恼,我们先看看其他的。
引入Babylon.js引擎文件
Babylon.js引擎怎么嵌入网页中,让它运行起来呢?很简单,只要html文件中引入Babylon.js文件就可以了。代码如下:
1.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html" charset="utf-8"/> <title>Babylon - 开始之旅</title> <!-- Link to the last version of BabylonJS --> <script src="https://preview.babylonjs.com/babylon.js"></script> <!-- Link to the last version of BabylonJS loaders to enable loading filetypes such as .gltf --> <script src="https://preview.babylonjs.com/loaders/babylonjs.loaders.min.js"></script> <!-- Link to pep.js to ensure pointer events work consistently in all browsers --> <script src="https://code.jquery.com/pep/0.4.1/pep.js"></script> </head> <body> <canvas id="renderCanvas"></canvas> </body> </html>
代码第7行:这里引入了babylon.js文件,这个文件会自己初始化babylon.js的一些变量和环境。注意,这里引用的是最新的babylon.js库文件。
如果 https://preview.babylonjs.com/babylon.js这个文件无法下载,可能是无法访问国外网站的原因,你可以下载本课的代码,并更改一下这个js引用地址就可以了。
上面的代码中,我们引入了3个文件: |文件名|含义| |—|—| |babylon.js|最新的babylon.js库文件| |babylonjs.loaders.min.js |BabylonJS load 用于加载文件,如.gltf| |pep.js|用于光标操作,如鼠标移动,手指移动。这个库主要处理在手机、电脑上光标移动的一致性。|
这里要强调一下pep.js这个文件,这个一个jquery的插件,并不是babylon.js引擎独有的,没有出现babylon.js之前,pep.js就已经有了。
上面的代码,我们在<body>
中插入了<canvas>
画布。这个<canvas>
画布将是我们显示3D渲染结果的地方。只不过,它现在很孤独,什么都没有。
加入一些样式
在中插入一些样式,让页面更美观,如下:
<style> html, body { overflow: hidden; width : 100%; height : 100%; margin : 0; padding : 0; } #renderCanvas { width : 100%; height : 100%; touch-action: none; } </style>
上面代码将renderCanvas设置为整个浏览器的宽度和高度。
首先,我们在的末尾插入一些js代码:
<script> window.addEventListener('DOMContentLoaded', function() { // 在这里添加代码. }); </script>
上面的代码,我们将javascript代码包装在DOMContentLoaded事件处理程序中,这样网页加载完成后,才会执行js代码。
第一个demo中由哪些组成
我们下面接着添加一些代码,我们的第一个demo由如下内容组成:
先看一下效果图:
- 一个场景
- 两个形状(一个球体、一个地平面),形状也可以叫做物体
找到画布
我们将逐步完成它。首先,从HTML文档中获取canvas元素的引用,canvas是绘图3D的地方:
var canvas = document.getElementById('renderCanvas');
创建引擎类
然后,我们初始化后一个Babylon 3D引擎,调用BABYLON.Engine函数,BABYLON是引擎的全局类,它有很多成员变量,其中Engine就是引擎函数。
var engine = new BABYLON.Engine(canvas, true);
第一个参数是canvas,表示画布,引擎渲染的结果需要有一个地方放,就是canvas画布
第二个参数antialias,代表是否反锯齿,这里为true,表示渲染的物体边缘不会出现锯齿,这样会消耗更多的GPU资源,如果为false,表示不反锯齿,这样物体边缘看上去会很毛躁,但是不会消耗过多的GPU资源。
BABYLON.Engine函数的api可以在这里查看
创建场景
现在我们的场景,需要相机和灯光以及一些几何体。
这里的几何体就是一些形状、3D模型之类的东西,例如三角形,正方形。
下面的 createScene()函数主要用来生成场景,场景大家可以理解为一个舞台。下面的代码创建一个场景。
var createScene = function() { // 创建一个基本的BABYLON场景(舞台)对象。 var scene = new BABYLON.Scene(engine); // 创建一个FreeCamera,并将其位置设置为(x:0,y:5,z:-10)。 var camera = new BABYLON.FreeCamera('camera', new BABYLON.Vector3(0, 5,-10), scene); // 将相机的焦点指向场景的原点。 camera.setTarget(BABYLON.Vector3.Zero()); // 将相机连接到画布,这样画布才知道渲染什么。 camera.attachControl(canvas, false); // 创造一个灯光,指向(0,1,0)方向 - 意思是指向天空。 var light = new BABYLON.HemisphericLight('light1', new BABYLON.Vector3(0,1,0), scene); // 创建一个内置的“球体”形状。 var sphere = BABYLON.MeshBuilder.CreateSphere('sphere', {segments:16, diameter:2}, scene); // 将球体向上移动1个单位。 sphere.position.y = 1; // 创建一个内置的“地面”形状。 var ground = BABYLON.MeshBuilder.CreateGround('ground1', {height:6, width:6, subdivisions: 2}, scene); // 返回创建的场景。 return scene; }
这个函数做的事情有点多,不过在注释中有一些说明了。这里,我们不厌其烦再给大家解释一下。
BABYLON.Scene这一行代码创建一个场景,或者叫做舞台,你可以理解为演话剧的舞台。这个函数接受前面生成的engine作为参数,返回一个场景。
创建一个相机
为了让舞台中的内容能够显示到电视上,需要一个相机来摄影,上面代码中BABYLON.FreeCamera就是创建一个相机。
FreeCamera在巴比伦中叫做自由相机,其实是一个透视相机,你就把它理解成一个普通的手机就可以了。
FreeCamera的原型如下:
FreeCamera(name: string, position: Vector3, scene: Scene, setActiveOnSceneIfNoneActive?: boolean)
- 第一个参数name:定义这个相机的名字,随便去一个你顺眼的名字,如 尼康
- 第二个参数position是位置,它是一个向量,表示相机在场景中的位置。
- 第三个参数是场景,是我们上面一小节生成的scene。
- 第4个参数是一个可选参数,你可以不填写,本课的代码中就没有写这个参数。
ok,这个函数会返回一个相机对象。
创建一个相机后,我们把相机指向原点,使用的是下面的代码:
camera.setTarget(BABYLON.Vector3.Zero());
通过:camera.attachControl这函数可以把相机和canvas关联起来,这样相机渲染的内容,就可以显示在canvas上了。
如果对FreeCamera API感兴趣,你可以看它的API文档
创建一个灯光
如果没有灯光,那么整个场景是黑色的,我们需要增加一个灯光,灯光有很多种,这里使用HemisphericLight,翻译成中文是球形灯光的意思,关于灯光后面我们再介绍,你这里只有理解它是一个光源就可以了。HemisphericLight的原型如下:
HemisphericLight(name: string, direction: Vector3, scene: Scene): HemisphericLight
- 第一个参数:光的名字,随便取,你记得住就行。
- 第二个参数:光的方向
- 第三个参数:光要加入到的场景
- 返回值:返回一个生成的灯光。
var light = new BABYLON.HemisphericLight('light1', new BABYLON.Vector3(0,1,0), scene);
上面的代码的意思是:创造一个灯光,指向(0,1,0)方向,我怀疑你现在不知道方向的概念,也不知道这光指向何方,不过没关系,后面说光源的时候,再回来了解也不迟。
创建物体
舞台、灯光、相机都已经准备就绪,现在差演员上场了,这里的演员就是物体本身。
BABYLON.MeshBuilder是一个创建物体,我们一般称为网格物体的创建者,它有一个CreateSphere函数,可以创建一个椭圆。
BABYLON.MeshBuilder.CreateSphere的函数原型如下:
CreateSphere(name: string, options: object, scene?: Nullable<Scene>): Mesh
- 第一个参数:椭圆的名字,随便取,你记得住就行。
- 第二个参数:椭圆的一些参数,这是一个对象{},里面可以写你希望设置的参数。如segments表示分段,椭圆有多少段组成,这个概念有点难以理解,不过没关系,我们后面再说。diameter表示半径,就是这个椭圆的半径,注意一般椭圆有x,y两个半径,这里取一样的,那么就是一个圆了。
- 第三个参数:椭圆要加入到的场景
- 返回值:返回一个生成的椭圆网格模型。
我们重新把上面的代码copy一份在这里:
var sphere = BABYLON.MeshBuilder.CreateSphere('sphere', {segments:16, diameter:2}, scene);
这里表示创建一个名字为sphere的椭圆,半径为2,分16段,并且把这个椭圆放到scene场景中。
设置椭圆的位置
sphere.position.y = 1;
设置椭圆的位置。
创建一个底面
BABYLON.MeshBuilder.CreateGround函数是创建一个底面,代码如下:
// 创建一个内置的“地面”形状。 var ground = BABYLON.MeshBuilder.CreateGround('ground1', {height:6, width:6, subdivisions: 2}, scene);
底面的宽度,高度都是6,其实把他理解为长、宽可能更容易理解一些。
ok,讲了这么多,终于把createScene函数讲完了,现在我们需要调用它:
var scene = createScene();
好了,这里我建议你打开这段代码,看一下。
渲染循环
接下来的三行javascript代码非常重要,因为它们注册了一个渲染循环来重复渲染画布上的场景,什么是渲染循环,我们后面再给各位大大夜谈:
engine.runRenderLoop(function() { scene.render(); });
最后,我们监听一个canvas或者window 的resize事件,用于当窗口变化时,引擎也能适应大小:
window.addEventListener('resize', function() { engine.resize(); });
就是这样!保存文件并使用Web浏览器打开2.html。你应该看到以下结果,如果打开很慢,是因为下载文件很慢,不要慌张,我预计国外的网速需要2分钟。如果你嫌慢,可以直接打开 3.html,我把js文件,放在了本地,代码可以在这里下载[]()
为了让大家有更清晰的理解,我们将2.html的所有代码列出如下:
2.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html" charset="utf-8"/> <title>Babylon - Getting Started</title> <!--- Link to the last version of BabylonJS ---> <script src="https://cdn.babylonjs.com/babylon.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> window.addEventListener('DOMContentLoaded', function(){ // get the canvas DOM element var canvas = document.getElementById('renderCanvas'); // load the 3D engine var engine = new BABYLON.Engine(canvas, true); // createScene function that creates and return the scene var createScene = function(){ // create a basic BJS Scene object var scene = new BABYLON.Scene(engine); // create a FreeCamera, and set its position to (x:0, y:5, z:-10) var camera = new BABYLON.FreeCamera('camera1', new BABYLON.Vector3(0, 5,-10), scene); // target the camera to scene origin camera.setTarget(BABYLON.Vector3.Zero()); // attach the camera to the canvas camera.attachControl(canvas, false); // create a basic light, aiming 0,1,0 - meaning, to the sky var light = new BABYLON.HemisphericLight('light1', new BABYLON.Vector3(0,1,0), scene); // create a built-in "sphere" shape; its constructor takes 6 params: name, segment, diameter, scene, updatable, sideOrientation var sphere = BABYLON.Mesh.CreateSphere('sphere1', 16, 2, scene); // move the sphere upward 1/2 of its height sphere.position.y = 1; // create a built-in "ground" shape; var ground = BABYLON.Mesh.CreateGround('ground1', 6, 6, 2, scene); // return the created scene return scene; } // call the createScene function var scene = createScene(); // run the render loop engine.runRenderLoop(function(){ scene.render(); }); // the canvas/window resize event handler window.addEventListener('resize', function(){ engine.resize(); }); }); </script> </body> </html>
感谢大家
感谢大家的阅读,可能有很多概念大家还不太理解,不过没关系,知识像追女孩子,还是要花一些时间,才能和她发生点什么的。
原文地址:https://www.hellodemos.com/hello-babylonjs/babylonjs-playground.html
WEBGL学习网 » Babylonjs基础入门-Babylon.js第一个demo程序演示详细讲解