鍙傝€冩垜鐨勫叕浼楀彿鏂囩珷threejs骞虫粦璺嚎瑙勫垝Astar瀵昏矾绠楁硶缁撳悎THREE.CatmullRomCurve3鐢熸垚骞虫粦鐨勪笁缁存牱鏉℃洸绾匡紝瓒呯骇鏈夎叮浠庝竴涓偣绉诲姩鍒板彟涓€涓偣鐩寸嚎锛屼絾鐜板湪鎯呭喌涓嶅悓浜嗐€傚鏋滃皢鍦板浘缃戞牸鍖栵紝鍒╃敤浠ヤ笂鎶€鏈鐐癸紝鐜╁鐨勭Щ鍔ㄨ矾绾垮皢浠庘€滅洿绾垮埌鐩寸嚎鈥濊繘鍖栦负鈥滃钩婊戣繃娓♀€濄€侱ream馃槃娌℃湁骞虫粦璺緞澶勭悊鐨勬晥鏋滃浘鏈夊钩婊戣矾寰勫鐞嗙殑缁忛獙DEMOAstar绠楁硶鍒朵綔鍦板浘锛氫竴涓簩缁存暟缁勶紝璁剧疆鍝簺鐐规槸闅滅鐗╋紝鍝簺鏄嚜鐢辩Щ鍔ㄥ尯鍩熴€俫rid鍜宮ap鐨勬瘡涓€椤圭浉浜掓槧灏勶紝姣斿鐢熸垚鍦板浘濡備笅锛?/Mapgridcoordinatearrayletgrid=[{x,y,z},//鏌愪釜Mesh鍦╣rid涓殑鍧愭爣{x,y,z},{x,y,z},{x,y,z},{x,y,z},],[{x,y,z},{x,y,z},{x,y,z},{x,y,z},{x,y,z},],[{x,y,z},{x,y,z},{x,y,z},{x,y,z},{x,y,z},],[{x,y,z},{x,y,z},{x,y,z},{x,y,z},{x,y,z},],[{x,y,z},{x,y,z},{x,y,z},{x,y,z},{x,y,z},],];//鎶借薄鍦板浘鍙犲姞鏁扮粍letmap=[[1,1,0,1,1],[1,1,0,1,1],[1,0,0,1,1],[1,1,0,1,1],[1,1,1,0,1],];//0琛ㄧず瀵瑰簲item涓婄殑Mesh鏄殰纰嶇墿鈥斺€斾笉鍙€氳繃锛?琛ㄧず瀵瑰簲item涓婄殑Mesh鏄嚜鐢卞尯鍩熲€斺€斿彲浠ュ垱寤篏raph锛氬皢map鐨勪簩缁存暟缁勮浆涓篻raph鍙敱AstarGraphlet璇嗗埆graph=newGraph(map);console.log("鍥惧舰锛?锛屽浘褰?;//{diagonal,dirtyNodes,grid,nodes}璺緞鎼滅储锛氭彁渚涜捣鐐广€佺粓鐐瑰拰鍥惧舰锛屼娇鐢ˋstar鐨剆earch鏂规硶鎼滅储鍙Щ鍔ㄧ殑璺緞銆俵etstart=graph.grid[0][0];letend=graph.grid[4][2];letsTime=+newDate();//鎼滅储缁撴灉letresult=astar.search(graph,start,缁撴潫);璁〆Time=+newDate();璁﹕pendTime=eTime-sTime;//闇€瑕丯姣if(!result.length){console.log("Noreachablepathfound");return;}else{console.log("Findareachablepath");}THREE.CatmullRomCurve3鐢熸垚璺緞鏇茬嚎锛氭牴鎹彁渚涚殑Astar绠楁硶鎼滅储缁撴灉锛屾彁鍙栧叧閿矾寰勭偣锛堝繀瑕佺殑锛夊緱鍒板钩婊戣繃娓℃洸绾裤€?**1.鎻愬彇鍏抽敭鑺傜偣*///鐢熸垚璺緞鍔ㄧ敾letpath=[];//Keypathnode//鍦ㄨ繖閲屽畾涔塯ap鏉ョ█閲婄粨鏋滐紝璁╄繍鍔ㄨ矾绾跨敓鎴愰€傚綋鏁伴噺鐨勭偣锛岀劧鍚庝娇鐢–atmullRomCurve3鑷姩杩囨浮褰㈡垚骞虫粦鐨勬洸绾裤€傝gap=result.length>6锛?:缁撴灉闀垮害>4?2:1;result.map((item,index)=>{const{x,y,z}=item;letpos=grid[x][y];if(index%gap==0||index==result.length-1){path.push(newTHREE.Vector3(pos.x,pos.y,pos.z));}});console.log("path:",path);/**2.鐢熸垚骞虫粦璺嚎*/letdivisions=30;//鍒嗗壊鏁發etcurve=newTHREE.CatmullRomCurve3(path,false);//鑾峰彇Smoothcurve鏇茬嚎瀵硅薄letcurveLength=curve.getLength();//鏇茬嚎闀垮害//routelineconstpoints=curve.getPoints(divisions);constgeometry=newTHREE.BufferGeometry().setFromPoints(points);constmaterial=newTHREE.LineBasicMaterial({color:0xff0000});letcurveMesh=newTHREE.Line(geometry,material);scene.add(curveMesh);鐗╀綋绉诲姩锛氳鐗╀綋娌跨潃鏇茬嚎绉诲姩constmoveSpeed=0.01;//绉诲姩閫熷害constlerpSpeed=0.001;//杞﹀墛绮惧害letdistance=0;//绉诲姩鐨勮窛绂籰etcurveLength=curve.getLength();//鏇茬嚎闀垮害letmoveMeshPosition:newTHREE.Vector3();//鐗╀綋褰撳墠甯х巼鍦ㄦ洸绾夸笂鏇茬嚎涓婄殑浣嶇疆letmoveMeshTarget:newTHREE.Vector3();//瀵硅薄涓嬪湪鏇茬嚎涓婄Щ鍔ㄤ竴甯х殑浣嶇疆letmoveMesh=newTHREE.Mesh(newTHREE.BoxBufferGeometry(0.3,0.3,0.5),newTHREE.MeshBasicMaterial({color:0xffdd00}));//绉诲姩鐗╀綋鍦烘櫙銆傛坊鍔狅紙绉诲姩缃戞牸锛夛紱鍑芥暟鏇存柊锛堬級{璺濈+=绉诲姩閫熷害锛?/绱姞绉诲姩璺濈letpercent=distance/curveLength;//褰撳墠浣嶇疆鍗犲姬闀跨殑鐧惧垎姣旓紝鍗冲姬闀夸笂鐨勪綅缃?/PathtowalkEndif(percent>=1){distance=curveLength;console.log("鍒拌揪鐩殑鍦?);//绉婚櫎璺嚎scene.remove(curveMesh);//绉婚櫎瀵硅薄scene.remove(moveMesh);杩斿洖;}//缁х画绉诲姩item.distance=distance;//鐩爣鐐瑰埌鐩爣鐐圭殑璺濈consttargetOffset=lerpSpeed;//!!!鏁板€艰秺灏忥紝杞ㄨ抗瓒婂钩婊?/浠庢洸绾夸腑鑾峰彇鐗╀綋鐨勭偣bit.getPointAt(u:Float,optionalTarget:Vector):Vector锛寀-鏍规嵁寮ч暱鍦ㄦ洸绾夸笂鐨勪綅缃?蹇呴』鍦╗0,1]鑼冨洿鍐呫€俢urve.getPointAt(percent%1,moveMeshPosition);//浠庢洸绾夸腑鑾峰彇鐗╀綋鐨勭洰鏍囩偣curve.getPointAt((percent+targetOffset)%1,moveMeshTarget);//鐗╀綋鐨勫畾浣嶏紙鐜板湪鐨勪綅缃級moveMesh.position.copy(moveMeshPosition);//瀹炵幇杞棆杞紙鐜板湪鐪嬪摢閲岋級moveMesh.lookAt(moveMeshTarget);//orsmoothposition//moveMesh.position.lerpVectors(moveMeshPosition,moveMeshTarget,0.5);}浠ヤ笂灏辨槸澶ф鐨勬€濊矾~鍙傝€冮摼鎺hreejs-CatmullRomCurve3astar.jsastar-demo
