72. 模型加载进度条

web3d可视化项目开发,很多时候,3D模型的大小要比普通前端项目的文件大得多,这时候往往需要设置一个进度条,表示模型的加载进度。

进度条HTML、CSS、JavaScript代码

课件中提供的是用原生HTML、CSS、JavaScript代码写的一个进度条,当然实际开发的时候,你可以不自己写,选择成熟的UI组件库,比如你使用vue技术栈的Element-ui进度条组件。

建议:正式学习后面threejs代码之前,你可以先自己把下面进度条CSS代码写一遍,然后再学习后面内容。

<head>
    <style>
        /* 进度条css样式 */
        #container {
            position: absolute;
            width: 400px;
            height: 16px;
            top: 50%;
            left:50%;
            margin-left: -200px;
            margin-top: -8px;
            border-radius: 8px;           
            border: 1px solid #009999;          
            overflow: hidden;
        }
        #per {
            height: 100%;
            width: 0px;
            background: #00ffff;
            color: #00ffff;
            line-height: 15px;          
        }
    </style>
</head>
<body style="background-color: #001111;">
    <div id="container">
        <!-- 进度条 -->
        <div id="per"> </div>
    </div>
    <script>        
        const percentDiv = document.getElementById("per");// 获取进度条元素
        percentDiv.style.width = 0.8*400 + "px";//进度条元素长度
        percentDiv.style.textIndent = 0.8*400 + 5 +"px";//缩进元素中的首行文本
        percentDiv.innerHTML =  "80%";//进度百分比
    </script>
</body>

加载器查看模型加载进度

gltf模型加载进度具体语法可以查看GLTFLoader文档。

loader.load(模型路径,加载完成函数,加载过程函数)

模型本身是有大小的,通过浏览器从服务器加载的时候,本身网络传输是需要时间的。

.load()方法的参数2是一个函数,参数2函数是模型加载完成以后才会被调用执行。

.load()方法的参数3是一个函数,通过函数的参数获取模型加载信息,每当模型加载部分内容,该函数就会被调用,一次加载过程中一般会被调用多次,直到模型加载完成。

loader.load("../工厂.glb", function (gltf) {
    model.add(gltf.scene);
}, function (xhr) {
    // 控制台查看加载进度xhr
    // 通过加载进度xhr可以控制前端进度条进度   
    const percent = xhr.loaded / xhr.total;
    console.log('加载进度' + percent);
})

加载进度控制进度条

把案例源码原生HTML、CSS进度条.html中进度条的HTML、CSS、JavaScript代码复制到threejs代码中,修改即可。

loader.load("../工厂.glb", function (gltf) {
    model.add(gltf.scene);
}, function (xhr) {
    const percent = xhr.loaded / xhr.total;
    // console.log('加载进度' + percent);
    percentDiv.style.width = percent * 400 + "px"; //进度条元素长度
    percentDiv.style.textIndent = percent * 400 + 5 + "px"; //缩进元素中的首行文本
    // Math.floor:小数加载进度取整
    percentDiv.innerHTML = Math.floor(percent * 100) + '%'; //进度百分比
})

加载完成隐藏进度条

threejs模型加载完成后,就不需要显示进度条,可以通过.style.display属性设置,也可以通过.style.visibility属性隐藏进度条。

loader.load("../工厂.glb", function (gltf) {
    model.add(gltf.scene);
    // 加载完成,隐藏进度条
    // document.getElementById("container").style.visibility ='hidden';
    document.getElementById("container").style.display = 'none';
}, function (xhr) { 
    const percent = xhr.loaded / xhr.total;
    console.log('加载进度' + percent);
})
要在three.js中加载多个模型并显示加载进度条,你可以使用 `THREE.LoadingManager` 和 `THREE.GLTFLoader`。以下是一个基本示例: ```javascript // 创建加载管理器 var manager = new THREE.LoadingManager(); // 创建加载器 var loader = new THREE.GLTFLoader(manager); // 创建场景 var scene = new THREE.Scene(); // 创建进度条 var progressbar = document.getElementById('progressbar'); // 计算加载进度 manager.onProgress = function(item, loaded, total) { var progress = loaded / total; progressbar.style.width = progress * 100 + '%'; if (progress === 1) { // 加载完成后隐藏进度条 progressbar.style.display = 'none'; } }; // 加载模型 loader.load('model1.gltf', function(gltf) { scene.add(gltf.scene); }); loader.load('model2.gltf', function(gltf) { scene.add(gltf.scene); }); // 渲染场景 var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); } animate(); ``` 在这个示例中,我们创建了一个 `THREE.LoadingManager` 和一个 `THREE.GLTFLoader`。然后我们为 `manager.onProgress` 设置了一个回调函数,该函数会在每次加载完成模型时更新进度条。最后,我们使用 `loader.load` 加载了两个模型并将它们添加到场景中。 你需要在 HTML 中创建一个具有 `id="progressbar"` 的元素,该元素将作为进度条。例如: ```html <div id="progressbar"></div> ``` 你还需要在 CSS 中为进度条定义样式,例如: ```css #progressbar { width: 0%; height: 10px; background-color: #ccc; transition: width 0.2s ease-in-out; } ``` 这将创建一个灰色的进度条。当加载完成后,进度条将自动隐藏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值