unity四叉树视锥体剔除

2023-10-27

节点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Node
{
    public Bounds bound;
    public int myDepth;//当前层数
    public Tree tree;
    public List<ObjData> datas = new List<ObjData>();//数据
    public Node[] childs;//子节点      
    public Vector2[] bif = new Vector2[]
    {
        new Vector2(-1,1),
        new Vector2(1,1),
        new Vector2(-1,-1),
        new Vector2(1,-1)
    };
    public Node(Bounds bound, int myDepth, Tree tree)
    {
        this.bound = bound;
        this.myDepth = myDepth;
        this.tree = tree;
    }
    public void InsertData(ObjData data)
    {
        //层级没到上限 且 没有子节点 可以创建子节点
        if (myDepth < tree.maxDepth && childs == null)
        {
            CreatChild();
        }
        if (childs != null)
        {
            for (int i = 0; i < childs.Length; i++)
            {
                //判断数据的位置是否归属于该子节点的区域
                if (childs[i].bound.Contains(data.pos))
                {
                    //继续去下一层查找
                    childs[i].InsertData(data);
                    break;
                }
            }
        }
        else
        {
            datas.Add(data);
        }
    }
    public void CreatChild()
    {
        //创建树指定的节点
        childs = new Node[tree.maxChildCount];
        for (int i = 0; i < tree.maxChildCount; i++)
        {
            //计算相对坐标
            Vector3 center = new Vector3(bif[i].x * bound.size.x / 4, 0, bif[i].y * bound.size.z / 4);
            //计算大小
            Vector3 size = new Vector3(bound.size.x / 2, 0, bound.size.z / 2);
            //设置矩阵
            Bounds childbound = new Bounds(center + bound.center, size);
            //给子节点赋值
            childs[i] = new Node(childbound, myDepth + 1, tree);
        }
    }

    public void DrawBound()
    {
        //有数据画蓝色框框
        if (datas.Count != 0)
        {
            Gizmos.color = Color.blue;
            Gizmos.DrawWireCube(bound.center, bound.size - Vector3.one * 0.1f);
        }
        else//没数据画绿色框框
        {
            Gizmos.color = Color.green;
            Gizmos.DrawWireCube(bound.center, bound.size - Vector3.one * 0.1f);
        }
        //有子物体让子物体去画
        if (childs != null)
        {
            for (int i = 0; i < childs.Length; ++i)
            {
                childs[i].DrawBound();
            }
        }

    }

    public void TriggerMove(Plane[] planes)
    {
        //有子物体让子物体去判断是否重叠
        if (childs != null)
        {
            for (int i = 0; i < childs.Length; ++i)
            {
                childs[i].TriggerMove(planes);
            }
        }
        for (int i = 0; i < datas.Count; i++)
        {
            //判断矩阵与视锥体6个面是否重叠
            datas[i].prefab.SetActive(GeometryUtility.TestPlanesAABB(planes, bound));
        }
    }
}

 树代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Tree
{
    public Bounds bound;
    private Node root;//根
    public int maxDepth = 6;//最多层数
    public int maxChildCount = 4;//最多分块

    public Tree(Bounds bound)
    {
        this.bound = bound;
        this.root = new Node(bound, 0, this);
    }
    //插入数据
    public void InsertData(ObjData data)
    {
        root.InsertData(data);
    }
    public void DrawBound()
    {
        root.DrawBound();
    }
    public void TriggerMove(Plane[] planes)
    {
        root.TriggerMove(planes);
    }
}

