欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > babylon.js-2:基本元素介绍

babylon.js-2:基本元素介绍

2025/4/3 15:08:00 来源:https://blog.csdn.net/weixin_45687201/article/details/145356307  浏览:    关键词:babylon.js-2:基本元素介绍

babylon.js-2:基本元素介绍

该章节主要介绍 BABYLON 的基本元素,其旨意是让读者对 BABYLON 有一个整体的认识,然后在后续的章节中,逐步深入。

文章目录

  • babylon.js-2:基本元素介绍
    • 1. 核心库
    • 2. 画布
    • 3. 引擎
    • 4. 场景
    • 5. 灯光
    • 6. 相机
    • 7. 网格
    • 8. 效果展示 & 交互
    • 9. 材质
    • 10. 纹理
    • 11. 动画
    • 总结

1. 核心库

第一步,引入核心库:

<!-- 引入核心库 -->
<head><script src="https://cdn.babylonjs.com/babylon.js"></script>
</head>

2. 画布

第二步,定义一个 canvas 画布:

<!-- 定义画布 -->
<body><canvas id="renderCanvas"></canvas>
</body>
// 获取画布
var canvas = document.getElementById("renderCanvas");

3. 引擎

第三步,创建一个引擎:

// 创建引擎
var engine = new BABYLON.Engine(canvas, true);
  • 参数1 - canvasOrContext:画布

  • 参数2 - antialias:是否开启抗锯齿(默认关闭)

4. 场景

第四步,创建一个场景:

// 创建场景
var scene = new BABYLON.Scene(engine);
  • 参数1 - engine:定义用于渲染此场景的引擎

5. 灯光

第五步,创建一个灯光:

// 创建灯光
var light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0), scene);
  • 参数1 - name:灯光名称
  • 参数2 - direction:灯光位置
  • 参数3 - scene:灯光所在场景

说明:

  • new BABYLON.Vector3(0, 1, 0) 表示灯光位置在场景的上方,等价于 BABYLON.Vector3.Up()

6. 相机

第六步,创建一个相机:

// 创建相机
var camera = new BABYLON.ArcRotateCamera("camera", Math.PI / 3, Math.PI / 3, 10, BABYLON.Vector3.Zero(), scene);
  • 参数1 - name:相机名称
  • 参数2 - alpha:相机水平位置
  • 参数3 - beta:相机垂直位置
  • 参数4 - radius:相机距离
  • 参数5 - target:相机目标点
  • 参数6 - scene:相机所在场景

说明:

  • BABYLON.Vector3.Zero() 表示相机目标点在场景的原点,等价于 new BABYLON.Vector3(0,0,0)

相机位置示意图
在这里插入图片描述

7. 网格

第七步,创建一个网格:

// 创建网格
var box = BABYLON.MeshBuilder.CreateBox("box",{ size: 1 }, scene);
  • 参数1 - name:网格名称
  • 参数2 - options:网格参数
  • 参数3 - scene:网格所在场景

说明:

  • { size: 1 } 表示网格大小为 1。也可以写成 { width: 1, height: 1, depth: 1 }

8. 效果展示 & 交互

第八步,展示效果:

到了这一步,我们已经创建了一个基本的场景,接下来,我们需要展示这个场景:

  • 安装 Live Server 插件
    在这里插入图片描述

  • 右键点击 html 文件,选择 “Open with Five Server” 在浏览器中打开

  • 如果你看到一个空白页面以及控制台无明显报错,说明你已经成功了!你只需要添加这段代码:

    // 启动渲染循环
    engine.runRenderLoop(function () {// 渲染场景scene.render();
    });
    
    • engine.runRenderLoopEngine 对象的一个方法,它的作用是启动一个渲染循环。这个渲染循环是一个持续运行的函数,在每一个帧(frame)中都会被调用。
    • 在浏览器环境下,这个循环通常与浏览器的 requestAnimationFrame 机制相结合,以确保在每一帧中更新并渲染 3D 场景,从而实现流畅的动画效果。
    • 如果你想停止渲染循环,可以使用 engine.stopRenderLoop 方法。
  • 设置页面及画布的大小

     <style>html,body {overflow: hidden;width: 100%;height: 100%;margin: 0;padding: 0;}#renderCanvas {width: 100%;height: 100%;touch-action: none;}
    </style>
    
  • 添加相机交互效果

    // 相机交互
    camera.attachControl(canvas, true);
    
    • 如果你想取消用户对相机的控制,可以使用 camera.detachControl; 方法,它会解除相机与指定画布的关联,用户将无法再通过鼠标和键盘控制相机。

    🎉🎉🎉 恭喜你完成了自己的第一个 3D 场景!回顾 babylon.js-1:入门篇

9. 材质

