当前位置: 首页 > news >正文

cocos creator 笔记-路边花草

版本:3.8.5

实现目标:给3d道路生成路边景观花草

在场景下创建一个节点,我这里种植两种花草模型,兰花和菊花,所以分别在节点下另创建两个节点,为了静态合批。

 1.将花草模型分别拖入场景中,制作成预制文件。

 2.给plant节点绑定一个脚本,用来初始化生成植物。

一般道路是由平面连接成,所以需要先获取道路模型的网格顶点

    /**
     * 根据 道路路径获取两侧边界点
     * @param roadPath 
     */
    public static getPointByRoad(roadPath: string) {
        try {
            let road = find(roadPath)
            let mesh = CommonUtil.getMeshRendererAdapter(road).mesh
            let 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() * 2
            if(tty<1){
                resources.load('prefab/flower/lanhua', Prefab, (err: any, data) => {
                    if (!data) {
                        return
                    }
                    let hua = instantiate(data)
                    hua.parent = lanhuag
                    hua.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 = juhuag
                    hua.setPosition(v3(arr[i].x,arr[i].y,arr[i].z))
                })
            }
        }
    }

效果如下

相关文章:

  • java8循环解压zip文件---实现Excel文件数据追加
  • 慧通测控汽车智能座舱测试技术
  • k8s基础知识总结node+pod(上)
  • CSS语言的双向链表
  • 4、pytest常用插件
  • word中指定页面开始添加页码
  • Python(4)Python函数编程性能优化全指南:从基础语法到并发调优
  • Java设计模式之访问者模式
  • 计算机网络 - OSI 七层模型
  • 笔记:分享如何使用github静态页面搭建个人页面
  • 【2025】基于springboot+uniapp的企业培训打卡小程序设计与实现(源码、万字文档、图文修改、调试答疑)
  • 专访成都昭音科技Jackal:AI内容营销助力中企走向全球
  • 鸿蒙学习笔记(2)-国际化配置、ArkTS简述
  • 【Javaweb】b站黑马视频学习笔记(导览)
  • 多模态大模型Qwen 和 Qwen2 的模型结构、训练方式与数据处理对比分析
  • 安卓应用兼容新方案:Android Translation Layer(ATL)
  • 抽奖的诱惑系统注册与登录功能测试报告
  • 机器学习都有哪些算法?
  • 大模型技术在商品归一和商品预测中的应用
  • 5.5 位运算专题:LeetCode 面试题 17.19. 消失的两个数字
  • 美国前总统拜登确诊前列腺癌
  • 经济日报:人工智能开启太空经济新格局
  • 六省会共建交通枢纽集群,中部六省离经济“第五极”有多远?
  • 美国务卿会见叙利亚外长,沙特等国表示将支持叙利亚重建
  • 上海老字号卖黄金,与动漫IP联名两周销售额近亿元
  • 涉案资金超2亿元 “健康投资”骗局,专挑老年人下手