mar3d模型文件问题

news2024/11/15 7:26:56

上一章使用mars3D模型库 遗留一个问题 部分资源不完整
如果模型没有其他依赖文件会正常加载 若有其他依赖就会报错


正常获取到的

在这里插入图片描述

缺少文件的

在这里插入图片描述
经过观察在gltf文件中发现缺失的是这几个文件
在这里插入图片描述

还是通过脚本下载

脚本实例

const fs = require('fs');
const path = require('path');
const http = require('http');
const https = require('https');
const jsonfile = require('jsonfile');

// 设置文件夹路径
const directoryPath = path.join(__dirname, '你的文件夹路径');

// 处理下载文件的最大重试次数
const maxRetries = 3;
const retryDelay = 5000; // 5 秒延迟

// 下载文件函数
const downloadFile = (url, outputPath, retries = 0) => {
    return new Promise((resolve, reject) => {
        console.log(`Downloading: ${url}`);  // 打印 URL 进行调试

        const protocol = url.startsWith('https') ? https : http;
        http.get(url, (response) => {
            if (response.statusCode === 429 && retries < maxRetries) {
                console.log(`遇到 429 错误,重试 ${retries + 1} 次...`);
                setTimeout(() => {
                    downloadFile(url, outputPath, retries + 1)
                        .then(resolve)
                        .catch(reject);
                }, retryDelay);
                return;
            }

            if (response.statusCode !== 200) {
                return reject(new Error(`下载失败,状态码: ${response.statusCode}`));
            }

            const fileStream = fs.createWriteStream(outputPath);
            response.pipe(fileStream);

            fileStream.on('finish', () => {
                fileStream.close(resolve);
            });

            fileStream.on('error', (err) => {
                fs.unlink(outputPath, () => reject(err));
            });
        }).on('error', (err) => {
            reject(err);
        });
    });
};

// 处理所有下载任务的队列
const downloadQueue = [];

// 递归函数来读取目录
const readDirectoryRecursively = (dir) => {
    fs.readdir(dir, { withFileTypes: true }, (err, entries) => {
        if (err) {
            return console.error('读取目录失败:', err);
        }

        entries.forEach(entry => {
            const fullPath = path.join(dir, entry.name);

            if (entry.isDirectory()) {
                // 递归处理子目录
                readDirectoryRecursively(fullPath);
            } else if (path.extname(entry.name) === '.gltf') {
                // 处理 .gltf 文件
                jsonfile.readFile(fullPath, (err, json) => {
                    if (err) {
                        return console.error('读取文件失败:', err);
                    }

                    const baseUrl = 'http://data.mars3d.cn/gltf/imap/';

                    // 处理 images 属性
                    if (json.images && Array.isArray(json.images)) {
                        json.images.forEach((image) => {
                            if (image.uri) {
                                const imageUrl = new URL(image.uri, baseUrl + path.relative(directoryPath, dir) + '/').href;
                                const imageOutputPath = path.join(dir, image.uri);
                                downloadQueue.push(() => downloadFile(imageUrl, imageOutputPath));
                            }
                        });
                    }

                    // 处理 buffers 属性
                    if (json.buffers && Array.isArray(json.buffers)) {
                        json.buffers.forEach((buffer) => {
                            if (buffer.uri) {
                                const bufferUrl = new URL(buffer.uri, baseUrl + path.relative(directoryPath, dir) + '/').href;
                                const bufferOutputPath = path.join(dir, buffer.uri);
                                downloadQueue.push(() => downloadFile(bufferUrl, bufferOutputPath));
                            }
                        });
                    }

                    // 开始处理下载队列
                    processDownloadQueue();
                });
            }
        });
    });
};

// 处理下载队列的函数
const processDownloadQueue = () => {
    if (downloadQueue.length === 0) {
        console.log('所有文件下载完成');
        return;
    }

    const downloadTask = downloadQueue.shift();
    downloadTask()
        .then(() => {
            console.log('文件下载完成,开始下载下一个文件');
            processDownloadQueue(); // 下载完成后继续下载下一个文件
        })
        .catch((error) => {
            console.error('下载过程中出现错误:', error);
            processDownloadQueue(); // 错误处理后继续下载下一个文件
        });
};