第九步,创建一个材质:

// 创建材质
var material = new BABYLON.StandardMaterial("material", scene);

给方才创建的网格添加红色材质显得喜庆一些。

// 创建材质
material.diffuseColor = new BABYLON.Color3(1, 0, 0);
box.material = material;

说明:

  • new BABYLON.Color3(1, 0, 0) 表示红色,等同于 BABYLON.Color3.Red()

颜色的拓展:

// 注意:它们是不需要 new , 因为它们是静态的
BABYLON.Color3.Random(); // 随机颜色
BABYLON.Color3.Red(); // 红色

当前节点 javascript 核心代码

const canvas = document.getElementById('renderCanvas');
const engine = new BABYLON.Engine(canvas);
const scene = new BABYLON.Scene(engine);
const light = new BABYLON.HemisphericLight('light', new BABYLON.Vector3(0, 1, 0), scene);
const camera = new BABYLON.ArcRotateCamera('camera', Math.PI / 3, Math.PI / 3, 10, BABYLON.Vector3.Zero(), scene);
camera.attachControl(canvas, true);
const box = BABYLON.MeshBuilder.CreateBox('box', { size: 1 }, scene);
const material = new BABYLON.StandardMaterial('material', scene);
material.diffuseColor = new BABYLON.Color3(1, 0, 0);
box.material = material;engine.runRenderLoop(function () {scene.render();
});

10. 纹理

第十步,创建一个纹理:

// 创建纹理
var texture = new BABYLON.Texture('./crate.png', scene);
  • 参数1 - url:纹理路径
  • 参数2 - scene:纹理所在场景
// 给网格添加纹理
material.diffuseTexture = texture;
box.material = material;

当前节点 javascript 核心代码

const canvas = document.getElementById('renderCanvas');
const engine = new BABYLON.Engine(canvas);
const scene = new BABYLON.Scene(engine);
const light = new BABYLON.HemisphericLight('light', new BABYLON.Vector3(0, 1, 0), scene);
const camera = new BABYLON.ArcRotateCamera('camera', Math.PI / 3, Math.PI / 3, 10, BABYLON.Vector3.Zero(), scene);
camera.attachControl(canvas, true);
const box = BABYLON.MeshBuilder.CreateBox('box', { size: 1 }, scene);
const material = new BABYLON.StandardMaterial('material', scene);
material.diffuseColor = new BABYLON.Color3(1, 0, 0);// 创建纹理
var texture = new BABYLON.Texture('./crate.png', scene);
material.diffuseTexture = texture;// 给网格盒子添加纹理效果
box.material = material;engine.runRenderLoop(function () {scene.render();
});

箱子素材

在这里插入图片描述

11. 动画

第十一步,创建一个动画:

// 创建动画
var animation = new BABYLON.Animation('animation', 'rotation.y', 30, BABYLON.Animation.ANIMATIONTYPE_FLOAT, BABYLON.Animation.ANIMATIONLOOPMODE_RELATIVE);
  • 参数1 - name:动画名称
  • 参数2 - targetProperty:要设置动画的属性
  • 参数3 - framePerSecond:动画帧率
  • 参数4 - dataType:动画类型
  • 参数5 - loopMode:动画循环模式

说明:

  • rotation.y 表示旋转的 Y 轴,即绕 Y 轴旋转。
  • BABYLON.Animation.ANIMATIONTYPE_FLOAT 表示动画类型为浮点数。
  • BABYLON.Animation.ANIMATIONLOOPMODE_RELATIVE 表示动画循环模式为相对循环。

设置动画关键帧:

// 定义动画关键帧
var keys = [];
keys.push({frame: 0,value: 0
});
keys.push({frame: 150,value: Math.PI * 2
});
// 添加关键帧
animation.setKeys(keys);
// 给盒子添加动画
box.animations = [animation];
// 播放动画
scene.beginAnimation(box, 0, 150, true);

说明:

  • 除了 scene.beginAnimation 方法外,还可使用 beginDirectAnimation 方法来开始动画。

  • beginDirectAnimation 的使用方式:

    scene.beginDirectAnimation(box, [animation], 0, 150, true);
    
  • 可以使用 scene.stopAnimation 方法来停止动画。

setKeys

setKeys(values: IAnimationKey[], dontClone?: boolean): void
  • 参数1 - values:动画关键帧数组
  • 参数2 - dontClone:是否克隆(默认值为false)

beginAnimation

beginAnimation(target: any,from: number,to: number,loop?: boolean
): Animatable
  • 参数1 - target:动画目标
  • 参数2 - from:动画开始帧
  • 参数3 - to:动画结束帧
  • 参数4 - loop:是否循环(默认值为false)

总结

最后,来看看整体代码实现的效果!

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词