四叉树的使用与视锥体剔除

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreatCube : MonoBehaviour
{
    public GameObject cube;
    public int n = 10;
    public Bounds mainBound;
    Tree tree;//树
    bool startEnd = false;//是否初始化完毕
    public Camera cam;//相机
    Plane[] planes;//视锥体的6个面
    // Start is called before the first frame update
    void Start()
    {
        Init();
    }
    public void Init()
    {
        planes = new Plane[6];//开辟内存
        //初始化场景最大分块
        Bounds bounds = new Bounds(transform.position, new Vector3(2 * n, 0, 2 * n));
        //创建树
        tree = new Tree(bounds);
        //创建预制体
        for (int x = -n; x < n; x++)
        {
            for (int z = -n; z < n; z++)
            {
                if (Random.Range(0,10) < 1)
                {
                    GameObject c = Instantiate(cube, transform);
                    c.transform.position = new Vector3(x, 0, z);
                    //将预制体数据存入树
                    tree.InsertData(new ObjData(c, c.transform.position, c.transform.eulerAngles));
                }
            }
        }
        startEnd = true;
    }

    // Update is called once per frame
    void Update()
    {
        if (startEnd)//判断初始化结束后
        {
            //给视锥体的6个面赋值
            GeometryUtility.CalculateFrustumPlanes(cam, planes);
            //通过树判断是否显示
            tree.TriggerMove(planes);
        }
    }

    private void OnDrawGizmos()
    {
        if (startEnd)//判断初始化结束后
        {
            //通过树绘制包围盒
            tree.DrawBound();
        }
        else
        {
            Gizmos.DrawWireCube(mainBound.center, mainBound.size);
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity四叉树视锥体剔除 的相关文章

  • Angular CLI 使用教程指南参考

    Angular CLI 使用教程指南参考 Angular CLI 现在虽然可以正常使用但仍然处于测试阶段 Angular CLI 依赖 Node 4 和 NPM 3 或更高版本 安装 要安装Angular CLI你需要先安装node和npm
  • RobotStudio 建立机器人模型和虚拟示教器的使用

    本系列使用的ABB机器人仿真软件版本为RbotStudio 5 15 02 64 bit 建立一个机器人模型 1 创建新工作站 空工作站 2 ABB模型库 选择机器人模型 3 导入模型库 选择工具模型

随机推荐

  • angular route 知識點

    讲解 路由功能是由 routeProvider服务 和 ng view 搭配实现 ng view相当于提供了页面模板的挂载点 当切换URL进行跳转时 不同的页面模板会放在ng view所在的位置 然后通过 routeProvider 配置路
  • 解决wordpress配置固定链接出现404错误

    两种方法解决 1 选择自定义结构在想要的固定链接格式前加 index php 这样虽然到达效果但是前面会加多个index php如果想不要的话试试第二种 2 我用的是nginx 在宝塔中选网站再进入设置选择伪静态 增加 location b
  • 向HTML中插入视频有两种方法

    向HTML中插入视频有两种方法 一种是古老的object标签 一种是html5中的video标签 前者兼容性相对好些 后者兼容性让人头疼 最常用的向HTML中插入视频的方法有两种 一种是古老的标签 一种是html5中的
  • CentOS 7.4 安装配置Samba服务器

    root localhost cat etc redhat release CentOS Linux release 7 4 1708 Core root localhost yum y install samba samba client
  • element 框架小细节

    Tabs 自定义添加页 div style margin bottom 20px div
  • NodeJS 对于 Java 开发者而言是什么?

    我们都知道Node js现在得到了所有的关注 每个人都对学习Node js感兴趣 并希望可以工作于Node js 在开始工作之前了解技术背后的概念总是不会错的 但对初学者来说 可能会因为不同的人使用的不同定义而晕头转向 Node js究竟是
  • JKS to PEM

    本文转自 https blog tankywoo com 2014 12 29 jks to pem html JKS Java KeyStore 是Java的一个证书仓库 包括授权证书和公钥证书等 file tankywoo jks ta
  • 动态cg怎么提取_galgame怎么提取动态cg(千彰cg怎么拿)

    crass是一款图片提取软件 那么你下的并不是cg而是提取cg的方法 重新找别的地方下吧 这些软件 crass 0 4 13 14 Susie32 不过有些被加密的 就不能提取 想把CG和音乐都抽出来 虽然网上有CG包下载 不过还是想自己抽
  • java 按list对象多个字段排序

    Java List中的数据如何根据对象的某一个或多个字段排序引出Comparable和comparator的使用 第一节 对于引入题目的探讨 首先把引入题目表述的清楚一些 在一个List中存储的是一些对象实例 而对象实例包含多个属性字段 我
  • HTML中如何插入空格,HTML空格代码,多种HTML空格写法

    记录一下 用到的空格的转义字符 1 最常见 nbsp 的称为 不换行空格 全称 No Break Space 占1个字符宽度 nbsp 2 ensp 称为 半角空格 全称 En Space 占1个字符宽度 ensp 3 emsp 的称为 全
  • 阿里云API网关使用教程

    API 网关 API Gateway 提供高性能 高可用的 API 托管服务 帮助用户对外开放其部署在 ECS 容器服务等阿里云产品上的应用 提供完整的 API 发布 管理 维护生命周期管理 用户只需进行简单的操作 即可快速 低成本 低风险
  • MYSQL的主键和外键,内连接和外连接,关联子查询

    目录 友情提醒 第一章 MYSQL数据库多表主键和外键 1 外键介绍 FOREIGN KEY 2 外键约束作用 2 三种情况下添加外键约束 一对一关系 一对多关系 多对多关系 4 删除外键约束 第二章 MYSQL数据库表之间的连接 1 内连
  • aspnet zero Refused to apply style from '...'because its MIME type ('') is not a supported styleshee

    这是asp net zero前端css javascript无法加载造成的错误 解决方法 1 安装npm 2 安装yarn cnpm install g yarn 3 在 Web Mvc目录下 打开cmd 执行 yarn 执行完成后再运行
  • Jeesite4使用小结(技术选型)

    这段时间公司准备采用新技术来进行开速开发 自己也是接手了一个项目 目前处于一边熟悉框架 一边开发 中间也踩了很多坑 所以在这打算记录一下 希望能给后面接触这个快速开发框架的一点帮助 第一次接触这个框架 一定要先了解他这个框架的技术选型 当然
  • 06_Me and My Girlfriend:信息收集、漏洞利用、基础提权姿势总结回顾

    思路总结 总体来说 在利用nmap进行扫描以后发发现主机 正对主机ip进行端口与服务的扫描 发现网站开放的80端口 访问发现没有任何功能 尝试gobuster与工具的使用扫描目录与敏感文件 但是无可利用信息 查看网页源码发现暴出来的信息us
  • 字符游戏-智能蛇(上)

    字符游戏 智能蛇 上 上周的作业是写出字符游戏 贪吃蛇的小程序 在完成这个项目之后 我将理清思路 记录一下我的学习过程 让蛇动起来 放置奖励的食物 在蛇吃到食物时延长蛇的身体 设置游戏结束的机制 让蛇动起来 先设置一下相应的字符表示 cha
  • java爬取异步数据_Java 关于抓取异步的网页数据

    publicstaticStringgetHtmlCode Stringurl StringcharCode throwsIOException StringhtmlCode InputStreamin null HttpURLConnec
  • 宏的##嵌套问题

    宏的 嵌套问题 错误demo define VAL 55 define CAT STR A B A B int main void 当宏表达式的形参给 宏 VAL 出现问题 int CAT STR Temp VAL 展开得 int Temp
  • Docker:让应用程序轻松移植到任何地方的利器

    文章目录 容器概念 Java代码详解 Dockerfile 容器生命周期 创建 运行 停止 安全性考虑 限制权限 隔离网络 更新镜像 总结 镜像概念 Java代码详解 Dockerfile 镜像仓库 镜像标签 镜像层 总结 Dockerfi
  • unity四叉树视锥体剔除

    节点代码 using System Collections using System Collections Generic using UnityEngine public class Node public Bounds bound p