threejs使用input type=file加载glb模型

本文讲述了作者在项目中遇到的问题,即使用`inputtype=file`加载GLB模型时THREE.GLTFLoader报错。原因在于GLB是二进制格式,需先转换为URL。解决方案是将file对象转换为URL后直接提供给GLTFLoader。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

以前都是本地加载glb模型,最近在测试使用input type=file来输入模型。发现了一些问题。

问题描述

在使用 LoadingManagersetURLModifier添加模型得时候会报错:THREE.GLTFLoader: Couldn’t load texture,但是gltf没有这个问题

  this.manager.setURLModifier((_url: string) => {
        let hasURL = "";

        Object.keys(_bolbURLs).some((f) => {
          if (_url.indexOf(f) !== -1) {
            hasURL = URL.createObjectURL(_bolbURLs[f]);
            return true;
          }
        });
        _url = hasURL || "";
        return _url;
      });

原因分析:

glb和gltf有区别GLB格式是GLTF文件的一个版本,不同之处在于,GLB格式是二进制文件格式,而GLTF格式是基于JSON(JavaScript对象表示法)的。GLB将三维场景的所有元素(包括材质、节点层次和摄影机)定位在一个压缩文件中。相比之下,GLTF文件需要外部处理文件格式,例如纹理、着色器和动画数据等其他格式。这些外部元素存储在GLTF文件中,但每个元素都使用唯一的格式编码语言(JPEG用于纹理,GLSL用于着色器,BIN用于动画数据)。

gltf需要使用setURLModifier来处理,gltf就一个文件不用。

glb/gltf区别 知乎地址


解决方案:

input选择文件返回的是file,把file转成url直接给GLTFLoader加载就行

 if (files[0] && files[0].name.indexOf('.glb') !== -1) {
      for (const val of files) {
      // 转成url-记得销毁
        modelUrl.value = URL.createObjectURL(val)
      }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值