babylon.js 学习笔记(1)
简单来说,babylon.js 是一个能跑在浏览器上的(3D)游戏渲染引擎,而且官方提供了一个友好在线交互学习平台Playground,其开源项目在github上star数截止2023.05.14高达20.6K。下面是官方文档的学习笔记 :
一、hello world
强烈建议新手通过Playground在线体验,先来看第1个示例:
核心代码如下:(关键地方已加注释)
//核心代码
var createScene = function () {
// 创建babylon场景(或者叫"舞台"更容易理解)
var scene = new BABYLON.Scene(engine); // 新建1个摄像机(对着舞台,有兴趣的同学可以调整下0, 5, -10这几个参数值,可以分别控制x,y,z三个轴的观察视角)
var camera = new BABYLON.FreeCamera("camera1", new BABYLON.Vector3(0, 5, -10), scene); // 将摄像机的目标正对场景中心
camera.setTarget(BABYLON.Vector3.Zero()); //摄像头与canvas关联后,鼠标就能控制目标旋转、放大、缩小等动作
camera.attachControl(canvas, true); //光源(想象一下舞台上,演员表演时,要有聚光灯照在主角身上)
var light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0), scene); // 控制光源的亮度
light.intensity = 0.7; //在scene上放置1个球(diameter-直径,segments -边的个数,越大球看起来越圆润,有兴趣的,可以把segments调整成1对比看看)
var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", { diameter: 2, segments: 32 }, scene); //将球向上移1/2的高度(即:让球底部在场景中心点之上,默认y=0,球心与场景中心重合)
sphere.position.y = 1; //放一块"地板"在场景中央(长宽均为6,即正方形)
var ground = BABYLON.MeshBuilder.CreateGround("ground", { width: 6, height: 6 }, scene); return scene;
};

上面这段代码不用死记,理解scene、camera、light、mesh 这4要素即可。
运行效果:

在线地址:https://yjmyzz.github.io/babylon_js_study/day01/01.html
二、设置Groud为红色
可以给地板换个颜色
//核心代码
var createScene = function () {
... //放一块"地板"在场景中央(长宽均为6,即正方形)
var ground = BABYLON.MeshBuilder.CreateGround("ground", { width: 6, height: 6 }, scene); //!!!设置地板为红色
let groundMaterial = new BABYLON.StandardMaterial("Ground Material", scene);
ground.material = groundMaterial;
ground.material.diffuseColor = BABYLON.Color3.Red(); return scene;
};
运行效果:

在线地址:https://yjmyzz.github.io/babylon_js_study/day01/02.html
三、地板贴图
//核心代码
var createScene = function () {
... //放一块"地板"在场景中央(长宽均为6,即正方形)
var ground = BABYLON.MeshBuilder.CreateGround("ground", { width: 6, height: 6 }, scene); let groundMaterial = new BABYLON.StandardMaterial("Ground Material", scene);
ground.material = groundMaterial; //!!!设置地板贴上红黑相间的方块
let groundTexture = new BABYLON.Texture(Assets.textures.checkerboard_basecolor_png.rootUrl, scene);
ground.material.diffuseTexture = groundTexture; return scene;
};

在线地址:https://yjmyzz.github.io/babylon_js_study/day01/03.html
四、添加复杂对象
//核心代码
var createScene = function () {
... //设置地板贴上红黑相间的方块
let groundTexture = new BABYLON.Texture(Assets.textures.checkerboard_basecolor_png.rootUrl, scene);
ground.material.diffuseTexture = groundTexture; //加1个小怪物
BABYLON.SceneLoader.ImportMesh("", Assets.meshes.Yeti.rootUrl, Assets.meshes.Yeti.filename, scene, function (newMeshes) {
newMeshes[0].scaling = new BABYLON.Vector3(0.1, 0.1, 0.1);
}); return scene;
};

注:由于球体部分的代码,并没有去掉,所以最终球跟小怪物是叠加在一起的,形成了1对奇怪的组合。
在线地址: https://yjmyzz.github.io/babylon_js_study/day01/04.html(小怪物加载需要一点时间,打开网页时要等一会儿)
tips:任何复杂的对象(即mesh),都是一堆小三角形及各种切面的组合,三角形数越多,最终的对象越逼真。借用一张官网的图体会下:

这里可以做1个小测试,把球体的segments值,调成1个很小的值,比如4
var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", { diameter: 2, segments: 4 }, scene);

