说到爆炸图,你最先想到的是什么?是这样吗?不不不,现在的分解图一般都是指三维装配图。有了爆炸图,工程技术人员绘制三维装配图就容易多了,既提高了工作效率,又减轻了工作强度。现在这个功能不仅用在工业产品的装配和使用说明上,而且在机械制造中的应用也越来越广泛,让加工操作人员一目了然,而不是像以前那样看得清楚一张装配图。花半天时间。如何更简洁地表达产品装配关系?大家能不能秒懂产品各个部分的关系?ThingJS的爆炸图功能帮你快速解决这个问题!您只需要花很短的时间就可以学会这个功能!闲话不多说,下面就来介绍一下如何使用ThingJS快速制作爆炸效果,一起来看看吧!制作物体模型的分解图,可以在3dmax建模时,根据分解图的分割要求,对每个子物体(或子模型、子节点)进行定义和命名。这些子对象在ThingJS在线开发中可以作为模型子节点进行控制,这些子节点可以像单独的模型对象对象一样进行移动、添加事件等操作。需要注意两点:1.由于交互模型的性能考虑,需要先折叠模型再上传。折叠模型将不再保留子节点(融合了细节,因此性能更高)。因此,只有与上述子项控制模型有局部要求的模型才应该保留子对象信息(不塌陷)。虽然这款机型性能较差,但确实是一种特殊需求。拆分后,如果模型的子节点有多个材质或者点数超过上限,在线开发时会拆分。例如:3dmax将一个子节点命名为“box”。由于子节点使用了多种材质,所以子节点在在线开发中,会被命名为组,组被拆分并命名为“box_0”、“box_1”等对象。完整的分解图代码如下://加载场景代码varapp=newTHING.App({url:'/api/scene/406e419fae9000a47a4a8899'});//生成器模型节点数据varnodeObjData={'1':{name:'Frame',offset:[0,0,-1]},'2':{name:'protector',offset:[0,-1,0]},'3':{name:'电池',offset:[0,-1,0]},'4':{name:'排气口',offset:[0,0,1]},'5_0':{name:'Filter',offset:[0,0,1]},'5_1':{name:'filter',offset:[0.5,0,1]},'6':{name:'供应设备',offset:[0,0,1]},'7':{name:'烟囱',offset:[-1,0,0]},'8':{name:'generator'},'9':{name:'controller',offset:[0,1,0]}}varnodeJsonData=null;//生成器模型节点对象vargeneratorObj=null;//生成器对象varexpandState=false;//生成器扩展状态varexpandCount=0;//发电机展开次数//场景加载完成后执行app.on('load',function(ev){generatorObj=app.query('#generator')[0];//查询发电Machine对象nodeJsonData=getNode(generatorObj);//获取生成器模型节点对象//创建一个测试按钮newTHING.widget.Button('Expand',expandObj);newTHING.widget.Button('Restore',unexpandObj);newTHING.widget.Button('顶卡显示',createAllPanel);newTHING.widget.Button('顶牌隐藏',hiddenAllPanel);//设置摄像头位置和目标app.camera.position=[8.607320990228896,4.659529165486485,2.463883920016444];app.camera.target=[5.457047915958038,2.0011500043525103,-3.0191956945367244];})/***显示所有顶级卡片*/functioncreateAllPanel(){for(letkeyinnodeObjData){nodeJsonData[key].name=nodeObjData[key].name;createPanel(nodeJsonData[key]);}}/***隐藏所有顶部卡片*/functionhiddenAllPanel(){for(letkeyinnodeObjData){hiddenPanel(nodeJsonData[key]);}}/***扩展对象*/functionexpandObj(){//防止生成器在扩展期间多次点击if(expandState){return;}expandState=true;展开计数++;for(letkeyinnodeObjData){//每个子节点偏移量objOffset(nodeJsonData[key],nodeObjData[key].offset);}}/***恢复对象*/functionunexpandObj(){//展开次数为0,表示不展开if(expandCount==0)return;for(letkeyinnodeObjData){if(nodeObjData[key].offset){//计算恢复时子节点需要的偏移量,值为-1*展开次数*nodeObjData中定义的子节点对应的偏移量让offsetValue=[-1*expandCount*nodeObjData[key].offset[0],-1*expandCount*nodeObjData[key].offset[1],-1*expandCount*nodeObjData[key].offset[2]]objOffset(nodeJsonData[key],偏移值);}}expandCount=0;}/***获取节点对象*/functiongetNode(obj){letnodeJson={};//obj.subNodes可以得到一个对象的所有子节点for(leti=0;i
