八叉树,分裂空间的魔法师【Unity】

news2024/9/20 18:00:27

八叉树,分裂空间的魔法师

前往我的博客阅读,享受免费无广告的体验

诞生

当我们要做物理碰撞检测的时候,例如一枚子弹射了出去,我们或许会选择遍历所有的物体,通过运算判断是否相交,是否发生碰撞,但这不理想,尤其是面对成千上万物体的时候,计算量极其恐怖。
同样的,在面对光线计算,遮挡关系计算中也有这个问题。
事实上,如果让我们也这样做,即从头看到尾,依次遍历,寻找碰撞,也未必迅速。但是我们能很快发现发生碰撞的物品,为什么?

因为我们会进行一个潜在的分区,只看可能会碰撞的位置

这就是我们的思路,尝试进行分区,然后遍历分区内的物体;
八叉树就这样诞生了

原理

先看个图片:
在这里插入图片描述

这个图片是李恒老师的图片,很直观的展示了八叉树根本的原理。
即通过预划分,将其分类,当需要检测东西的时候,只需要对其空间内的进行遍历

从Octree到BVH,对空间划分的理解

最近在看games104,也算是学了游戏引擎的毛毛皮。
其最大的意义,我认为是让游戏引擎变聪明了,可以借助技巧减少运算了。

  • 例如生化危机8:村庄中,也可以说绝大数生化危机中,都对房间进行划分,进入某个房间后,激活僵尸AI,做相关处理。
  • 再例如僵尸毁灭工程我的世界,就对引入区块的概念,重点渲染,处理区块内的内容。

总之,核心并不难理解,其底层就是划分,然后分开处理。

使用

有了最最最浅显的理解,可以写一下最基本的数据结构了

public class OctreeNode  
{
     
    // 空间大小与其内的物体  
    public List<GameObject> areaObjects;  
    public Vector3 center;  
    public float size;  
          
	private const int kidCount = 8;  
    private OctreeNode[] kids;  
    
    public OctreeNode(Vector3 center, float size)  
    {
           
	    kids = new OctreeNode[kidCount];  
        this.center = center;  
        this.size = size;  
        areaObjects = new List<GameObject>();  
    }    
    //四个上面的节点
    public OctreeNode top0  
    {
     
        get {
    return kids[0];}  
        set {
    kids[0] = value; }  
    }  
	// 省略
	//四个下面的节点
    public OctreeNode bottom0  
    {
     
        get{
    return kids[4];}  
        set {
    kids[4] = value; }  
    }  
    // 省略
    
    public int objectCount => areaObjects.Count;  
  
    public void DrawGizmos()  
    {
           
	    Gizmos.DrawWireCube(center, Vector3.one * size);  
    }  
    
    public bool Contains(Vector3 position)  
    {
           
	    var halfSize = size * 0.5f;  
        return Mathf.Abs(position.x - center.x) <= halfSize &&  
               Mathf.Abs(position.y - center.y) <= halfSize &&  
               Mathf.Abs(position.z - center.z) <= halfSize;  
    }          

    public void AddGameobject(GameObject go)  
    {
           
	    areaObjects.Add(go);  
    }          
}

很容易理解,即定义了一个OctreeNode,其拥有一个位置与大小,其包含八个OctreeNode;

接下来是八叉树控制代码

public class OctreeNodeCon : MonoBehaviour  
{
     