就能发现球不那么圆润了。
五、改变摄像机
//核心代码
var createScene = function () {
... // 新建1个摄像机(对着舞台,有兴趣的同学可以调整下0, 5, -10这几个参数值,可以分别控制x,y,z三个轴的观察视角)
// var camera = new BABYLON.FreeCamera("camera1", new BABYLON.Vector3(0, 5, -10), scene);
var camera = new BABYLON.ArcRotateCamera("camera", BABYLON.Tools.ToRadians(90), BABYLON.Tools.ToRadians(65), 10, BABYLON.Vector3.Zero(), scene); ... // //在scene上放置1个球(diameter-直径,segments -边的个数,越大球看起来越圆润,有兴趣的,可以把segments调整成1对比看看)
// var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", { diameter: 2, segments: 32 }, scene); // //将球向上移1/2的高度(即:让球底部在场景中心点之上,默认y=0,球心与场景中心重合)
// sphere.position.y = 1; ... return scene;
};
换了1种摄像机,同时把球体去掉后

在线地址:https://yjmyzz.github.io/babylon_js_study/day01/05.html
babylon.js 学习笔记(1)的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- JS 学习笔记--9---变量-作用域-内存相关
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
- WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)
WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...
- WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法
WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...
- WebGL three.js学习笔记 创建three.js代码的基本框架
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
- vue.js 学习笔记3——TypeScript
目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...
- 2019-4-29 js学习笔记
js学习笔记一:js数据类型 1:基本数据类型 number类型(整数,小数) String类型 boolean类型 NaN类型其实是一个nu ...
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
- JS学习笔记5_DOM
1.DOM节点的常用属性(所有节点都支持) nodeType:元素1,属性2,文本3 nodeName:元素标签名的大写形式 nodeValue:元素节点为null,文本节点为文本内容,属性节点为属性 ...
随机推荐
- Java线程控制: sleep、yield、join深度解析
结论先行 sleep:主动让出CPU但保持锁,适合控制执行节奏和优化CPU占用 yield:建议让出CPU但无强制力,适用场景有限且效果不稳定 join:通过等待机制实现线程顺序控制,底层基于wait ...
- 在postman中为每个测试用例添加相同的请求头
最近在学习的时候看到可以在postman中可以为每个测试用例添加相同的请求头,这个就不用单独去设置了,可以说是非常好用,遂记录一下. 具体设置如下: https://postman.org.cn/
- 在鸿蒙Next中开发一个月历组件
最近一直在出差,工作繁忙,很久没有时间更新文章了,连华为开发者大会也错过了.今天周末,忙里偷闲给大家分享一个鸿蒙月历组件. 这样的组件大家在工作中应该经常会遇到,而鸿蒙又没有提供一个这样的系统组件,今 ...
- 环境搭建: Vue3+Echarts5+vue-eharts + 移动端rem适配
对于数据可视化的最后一站, 就是移动数据报表的展示, 毕竟手机端的适普性, 便携性, 灵活性更高. 包括我自己也是更多在移动端进行轻量办公. 而用主流的商业BI平台在PC端的体验基本可打80分, 而在 ...
- 推荐一个Elasticsearch ES可视化客户端工具:ES-King,支持win、mac、linux
ES-King:开源免费,一个现代.实用的ES GUI客户端,支持多平台. 下载地址:https://github.com/Bronya0/ES-King 我之前开源的kafka客户端kafka-ki ...
- 轻松掌握Manim的.animate语法:让动画编程更简单
在Manim中,.animate语法是一个非常实用的功能,它能让你的动画代码变得更加简洁和直观. 本文将详细介绍.animate语法,看看它是如何让动画制作变得更加简单又有趣,即使是编程新手也能轻松上 ...
- InheritableThreadLocal父子线程变量共享实现原理
概述 我们知道ThreadLocal 的设计初衷是为了解决多线程并发导致的线程安全问题,向每一个线程提供一个自己的变量副本,实现变量隔离.那如何在不同线程之间共享变量呢?InheritableTh ...
- socket编程浅知识
1:网络7层和tcp/ip5层 tcp协议; 三次握手 四次挥手 使用字节流进行信息交互 2:IP和端口 ip: 计算机在网络里面的唯一标识 端口: 程序在电脑里面的唯一标识 3: socket编 ...
- STM32深度学习实战
STM32深度学习实战 1. 前言 本文主要记录基于 tensorflow 的简单模型在 stm32 上运行测试的调试记录,开发人员应对深度学习基础理论和 tensorflow 框架基础操作有一定 ...
- 大模型学习笔记(一)—— transformer
写在前面,一定要看懂self attention的代码实现,注意矩阵乘是谁@谁,矩阵乘不可以变换位置!!! Attention的出现 由于翻译任务往往不是1 vs 1的翻译,因此输入与输出不等长,所以 ...