当前位置: 首页 > Web前端 > JavaScript

Online-3D-ViewerExperience

时间:2023-03-27 17:04:36 JavaScript

简介由于业务需要,需要显示3D文件。之前写过一个three.js的方案来渲染3D数据。本来以为可以直接用,但是甲方需要,后来另一家业务用了同样的技术路线online-3d-viewer(就是three.js的二次打包),只好借用他们的项目,但是因为api的不同,卡了一天,记录在这里,如果大家有其他更好的解决方案,欢迎回复。刚开始实践过程中,自己接手的代码感觉可以直接拿来用,但是一开始就出问题了。您原始代码中的许多功能都有问题。感觉那边的工程不知道把代码copy到哪里去。没有根据库的版本修改,很多方法已经不支持了。.这些都是小事。看了源码,找到了对应的替换方法。但是在获取数据的时候出现了问题。在原来的逻辑中,直接通过api获取数据得到一个zip文件。这里有一个问题。他们项目的接口不需要token。公共数据可以直接获取。我需要获得许可才能在我的项目中获取数据。直接使用url会有问题//原代码import*asOVfrom'online-3d-viewer';...constinputEle=useRef(null)consturl=[`/api/public/file/download.zip?fileId=${el.media3D.documents}`]constload3d=()=>{//告诉引擎在哪里可以找到libs文件夹OV.SetExternalLibLocation('build/libs');//使用父元素和一些参数初始化查看器letviewer=newOV.EmbeddedViewer(inputEle.current,{//视角相机:newOV.Camera(newOV.Coord3D(-1.5,-3.0,2.0),newOV.Coord3D(0.0,0.0,0.0),newOV.Coord3D(0.0,0.0,1.0)),//背景色backgroundColor:newOV.Color(255,255,255),defaultColor:newOV.Color(200,200,200),//边框设置edgeSettings:{showEdges:false,edgeColor:newOV.Color(0,0,0),edgeThreshold:1},//背景图片设置environmentMap:[],//onModelLoaded:()=>{//letmodel=viewer.GetModel();////对模型做一些事情//}});//加载提供模型urls的模型DamagedHelmetviewer.LoadModelFromUrls(url);}if(inputEle.current){load3d()}}...

在上面的代码中,OV方法基本都有问题,因为使用的库版本是"online-3d-viewer":"^0.8.17",所以方法应该换成OV.Color=>OV.RGBColorOV.LoadModelFromUrls=>OV.LoadModelFromUrlList实现代码从上面我们可以看出,使用的方法是LoadModelFromUrlList。从翻译中可以看出我们要的是一个url列表,而我们的因为接口需要权限,所以这里不适用,只好搜索源码,然后看到了下面的部分LoadModelFromUrlList(modelUrls){TransformFileHostUrls(模型网址);让inputFiles=InputFilesFromUrls(modelUrls);this.LoadModelFromInputFiles(inputFiles);}从上面的代码可以看出,他是通过url获取数据然后调用内部的LoadModelFromInputFiles方法执行文件,那么我就可以直接获取文件并运行了,所以我做了如下修改,最终实现了功能//通过接口获取文件的blobconstres=awaitFileService.downloadZipForPreview(fileId)letblob=newBlob([res],{type:'',})//通过File将流转为文件letfiles=awaitnewFile([blob],'xxx.zip',{type:'application/zip',})//在当前文件对象中添加一些字段,这些字段在后面的函数处理步骤中需要用到,//直接使用文件会因为缺少参数而出错,这部分是关键files.data=res//定义文件类型,//{Url:1,File:2,Decompressed:3}files.source=2viewer.LoadModelFromInputFiles([files])