版本:3.8.5
實現目標:給3d道路生成路邊景觀花草
在場景下創建一個節點,我這里種植兩種花草模型,蘭花和菊花,所以分別在節點下另創建兩個節點,為了靜態合批。
?1.將花草模型分別拖入場景中,制作成預制文件。
?2.給plant節點綁定一個腳本,用來初始化生成植物。
一般道路是由平面連接成,所以需要先獲取道路模型的網格頂點
/*** 根據 道路路徑獲取兩側邊界點* @param roadPath */public static getPointByRoad(roadPath: string) {try {let road = find(roadPath)let mesh = CommonUtil.getMeshRendererAdapter(road).meshlet pos = mesh.renderingSubMeshes[mesh.jointBufferIndices[0]].geometricInfo.positions;let result = []let worldMatrix = mat4();CommonUtil.getMeshRendererAdapter(road).node.getWorldMatrix(worldMatrix);for (let i = 0; i < pos.length; i += 3) {//頂點的本地坐標坐標轉世界坐標let position=new Vec3()Vec3.fromArray(position, pos, i);let transform = v3();Vec3.transformMat4(transform, position, worldMatrix);result.push(transform)}return result} catch (e) {return []}}
如果模型面數比較大,數據就要進行抽稀
public static dataDilution(data=[],deg:number=1){if(deg<=1||data.length==0){return data}let arr=[]for(let i=0;i<data.length;i+=deg){arr.push(data[i])}return arr}
現在就可以在plant腳本上進行創建使用了
initData(){let arr = RoadsidePlantUtil.getPointByRoad(this.roadPath)arr = RoadsidePlantUtil.dataDilution(arr,2)let lanhuag=find(MarryManUtil.housPath + '/luduan/plant/lanhuag')let juhuag=find(MarryManUtil.housPath + '/luduan/plant/juhuag')for(let i=0;i<arr.length;i++){//y值小于-30不進行操作if(arr[i].y<-30){continue}let tty = Math.random() * 2if(tty<1){resources.load('prefab/flower/lanhua', Prefab, (err: any, data) => {if (!data) {return}let hua = instantiate(data)hua.parent = lanhuaghua.setPosition(v3(arr[i].x,arr[i].y,arr[i].z))})}else {resources.load('prefab/flower/juhua', Prefab, (err: any, data) => {if (!data) {return}let hua = instantiate(data)hua.parent = juhuaghua.setPosition(v3(arr[i].x,arr[i].y,arr[i].z))})}}}
效果如下