前言互联网+的概念一出,立刻吸引了各行各业的有识之士,想要在这个领域分一杯羹。如今,传统工业生产行业更多地使用互联网+概念,但在大众创业、万众创新的背景下,“互联网+”“玩法”层出不穷,智慧城市、隧道交通、智慧园区、工业生产、甚至这次我要说说智能飞行器!异地协同制造的范围目前多局限在主机制造商,很少涉及发动机和机载系统。“互联网+飞行器”可以通过提高各类飞行器的有效监控能力和应急响应能力,大大提高航行安全水平。“这两项能力提升后,将不再发生飞机失联等事件。”当飞机飞出预定航线时,地面可以实时监控,即使飞机遇到恶意操纵,地面也可以接管,“互联网+飞机”会知道每架飞机的所有数据,有效提高航行安全,在我看来,“互联网+飞机”将超越传统的“互联网+飞机制造”阶段,让互联网在飞机的整个生命周期发挥作用,这将提供一个重大机遇促进传统制造业转型升级。http://hightopo.com/guide/gui...代码部分加载航模。首先,最重要的是我们的航模。上一篇文章提到,HT封装了一个方法ht.Default.loadObj(https://hightopo.com/guide/gu...)来加载OBJ文件:ht.Default.loadObj('obj/plane.obj','obj/plane.mtl',{center:true,r3:[0,-Math.PI/2,0],//使平面朝右s3:[0.15,0.15,0.15],//使平面变小finishFunc:function(modelMap,array,rawS3){if(modelMap){modelMap.propeller.r3={//螺旋桨propellerfunc:function(data){return[data.a('angle'),0,0];}};//设置模型大小为原来的11.21.2倍(相当于x轴放大1倍,y轴放大1.2倍,z轴放大1.2倍)modelMap.propeller.s3=[1,1.2,1.2];modelMap.propeller.color='黄色';}});将obj解析出来的模型信息绑定到图元上,首先调用模型注册(https://hightopo.com/guide/guide/gu...)注册ht.Default.setShape3dModel(name,model)函数,然后那么原语只需要设置style的shape3d属性设置为注册名称。当然,我们现在已经封装了这个方法,采用了更简单的方法来加载模型,但是加载的原理还是需要的://models/plane.json{"modelType":"obj","obj":"obj/plane.obj","mtl":"obj/plane.mtl"//如果没有mtl文件,设置为""}然后设置节点样式的shape3d属性为这个json:node.s('shape3d','models/plane.json')。注意!无论使用哪种方式加载模型,如果mtl文件中使用了贴图,则贴图的路径需要相对于obj文件的路径。前面代码中的modelMap.propeller就是OBJ文件中定义的modelMap对象中的propeller对象。您可以尝试打印modelMap以查看输出结果。尾灯加载方法中的finishFunc(modelMap,array,rawS3)用于加载后的回调处理。详情请参考HTforWebOBJ手册(http://hightopo.com/guide/gui...),我们还在飞机尾部不在OBJ中的地方添加了一个“红色闪烁指示灯”模型。这里我们使用组合模型数组(所有材质的数组,其中至少有一个模型),我们向数组添加一个新的。Ballmodel://添加一个圆形的灯模型array.push({shape3d:ht.Default.createSmoothSphereModel(),t3:[-40,10,0],s3:[6,6,6],color:{func:function(data){returndata.a('light')?'red':'black';}}});这里的shape3d是HT封装的属性名,通过setShape3dModel(name,model)函数注册或者getShape3dModel(name)函数返回的注册3D模型,如何注册3D模型可以在HTforWebModeling中找到手册(http://hightopo.com/guide/gui...)。颜色属性名称对应一个对象。这里的定义如下。Color直接通过data.getAttr('a')获取data.setAttr('a',value)中的值。这有两个优点。一是普通属性操作,不能污染HT,所以HT专门定义了这个attr属性类型,HT保留给用户存储业务数据;其次,数据绑定也很方便,我们可以通过调用setAttr方法来改变属性,非常方便。然后我们使用ht.Default.setShape3dModel(name,model)将我们刚刚组合的模型数组注册为我们想要的“平面”模型:ht.Default.setShape3dModel('plane',array);创建模型节点并注册模型后,我们必须调用这个模型。我们可以通过shape3d属性调用这个模型,在这个模型中自定义上面代码中出现的light属性和angle属性:plane=newht.Node();plane.s3(200,200,200);plane。s3(rawS3);plane.s({'shape3d':'plane','shape3d.scaleable':false,'wf.visible':true,//线框是否可见'wf.color':'white','wf.short':true//是否显示闭合线框,true为未闭合短线框});plane.a({'angle':0,'light':false});动画因为飞机有螺旋桨和指示灯两个功能,所以我们要给这两个模型做动画。可以参考HTforWeb动画手册(http://hightopo.com/guide/gui...),飞行器的飞行时长,飞行器的视角,飞行器沿线飞行的旋转角度“航线”,机尾指示灯的“闪烁”功能等,都是由用户在表单上选择的结果决定的,最后别忘了,当飞机停止飞行的时候,如果你想让飞机继续飞行飞行,你必须回调这个动画,并设置灯光停止闪烁。不要忘记启动动画:params={delay:1500,duration:20000,easing:function(t){return(t*=2)<1?0.5*t*t:0.5*(1-(--t)*(t-2));},动作:函数(v,t){varlength=g3d.getLineLength(polyline),offset=g3d.getLineOffset(polyline,length*v),point=offset.point,px=point.x,py=point.y,pz=point.z,tangent=offset.tangent,tx=tangent.x,ty=tangent.y,tz=切线.z;plane.p3(px,py,pz);plane.lookAt([px+tx,py+ty,pz+tz],'右');varcamera=formPane.v('相机');if(camera==='LookAt'){g3d.setCenter(px,py,pz);}elseif(camera==='第一人称'){g3d.setEye(px-tx*400,py-ty*400+30,pz-tz*400);g3d.setCenter(px,py,pz);}plane.a('角度',v*Math.PI*120);if(this.duration*t%1000>500){plane.a('light',false);}else{plane.a('light',true);}},finishFunc:函数(){animation=ht.Default.startAnim(参数);plane.a('light',false);}};animation=ht.Default.startAnim(参数);其实最让我们好奇的是画出来的路径和飞机本身的路径是一样的飞行不要紧,左右转弯那么多,怎么办?绘制飞机轨迹接下来,让我们绘制路径。首先根据ht.Polyline绘制路径:polyline=newht.Polyline();折线.setThickness(2);polyline.s({'shape.border.pattern':[16,16],'shape.border.color':'red','shape.border.gradient.color':'yellow','shape3d.resolution':300,'3d.selectable':false});dataModel.add(polyline);上面的代码只是给datamodel数据模型添加了一个polyline管道,并不会显示任何东西。要显示“频道”,首先要设置频道所在的点。我们先设置通道初始点:points=[{x:0,y:0,e:0}];段=[1];点和线段是HTforWebShape手册(http://hightopo.com/guide/gui...),点是ht.List类型数组的定点信息,顶点是格式中的对象{x:100,y:200};segments是ht.List类型的线段数组信息,表示points数组中的点顶点数组顺序是如何连接的图中“通道”左侧的多个圆形轨道也是通过设置点和线段来设置的:for(vark=0;k
