threejs加载file格式的gltf模型,使用input type=file加载gltf模型

项目场景:

使用input选择gltf加载模型

问题描述

gltf有多个文件如何塞给GLTFLoader加载(不知道怎么办)。

解决方案:

最后在threejs官网看到解决办法

解决思路

URL.createObjectURL(bolb/file)

1:input输入文件获取

c 复制代码
const uploadInput = ref<HTMLInputElement | undefined>();
const files: any = uploadInput.value!.files; // 获取files列表

2:查找gltf后缀的主文件,然后记录名称

c 复制代码
  for (const val of files) {
        if (val.name.indexOf('.gltf') !== -1) {
          modelUrl.value = val.name // 保存名字
        }
        urls[val.name] = val;
      }

3:获取的files然后在threejs的LoadingManager管理器中加载----setURLModifier需要在加载之前设置

c 复制代码
this.manager.setURLModifier((_url: string) => {
        let hasURL = "";
		
		// 这里查找前面的file然后转成地址,再return出去------有可能名称不是完全一样需要匹配
      	hasURL = URL.createObjectURL(_bolbURLs[f]);
        
        _url = hasURL || "";
        return _url;
      });

4:加载模型

设置setURLModifier之后直接加载就行

c 复制代码
loader.load( '第二步记录的名称.gltf', (gltf) => {
	scene.add( gltf.scene );
	objectURLs.forEach( ( url ) => URL.revokeObjectURL( url ) ); // 销毁
});

就这么多

官方的范例:

c 复制代码
// 将文件拖入网页时创建的Blob或File对象。
const blobs = {'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3};

const manager = new THREE.LoadingManager();

// 使用URL回调初始化加载管理器。
const objectURLs = [];
manager.setURLModifier( ( url ) => {

	url = URL.createObjectURL( blobs[ url ] );

	objectURLs.push( url );

	return url;

} );

// 像通常一样加载,然后撤消blob URL
const loader = new THREE.GLTFLoader( manager );
loader.load( 'fish.gltf', (gltf) => {

	scene.add( gltf.scene );

	objectURLs.forEach( ( url ) => URL.revokeObjectURL( url ) );

});

总结

有不对的地方欢迎大佬指出。

相关推荐
2401_878454536 小时前
浏览器工作原理
前端·javascript
by__csdn8 小时前
Vue3 setup()函数终极攻略:从入门到精通
开发语言·前端·javascript·vue.js·性能优化·typescript·ecmascript
Luna-player9 小时前
在前端中,<a> 标签的 href=“javascript:;“ 这个是什么意思
开发语言·前端·javascript
lionliu05199 小时前
js的扩展运算符的理解
前端·javascript·vue.js
小草cys9 小时前
项目7-七彩天气app任务7.4.2“关于”弹窗
开发语言·前端·javascript
前端一小卒11 小时前
一个看似“送分”的需求为何翻车?——前端状态机实战指南
前端·javascript·面试
syt_101311 小时前
Object.defineProperty和Proxy实现拦截的区别
开发语言·前端·javascript
长安牧笛11 小时前
儿童屏幕时间管控学习引导系统,核心功能,绑定设备,设时长与时段,识别娱乐,APP超时锁屏,推荐益智内容,生成使用报告,学习达标解锁娱乐
javascript
栀秋66611 小时前
深入浅出链表操作:从Dummy节点到快慢指针的实战精要
前端·javascript·算法
青青很轻_12 小时前
Vue自定义拖拽指令架构解析:从零到一实现元素自由拖拽
前端·javascript·vue.js