一种基于前端3D的网络三维模型自动替换系统
- 国知局
- 2024-07-31 23:19:55
本发明一种基于前端3d的网络三维模型自动替换系统,涉及threejs网络领域。
背景技术:
1、如今,三维建模和数字视觉效果制作已经成为许多领域内一个必不可少的技术手段;特别是在游戏开发、虚拟现实、数字影视和工业设计等领域,三维建模和数字视觉效果制作已经成为最主要的技术手段;然而,随着复杂场景下模型数量的不断增加和更新换代,三维建模和数字视觉效果制作中的模型替换问题也开始变得日益复杂和困难。
2、目前,常用的三维建模软件主要采用手动修改和替换的方式来管理和更新模型;但在生产实践和客户使用中仍存在以下问题:
3、1、性能限制:前端设备的性能对三维模型的渲染和替换有直接影响。较低性能的设备会导致渲染速度变慢或替换过程出现卡顿。
4、2、安全性风险:前端处理涉及模型数据的传输和存储,如果安全措施不到位,会导致数据泄露或被篡改。
5、3、复杂性:实现一个稳定、高效的前端3d模型自动替换系统需要一定的技术储备和经验,包括3d图形学、web前端技术、网络通信等方面的知识。
6、4、维护成本:随着三维模型数量的增加和更新频率的提高,系统的维护成本也会相应增加,包括模型的更新、优化以及系统的调试和升级等。
技术实现思路
1、针对现有技术存在的不足,本发明目的是提供一种基于前端3d的网络三维模型自动替换系统,旨在解决三维模型替换效率低的问题。
2、为了实现上述目的,本发明是通过如下的技术方案来实现:一种基于前端3d的网络三维模型自动替换系统包括:
3、模型加载模块:用于加载和解析三维模型,获取模型位置、高度、半径和旋转角度的几何参数,得到模型的路径信息;
4、模型替换模块:用于根据路径信息,进行类型的匹配,通过场景目录的几何信息计算替换模型参数,生成替换列表;
5、模型渲染模块:用于根据替换列表,循环遍历模型,运行替换指令;若指令不删除旧模型,则对相应的新模型进行处理,使之与旧模型相匹配;若指令删除旧模型,则将旧模型删除;重复执行直至全部模型都被处理,完成三维模型替换;
6、用户交互模块:用于提供用户交互的接口;通过用户交互模块,查询管理三维模型,实现模型的自动替换。
7、进一步地,所述模型加载模块的工作流程如下:
8、接收用户导入的三维模型,将模型移入缓存;
9、创建空白对象;检测用户导入的模型是否为fbx文本格式;若是,则将模型从缓存中转入空白对象,初始化模型;若不是,则调用pyassimp库函数,通过异步加载fbx的方式加载模型,初始化模型;模型对象记作model;
10、pyassimp库函数代码中,1oadfbx函数会异步加载指定的模型文件,将其传递给回调函数处理;回调函数遍历子模型,获取模型的材质和几何参数,将其添加至模型组的对象中初始化;
11、加载three.js库函数,调用object.position方法获取模型位置;根据模型位置,调用get_bounding_box()方法获取模型的几何参数;
12、加载unity3d库函数,调用transform方法获取模型中的父对象和子对象,得到模型的从属关系;将模型中的各部分,按照从属关系组织成的树形结构;
13、每个模型都对应树中一个节点;其中,父对象为根节点,子对象为叶节点;根据树形结构生成场景目录表,得到路径信息;在场景目录表中添加几何参数。
14、进一步地,所述模型替换模块的工作流程如下:
15、流程1:引入属性数据表;根据路径信息,在属性数据表中查找其属性信息并返回模型类型;
16、流程11:使用paths和property_data参数,类型分别为列表和字典;paths包含了管件对象的路径信息;property_data是路径一类型的映射表,用于记录所有管件对象的属性信息;
17、流程12:判断property_data是否为空;若为空,则返回null;若不为空,则遍历property_data中所有键值对;
18、将模型对象的路径信息与属性数据表中的键值对,依次进行匹配;若匹配成功,则返回该键值对中的值,作为模型类型;若匹配失败,则继续匹配,直至确定模型类型;若模型对象的路径信息与属性数据表中所有键值都不匹配,则加载typing.dict泛型;遍历typing.dict泛型中定义的类型字典,通过子路径查询和键值对匹配,确定模型类型;
19、流程2:计算新模型位置、高度、半径和旋转角度的几何参数,与旧模型的几何参数进行比较,判断是否保留新模型;
20、流程3:根据模型类型和替换模型参数,生成替换模型表;生成替换列表包括待替换模型的id、替换对象、缩放、旋转角度和位置;根据替换列表,模型的id确定需要替换的模型,判断替换对象:如替换对象为“delete”,指从场景中删除该模型;
21、模型替换模块将替换列表发送至模型渲染模块。
22、进一步地,所述流程2的具体工作流程如下:
23、流程21:计算新模型的几何参数;
24、流程211:定义infos=infos[infos[’替换’]==’替换’];筛选出替换标志为“替换”的新模型,作为模型计算对象;
25、流程212:定义cylinders=infos[infos[’形状’]==_’];筛选出形状相同的模型分组,并统计分组个数,记作n;
26、流程213:计算模型1的位置;
27、创建数据类型为three.vector3的接收对象,用于接收模型1对象;调用three.js库函数中get().position方法,获取模型1的位置,记作(x,y,z);x、y和z分别表示模型1的横坐标、纵坐标和竖轴坐标;
28、varposition=model.position;
29、varx=position.x;
30、vary=position.y;
31、varz=position.z;
32、流程214:计算模型1的高度,用height表示;
33、遍历模型的顶点;
34、var geometry=model1.geometry;model1表示模型1;
35、var vertices=geometry.attributes.position.array;
36、var ymin=infinity;
37、var ymax=-infinity;
38、确定模型1在纵坐标的最大值,用ymax表示;确定最小值,用ymin表示;
39、for(var i=0;i<vertices.length;i+=3){
40、var y=vertices[i+1];
41、ymin=math.min(ymin,y);
42、ymax=math.max(ymax,y);}
43、计算模型1的高度:var height=ymax-ymin;
44、流程215:计算模型1的半径,用radius表示;
45、调用three.box3函数,计算模型1的边界盒;计算边界盒的对角线长度,以界盒的对角线长度的一半作为模型1近似半径;半径用radius表示;
46、var box=new three.box3().setfromobject(model);
47、var size=box.getsize(new three.vector3());
48、var radius=math.max(size.x,size.y,size.z)/2;
49、流程216:计算模型1的旋转角度;
50、调用three.js库函数get().rotation方法;rotation属性是three.euler或three.quaternion对象;
51、varrotation=model.rotation;
52、若rotation是three.euler对象,旋转角度以弧度制表示;
53、varxrotation=rotation.x;
54、varyrotation=rotation.y;
55、varzrotation=rotation.z;
56、xrotation表示以弧度制为单位,模型1的横轴旋转角度,以此类推,yrotation和zrotation分别表示模型1的纵轴和竖轴旋转角度;
57、若rotation是three.quaternion对象,将旋转角度以弧度转换为角度;
58、varxrotationindegrees=three.mathutils.radtodeg(xrotation);
59、varyrotationindegrees=three.mathutils.radtodeg(yrotation);
60、varzrotationindegrees=three.mathutils.radtodeg(zrotation);
61、xrotationindegrees表示以角度为单位,模型1的横轴旋转角度,以此类推,yrotationindegrees和zrotationindegrees分别表示模型1的纵轴和竖轴旋转角度;
62、流程217:调用流程213~流程216计算模型1几何参数的流程,依次计算模型2~n的几何参数。
63、进一步地,所述流程217的后续工作流程如下:
64、流程22:判断模型1是否保留;
65、流程221:将模型1对应的新模型高度、半径和旋转角度分别记作h、ra和ro;将旧模型的高度、半径和旋转角度分别记作hh、hra和hro;
66、流程222:计算新模型的几何对比值,记作bn;旧模型的几何对比值,记作bh;bn的计算式为:bn=(h*ra*ro)1/2;bn的计算式为:bn=(hh*hra*hro)1/2;
67、流程223:判断bh/bn是否大于或等于替换阈值;若大于或等于,则可以替换,替换模型参数为新模型的几何参数;若小于,则不能替换,向用户交互模块返回“505”错误,提示用户更新并上传属性数据表,再次执行流程1~流程223;
68、流程224:计算模型1的缩放比例(b1,b2,b3);b1、b2和b3的计算式为:b1=h/hh,b2=ra/hra,b3=ro/hro;
69、流程225:调用流程221~流程224判断模型1是否保存的流程,依次判断模型2~n是否保留,并确定对应模型的替换模型参数。
70、进一步地,所述模型渲染模块的工作流程如下:
71、根据替换列表,获取替换列元素不为delete的模型,作为待替换模型;获取待替换模型的名称、缩放、旋转和替换对象;
72、循环遍历每个待替换模型,获取待模型的位置;
73、根据待替换模型位置,查找对应模型;运行替换指令;若指令不删除旧模型,则调用相应新模型进行缩放、旋转,使之与旧模型相匹配;若指令删除旧模型,则将旧模型删除;移除场景中的旧模型,渲染场景并更新场景目录结构,完成3d模型替换;
74、解析模型:
75、s_frontend=parsescenestructure();
76、发送模型匹配替换请求至后端:
77、request_backend=sendrequest(s_frontend);
78、接收到请求并进行模型匹配替换,返回结果:
79、(replacelist,ruledirectory)=backendmatchandreplace(request_backend);
80、接收并处理后端返回数据:
81、processdata(replacelist,ruledirectory);
82、根据replacelist中的信息进行模型替换操作:
83、对每个路径位置p in replacelist:a;判断replacelist[p]=″delete″是否成立;
84、若成立,则执行deletemodel(p)b;
85、否不成立,则执行replacelist[p]=m(表示模型名),从模型库中查找模型m:newmodel=findmodel(m)i;
86、根据replacelist中的参数设置newmodel的属性:
87、setmodelproperties(newmode1,replacelist[p])i,将原路径位置p处的模型替换为newmodel:replacemodelatposition(p,newmodel);
88、更新模型展示的场景目录结构与模型替换规则目录:
89、updatedisplay(scenedirectory,ruledirectory)。
90、与现有技术相比,本发明的有益效果是:
91、1、实时性:本发明能够实时地在前端进行三维模型的替换,允许用户根据需求随时更改模型。
92、2、减轻服务器负担:本发明大部分数据交互处理都在前端完成,减少了服务器与客户端之间的数据传输量,从而降低了服务器的负载。
93、3、跨平台兼容性:本发明基于web前端的技术通常具有较好的跨平台兼容性,可以在不同的浏览器和设备上运行。
94、4、易于集成与扩展:本发明的前端3d技术通常与现有的web技术栈兼容,易于集成到现有的系统中。同时,随着前端技术的不断发展,系统也更容易进行功能扩展和性能优化。
本文地址:https://www.jishuxx.com/zhuanli/20240730/197042.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。
下一篇
返回列表