mar3d模型文件问题

上一章使用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);


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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Marzipano 3D 场景中判断一个点是否在给定区域,可以采用射线法或多边形顶点法。 射线法:通过 Marzipano 3D 场景中的 API 获取到需要判断区域的坐标系,然后获取鼠标点击事件的坐标,使用射线与区域的边相交的次数来判断点是否在区域内。具体实现方法如下: ```javascript viewer.addEventListener('click', function(event) { const coords = viewer.view().screenToCoordinates({x: event.clientX, y: event.clientY}); const isInside = isPointInsidePoly(coords, vertices); if (isInside) { // 点在区域内部 } else { // 点在区域外部 } }); function isPointInsidePoly(point, vertices) { let inside = false; const n = vertices.length; for (let i = 0, j = n - 1; i < n; j = i++) { const vi = vertices[i], vj = vertices[j]; const intersect = ((vi.y > point.y) != (vj.y > point.y)) && (point.x < (vj.x - vi.x) * (point.y - vi.y) / (vj.y - vi.y) + vi.x); if (intersect) inside = !inside; } return inside; } ``` 多边形顶点法:同样通过 Marzipano 3D 场景中的 API 获取到需要判断区域的坐标系,然后获取鼠标点击事件的坐标,使用多边形的顶点连接起来形成一系列边,判断这个点是否在这些边的左侧。具体实现方法如下: ```javascript viewer.addEventListener('click', function(event) { const coords = viewer.view().screenToCoordinates({x: event.clientX, y: event.clientY}); const isInside = isPointInsidePoly(coords, vertices); if (isInside) { // 点在区域内部 } else { // 点在区域外部 } }); function isPointInsidePoly(point, vertices) { let inside = false; const n = vertices.length; for (let i = 0, j = n - 1; i < n; j = i++) { const vi = vertices[i], vj = vertices[j]; const intersect = ((vi.y > point.y) != (vj.y > point.y)) && (point.x < (vj.x - vi.x) * (point.y - vi.y) / (vj.y - vi.y) + vi.x); if (intersect) inside = !inside; } return inside; } ``` 以上是两种常见的方法,具体实现可以根据实际情况选择适合的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰太狼大王灬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值