babylon.js中如何在场景渲染时或者数据加载时现实加载中动画

在babylon.js中数据加载和渲染是异步执行的,这中间就会有等待的时间,那这时间内,如何实现我们的动画呢?我们如何知道模型加载了多少?什么时候结束?当模型比较大,渲染时间较长,我们怎么知道场景什么时候渲染完成了呢?下面我们就一起探索一下

异步加载模型

babylon.js中提供了大量的加载不同格式的数据的类,在不借助插件的情况下gLTF, obj, stl等常见的数据格式,最常用的例如

BABYLON.SceneLoader.Append("./", "duck.gltf", scene, function (scene) {
  // do something with the scene
});

通过这些常用的方法,模型会在加载和渲染的时候用默认的加载中动画,这方法好处就是用法简单,而且这个加载中的动画也不丑;但是会有一个缺点,可能你已经发现了,你没有办法再回调中获取到加载进来的模型,只能在场景中便利找到,还有加载的进度也看不到

那如何自定义动画或者获取模型加载的进度呢

首先要加载动画我们就需要先隐藏默认的动画,方法如下

    engine.hideLoadingUI = () => {

    }

加载模型不再用上面那个方法,而是用BABYLON.SceneLoader.LoadAssetContainer,由于也是异步的我们封住一下返回一个Promise然后用async.await的方式调用,看起来更加简介

    public loadAsset(
        rootUrl: string,
        sceneFilename: string,
        callback?: (event: BABYLON.ISceneLoaderProgressEvent) => void
    ): Promise<BABYLON.AssetContainer> {
        return new Promise((resolve, reject) => {
            BABYLON.SceneLoader.LoadAssetContainer(
                rootUrl,
                sceneFilename,
                this._scene,
                (container) => {
                    resolve(container);
                },
                (evt) => {
                    callback && callback(evt);
                },
                () => {
                    reject(null);
                }
            );
        });

用此方法的好处就是我们在回调中拿到的就是我们刚刚加载的模型,而不用去便利整个场景,而且回调里面也有我们要的加载进度数据,最后我们可以在scene.executeWhenReady将动画隐藏,该方法会在数据加载并渲染完成后执行

    scene.executeWhenReady(() => {
      map.showSceneLoading = false
      engine.runRenderLoop(() => {
        scene.render();
      });
    })

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Babylon.js 加载 FBX 模型,需要使用 `BABYLON.SceneLoader.ImportMesh()` 方法。以下是一个简单的示例,假设您已经将 Babylon.js 库引入到 HTML 文件: ```html <!DOCTYPE html> <html> <head> <title>Babylon.js FBX Loading Example</title> <script src="https://cdn.babylonjs.com/babylon.js"></script> <script src="https://cdn.babylonjs.com/loaders/babylonjs.loaders.min.js"></script> </head> <body> <canvas id="renderCanvas"></canvas> <script> var canvas = document.getElementById("renderCanvas"); var engine = new BABYLON.Engine(canvas, true); // 创建场景 var createScene = function () { var scene = new BABYLON.Scene(engine); // 加载 FBX 模型 BABYLON.SceneLoader.ImportMesh("", "path/to/fbx/file/", "model.fbx", scene, function (newMeshes) { // 可以在这里对模型进行一些操作 }); // 地面 var ground = BABYLON.MeshBuilder.CreateGround("ground", {width: 10, height: 10}, scene); // 灯光 var light = new BABYLON.PointLight("light", new BABYLON.Vector3(0, 1, 0), scene); return scene; } var scene = createScene(); engine.runRenderLoop(function () { scene.render(); }); </script> </body> </html> ``` 在上面的示例,`BABYLON.SceneLoader.ImportMesh()` 方法的第一个参数是用于命名所加载模型的根节点的字符串。第二个参数是 FBX 文件所在的目录路径。第三个参数是 FBX 模型文件名。第四个参数是场景对象,用于在场景加载模型。第五个参数是回调函数,用于在 FBX 文件加载完成后执行一些操作,比如设置动画等。 注意:加载 FBX 模型需要使用 `babylonjs.loaders.min.js` 库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值