    public OctreeNode root;  
    private List<GameObject> sceneObjects;  
    [Range(0, 500)] public int genCount = 100;  
    [Range(1, 8)] public int buildDepth;  
    [Range(1, 300)] public float range = 100;  
          
  
    [Range(0, 8)] public int displayDepth = 3;  
    public bool showOctree = true;  
    public OctreeDebugMode octreeDebugMode;  
    public Color[] displayColor;  
    // 检测信息  
    public bool showQueryResult = true;  
    public GameObject checkTarget;  
    private List<GameObject> queryObjects

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2125176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在近一年内获得过新融资的中国独角兽企业

独角兽公司的概念源于 2013 年美国著名的 Cowboy venture 的投资人 Aileen Lee她将“成立时间较短、由投资人或者估值机构估值超过10 亿美元的未上市公司”定义为独角兽公司。独角兽也就是那些创业公司中的佼佼者。21 世纪至今&#xff0c;人类多个领域取得了显著的技术进步和突…

FreeRTOS(速记版)

第一章 初识 FreeRTOS 1.1 FreeRTOS简介 FreeRTOS 采用了 MIT 开源许可&#xff0c;这允许将 FreeRTOS 操作系统用于商业应用&#xff0c;并且不需要公开源代码。此外&#xff0c;FreeRTOS 还衍生出了另外两个操作系统&#xff1a;OpenRTOS 和 SafeRTOS&#xff0c;其中 OpenR…

探究文本完全对齐技术:从理论到代码

文本完全对齐算法解析与实现 引言 在编辑文档、设计书籍版面或网页时&#xff0c;通常需要将文本进行格式化对齐&#xff0c;以提升视觉吸引力和易读性。 一种广泛采用的对齐技术是所谓的“完全对齐”&#xff0c;这意味着文本的每一行的起始和结束位置都要对齐整齐。 虽然许多…

暴雨液冷服务器硬刚液冷放量元年

AI&#xff08;人工智能&#xff09;不断向前&#xff0c;作为AI三驾马车之一&#xff0c;算力需求始终如影随形。 近日&#xff0c;财经记者走访了河南郑州多家服务器厂商、大模型公司和算力中心。在走访中&#xff0c;记者发现&#xff0c;液冷技术正被算力行业青睐&#xf…

3GPP How to manage a project?

有人问:"3GPP 每个release都做了哪些方面的增强&#xff1f;应该有专门的文档介绍吧?"那肯定是有的&#xff0c;其实按照 https://t.zsxq.com/zbSox 中的方法就能找到那个文档。这篇我们整体浏览看下3GPP是如何handle project&#xff0c;这其中就会具体涉及哪些内…

ctfshow-web入门-sql注入(web244-web247)error 报错注入

目录 1、web244 2、web245 3、web246 4、web247 1、web244 在它查询框这里随便输什么都没有回显 还是在 api 接口下传参&#xff0c;输入存在 id&#xff1a; /api/?id1 查询成功 输入不存在的 id&#xff1a; /api/?id0 查询失败 追加单引号后&#xff0c;报 sql 语法…

从零到一,数字文创IP是如何在基地中孵化成长的?

在数字时代的浪潮下&#xff0c;数字文创IP孵化基地正成为培育创新的肥沃土壤&#xff0c;见证着一个个数字文创 IP 从无到有、茁壮成长。 数字文创IP孵化基地首先为创意的萌发提供了空间。这里汇聚了各路富有创造力的人才&#xff0c;他们的思想在这里碰撞&#xff0c;灵感的火…

网络原理(3)—— 应用层、传输层(TCP)

1. 应用层 日常开发中最常用到的一层&#xff0c;主要涉及到两种情况&#xff1a; 1) 使用现成的应用层协议 2) 自己定义应用层协议 1.1 自定义应用层协议的流程 1. 明确前后端交互过程中需要传递哪些信息 实例&#xff1a;开发一个外卖软件 打开软件&#xff0c;首先需要展…

Win11安装mysql5.7.24

Win11安装mysql5.7.24 资源文件mysql安装过程 资源文件 mysql5.7.24免安装压缩包 下载链接&#xff1a; https://download.csdn.net/download/weixin_44174685/89738053 DirectX&#xff08;用来修复缺失dll&#xff09; 下载链接&#xff1a;https://download.csdn.net/downl…

App弱网测试是怎么测试的

一、网络测试的一般流程 step1&#xff1a;首先要考虑网络正常的情况 ① 各个模块的功能正常可用 ② 页面元素/数据显示正常 step2&#xff1a;其次要考虑无网络的情况 ① APP各个功能在无网络情况下是否可用 ② APP各个页面之间切换是否正常 ③ 发送网络请求时是否…

永成防回水防回气装置脚踏实地老厂家

永成防回水防回气装置脚踏实地老厂家&#xff0c;分歧式防爆器是安装在瓦斯抽放管路中的简易防爆装置。 来吧&#xff0c;有业务就冲着我来。 别让我的同行太辛苦&#xff0c; 我在这里&#xff0c;等你来。 本防回水防回气装置是一种用于煤矿瓦斯管路爆渣和燃烧时防止回火、防…

为什么说开放式耳机值得买?打工人通勤必备的蓝牙耳机推荐

开放式耳机值得购买&#xff0c;主要有以下几方面原因&#xff1a; 佩戴舒适性高&#xff1a; 不压迫耳道&#xff1a;开放式耳机不进入耳道&#xff0c;不会对耳道产生压迫&#xff0c;避免了入耳式耳机长时间佩戴可能导致的耳道疼痛、肿胀等不适状况。无论是小耳道用户&…

91、K8s之ingress上集

一、Ingress service模式&#xff1a; loadbalance NodePort&#xff1a;每个节点都会有一个指定的端口 30000-32767 内网 clusterip&#xff1a;默认模式&#xff0c;只能pod内部访问 externalName&#xff1a;需要dns提供域名 1.1、对外提供服务的ingress service&…

文献解读-The trans-omics landscape of COVID-19

关键词&#xff1a;流行病学&#xff1b;基因测序&#xff1b;变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;The trans-omics landscape of COVID-19 标题&#xff08;中文&#xff09;&#xff1a;COVID-19的跨组学全景 发表期刊&#xff1a…

【豆包Marscode体验官】爽了!直接口诉让豆包MarsCode 开发文章评论区BOT!

以下是「豆包 MarsCode 体验官」优秀文章&#xff0c;作者萌新杰少。 前言 不知道大家刷B站视频有没有注意到评论区下面会有人课代表&#xff0c;随后就会有一个B站的用户回复该视频的总结内容。 没有错&#xff01;我们今天就要复刻这个功能&#xff0c;不过是在掘金的评论区…

5G Multicast/Broadcast Services(MBS) (二) Multicast

这篇是Multicast handling的overview,正文开始。 值得注意的是,对于5MBS multicast,UE只有处于 RRC connected和Inactive时,网络侧才可以 通过MRB将MBS multicast数据传输到 UE;处于Idle态只能进行MBS broadcast过程。 对于multicast涉及的RN

防火墙、firewalld指令、更改yum源为阿里云的yum源及常见问题

一、防火墙分类 1、硬件防火墙 2、软件防火墙&#xff08;咱们昨天学的就属于这个&#xff09; 3、waf 4、下一代防火墙 二、工作原理 1、通过对进出口数据的&#xff08;数据、端口、IP等&#xff09;进行过滤&#xff0c;达到对内网数据的保护。 2、防护危险的一堵墙、…

Qt自定义按键实现长,短按

本文介绍Qt自定义按键实现长&#xff0c;短按。 Qt触摸屏应用有时会涉及到触摸屏按钮长&#xff0c;短按操作&#xff0c;如长按实现关机操作&#xff0c;本文基于普通QPushButton为基类&#xff0c;自定义按键实现长&#xff0c;短按操作。 1.定义新类 这里以QPushButton为…

电商|基于java的农业电商系统(源码+数据库+文档)

农业电商系统 目录 基于java的农业电商系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 前台&#xff1a; 后台&#xff1a; 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️…

ADC模数转换

ADC模数转换 ADC简介逐次逼近型ADC简介STM32的ADC外设 ADC的基本结构ADC输入通道规则组的转换模式单次转换&#xff0c;非扫描模式连续转换&#xff0c;非扫描模式单次转换&#xff0c;扫描模式连续转换&#xff0c;扫描模式 触发控制数据对齐转换时间校准可输出不同电压的电路…