// 启动递归读取
readDirectoryRecursively(directoryPath);


在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Idea中修改Jsp文件的头部注释模版

文章目录 方法1&#xff0c;启动idea&#xff0c;单击“file”&#xff0c;选择“settings”2&#xff0c;选择Editor——File and Code Templates——other——Jsp files——jsp File.jsp。此时编辑如下图所示的右上区域即可修改模板。 每天学一个小技巧 方法 1&#xff0c;启…

FL Studio 24汉化破解版 v24.4.1.4285(附汉化破解补丁)

FL Studio 24.4.1.4285(汉化破解版是一款无比专业的音乐制作软件&#xff0c;它无论是在功能上还是用户界面都是在业内数一数二的。就拿它的用户界面来说&#xff0c;是目前同类软件中唯一做到100%矢量化&#xff0c;这样能更好地用在4K&#xff0c;5K甚至8K显示器上&#xff0…

力扣面试经典算法150题:Z 字形变换

Z 字形变换 今天的题目是力扣面试经典150题中的数组的中等难度题&#xff1a; Z 字形变换。 题目链接&#xff1a;https://leetcode.cn/problems/zigzag-conversion/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 将一个给定字符串 s 根据给定的行…

Jmeter 的 jar 包开发环境搭建

01 JDK环境变量配置 JAVA_HOMEE:\Program Files\Java\jdk1.8.0_102 Path%JAVA_HOME%\bin; CLASSPATH.;%JAVA_HOME%\lib\dt.jar;.;%JAVA_HOME%\lib\tools.jar 验证环境变量有没有生效&#xff1a;看到如下信息说明 JDK 环境变量已经生效 02 配置 maven 环境 1、下载地址&…

js中数组的定义及使用

数组的定义 Array 存储按位存储&#xff0c;紧密结构,在数组中查找元素&#xff0c;就必须要遍历数组&#xff0c;查找速度慢。 优点可以根据当前元素找到前一个或者后一个元素&#xff0c;可以排序 数组引用对象的是强引用&#xff0c;存储的是她的引用地址 length属性可读可…

TF | SD 卡出现无法删除的文件,乱码文件该如何处理 macOS

TF | SD 卡出现无法删除的文件&#xff0c;乱码文件该如何处理 macOS 一、问题描述 最近手头有张用在 Miyoo 掌机上的游戏 TF 卡&#xff0c;在macOS 系统下在回收站中出现了几个特殊文件名的文件&#xff0c;始终无法删除。 二、试着解决 我试过了网上的所有方法都无法删除…

rv1126-rv1109-mkcramfs-mkfs.cramfs-打包文件系统

事情是这样的: 定制了文件系统打包功能;然后我是根据这个指令 fakeroot mkfs.cramfs rootfs_glibc_rv1126/ rootfs.img mkfs.cramfs rootfs_glibc_rv1126/ rootfs.img 起因就是这个fakeroot; 不加的话打出来的rootfs.img是没有用户权限的 然后我根据fakeroot mkfs.cramfs ro…

米壳AI:跨境电商日本市场必备神器!

各位跨境电商小伙伴们&#xff0c;在开拓日本市场的过程中&#xff0c;产品图片的翻译问题是不是常常让你感到困扰呢&#xff1f; 别着急&#xff0c;今天就给大家推荐一个超棒的在线翻译工具--米壳AI&#xff0c;它必将成为你跨境之路上的得力助手&#xff0c;让你如虎添翼。…

网络-多路io

了 fcntl 函数来操作文件描述符的状态标志&#xff0c;其中主要是为了设置非阻塞模式。下面是对 fcntl 函数及其参数的详细解释&#xff1a; fcntl 函数 fcntl 是一个用于操作文件描述符的系统调用&#xff0c;可以用来设置或获取文件描述符的各种属性。其原型如下&#xff1…

Django学习实战篇二(适合略有基础的新手小白学习)(从0开发项目)

前言&#xff1a; 从这一章开始&#xff0c;我们来创建项目typeidea&#xff0c;我把它放到了GitHub上。强烈建议你也到GitHub上注册一个账号&#xff08;如果没有的话&#xff09;&#xff0c;然后创建这样的项目。当然&#xff0c;你也可以起一个属于自己的名称。这个项目就是…

tensorrt plugin

自定义plugin 流程 首先明确要开发的算子&#xff0c;最好是 CUDA 实现&#xff1b;继承 IPluginV2DynamicExt / IPluginV2IOExt类实现一个Plugin 类&#xff0c;在这里调用前面实现的算子&#xff1b;继承 IPluginCreator 类实现一个 PluginCreator 类&#xff0c;用于创建插…

【数据结构取经之路】布隆过滤器BloomFilter原理、误判率推导、代码实现

目录 背景介绍 简介 布隆过滤器的实现思路 布隆过滤器的作用 布隆过滤器误判率推导过程 布隆过滤器的实现 布隆过滤器的删除问题 布隆过滤器的优缺点 布隆过滤器的应用 背景介绍 在一些场景下面&#xff0c;有大量数据需要判断是否存在&#xff0c;而这些数据不是整…

物联网之MQTT

一&#xff0c;MQTT 及其在物联网中的应用 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff0c;设计用于低带宽、延迟高、不稳定的网络环境&#xff0c;特别适合物联网&#xff08;IoT&#xff09;应用。它采用了发布/订…

案例 | 稳石机器人赋能日化企业内部物流提质增效

近年来&#xff0c;日化产业高速发展&#xff0c;以“清洁类”及“化妆品类”为主的日化品在人们生活中扮演着不可或缺的角色。然而在发展过程中&#xff0c;诸多难点也开始显头&#xff0c;招工难用工贵、生产速度受到掣肘等难题&#xff0c;都对日化企业可持续发展构成挑战。…

智慧安防EasyCVR视频监控汇聚管理平台云端录像时间轴拖动不跳转,是什么原因?

视频汇聚EasyCVR视频智能管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力&#xff0c;为各行各业的视频监控需求提供了优秀的解决方案。EasyCVR平台支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、…

国产SaaS的挑战与未来:探索用户增长的新路径

在数字化转型的浪潮中&#xff0c;SaaS&#xff08;软件即服务&#xff09;行业扮演着至关重要的角色&#xff0c;为企业提供了灵活、高效的数字化解决方案。然而&#xff0c;国产SaaS行业在快速发展的同时&#xff0c;也面临着诸多挑战&#xff0c;包括客户定制化需求高、市场…

上门家政系统源码开发详解

引言 随着现代生活节奏的加快&#xff0c;越来越多的家庭选择聘请家政服务人员来解决日常生活中诸如清洁、烹饪等琐事。面对这一市场需求&#xff0c;开发一个高效的上门家政服务系统显得尤为重要。本文旨在探讨如何构建这样一个系统&#xff0c;并分享一些开发过程中需要注意的…

五、代理模式

代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一个代理以控制对这个对象的访问。代理对象通常会对真实对象的请求进行一些处理&#xff08;例如延迟初始化、访问控制、日志记录等&#xff09;&#xff0c;它能够在不改变目标…

K8s搭建过程,新手闭眼入!!!超详细教程

一、k8s搭建harbor仓库 前提&#xff1a;在另一台主机已搭建好harbor私人仓库&#xff0c;之前博客中有详细记录 环境&#xff1a;准备三台主机&#xff0c;一台master&#xff0c;一台node1&#xff0c;一台noed2 1.本地解析 将harbor镜像仓库所在的主机的域名写在所有主机…

Redis String 类型详解:操作命令、底层编码与使用案例

文章目录 一 . 常见命令1.1 set1.2 get1.3 mset、mget1.4 setnx、setex、psetex1.5 incr、incrby1.6 decr、decrby、incrbyfloat1.7 append1.8 getrange1.9 setrange1.10 strlen小结 二 . string 的编码方式三 . 应用场景3.1 缓存3.2 计数器3.3 共享会话3.4 手机验证码 Hello ,…