先说一下视椎的概念:视椎是摄像机可见的空间体积,外观就像截掉顶部的金字塔。视椎剔除就是将在视锥外的物体不进行渲染操作,以加快运行速度。大型场景经常用四叉树的技术来管理,即用四叉树的方式进行空间划分。
一:场景管理中四叉树的划分
现以一地面为例讨论四叉树的划分技术。
地面是由很多个三角形组成,两个三角形合成一正方形。如不进行四叉树划分,则需遍历所有三角形以确定被剔除物体,算法复杂度大。如下图所示:
当我们用四茶树来管理物体时,可把地面看成一大正方形,将视椎的横截面与地面重合,并作第一次四等分划分,如此,对四个正方形区域作第一次遍历后,只需对视椎截面所在的上两个正方形作第二次深入遍历。如图所示:
将有视椎截面的区域作第二次四等分划分,同理再作第三次划分,同样只需对视椎截面所在的区域进行下一次深入的划分。如图所示:
这样不断地划分,而所需遍历的三角形随着划分层次的增加而减少,从而降低了复杂度,加快了渲染速度。
二:四叉树的构建:
其基本属性有:四个子节点及其索引和坐标,父节点,节点所在层次,节点的可见状态等。如图:
下面计算各节点索引及其坐标:
设子节点0索引Index[0]为0,四个子节点坐标pos由外面传入,地面宽度为width, 长度为lenght,划分层次为3,则有8行8列总共64个节点。
Index[0]=0,
Index[1]=width,
Index[2]=(width+1)*length,
Index[3]=(width+1)*(lenght+1)-1
经第一次划分后生成四个正方形:
(0,down,left,center)(down,1,center,right) (left,center,2,up) (center,right,up,3)
节点down索引:Index[down]=(Index[1]+Index[0])/2
节点left索引: Index[left]=(Index[0]+Index[2])/2
节点 up 索引:Index[ up ]=(Index[2]+Index[3])/2
节点right索引:Index[right]=(Index[1]+Index[3])/2
节点center索引:Index[center]=(Index[up]+Index[down])/2
同理可根据各节点坐标计算其四个子节点坐标,如此循环计算,即得各层节点索引和坐标。
三:四叉树在场景中的应用
怎样把具体物体和四叉树联系起来呢?方法如下:
首先根据地形参数生成一四叉树,然后在四叉树的所有节点中寻找这样的节点:当前物体的位置在该节点的四个子节点围成的正方形区域里。接着将此物体加入该节点的objects列表,object类型为物体的类型,再设计算法利用当前摄像机计算出每个节点的可见状态,分完全可见,完全不可见,部分可见三个状态:若全部可见,则该节点及其所有下层子节点均设为可见状态。若完全不可见,则该节点及其所有下层子节点均设为不可见状态,若部分可见,则设该节点为可见后,再用算法计算其四个子节点的可见状态,如此递归调用该算法,再根据节点是否是叶子节点来设置其附属object的可见性。到渲染阶段,根据节点中object的可见性,确定其渲染状态。
四:场景划分在优化碰撞检测中的应用
在复杂场景中,由于用户的交互和物体的运动,物体间经常可能发生碰撞,此时为保持环境的真实性,需要及时检测到这些碰撞,并计算相应的碰撞反应,更新绘制结果,否则物体建会发生穿透现象,破坏场景的真实感。先举个碰撞检测的例子:场景里有个人,人行走的时候需要与场景的物体进行碰撞检测,那样才能使人不至于走到物体内部。这里有两个问题需要解决,一是检测到碰撞的发生和碰撞的位置,二是计算碰撞后的反应。而碰撞检测是计算碰撞反应的先决条件,因此,碰撞检测是复杂场景中必不可少的部分。而复杂场景中通常包含大量物体,加上物体的形状复杂,假如不做场景管理,那就要遍历场景里的所有物体,看看它有没有与人体发生碰撞。场景里物体愈多,那检测起来就越慢。因此,复杂场景中碰撞检测的研究目标是如何在很高的实时交互的要求下完成对大量复杂物体的碰撞检测。若有了场景管理,譬如用四叉树进行空间划分,那可以先计算出人物在哪个节点里,然后在碰撞检测的时候,就可以只检测与它相同(以及邻接)节点里的物体就够了,就不需要检测所有物体。
分享到:
相关推荐
大规模场景实时渲染在虚拟...该方法主要通过对整个场景的场景图进行树状组织和优化管理,然后利用三维场景的包围盒和场景剖分技术完成快速的视域剔除,从而达到优化管理整个复杂场景的目的,大大提高了实时渲染的速率。
当使用Unity构建大规模的游戏地图或场景时,使用四叉树数据结构可以提高性能和效率。四叉树是一种基于分割的数据结构,将空间划分为四个相等的子区域,并以递归方式构建树结构。在游戏开发中,四叉树常用于空间分区...
大规模复杂场景可见性判断及剔除技术研究与实现,一篇学位论文,主要将3D场景剔除,加速优化等问题,供相应需要的人参考。
四叉树-2D平面的渲染剔除、碰撞次数优化-附件资源
3d场景八叉树优化算法,可以解决卡顿
Janua, 3D 场景的开源遮挡剔除引擎 JANUA使用Janua加速 3D 场景 !Janua是一个自动门户和单元生成器,用于在 3D 个场景中执行遮挡剔除。 Janua计算场景中可能可见的设置( PVS ) 并将它的保存到在运行时查询的文件中...
研究论文-剔除异部雷达信号方法的研究与应用
翻译的国外的文献,介绍了3d引擎中如何对场景进行管理,如经典的八叉树,来对场景中视景外的多边形进行剔除
Perfect Culling-Occlusion Culling System Unity完美剔除遮挡剔除系统插件unitypackage项目源码C# 支持Unity版本2019.4.40或更高 Perfect Culling 使您能够为预制件和场景烘焙像素完美的遮挡数据。它的工作原理是为...
k-means离群点剔除法:主要运用聚类均值方法剔除数据中的离群点,增强模型预测的精度等,本文为matlab代码
介绍了X射线探测识别煤矸石技术的基本原理与工作流程。对采集到的X射线图像经中值滤波去噪预处理后,分别提取灰度特征下的灰度均值、灰度方差,以及基于灰度共生矩阵的纹理特征下的能量、相关性、对比度和熵共计6个...
论文研究-基于MC-SFA模型的我国信托业经营管理效率评价.pdf, ... MC-SFA模型作为企业经营管理效率(management efficiency)实证研究的技术基础,为推动信托公司提高经营水平提供很好参考.
行业文档-设计装置-剔除云母纸电容器次品的检测方法.zip
基于多分辨率地形模型的四叉树构建过程,首先针对四叉树优化采用的3个判断标准———包围体剔除、背面剔除和屏幕投影误差分别进行相应的网格优化,然后在LOD地形中漫游时,随着视点移动而呈现出的不同细节程度的需要,...
针对树木点影响三维激光扫描仪获取沉陷区DEM精度的问题,根据树木点云的空间分布特点,采用一种基于...研究结果表明:该方法可以较好的剔除树木点并保留地面点,同时将地面点错分为非地面点的误差较小,具有一定实用价值.
- GPU 视锥体剔除。 - GPU 遮挡剔除(还支持具有单通道和多通道渲染模式的 VR 平台)。 - 支持自动配置的自定义着色器。 - 支持标准、通用和高清渲染管线。 - 一键即可将层次复杂的预制件进行实例化。 - 支持多个子...
场景剔除,可见序列集的计算
行业分类-设备装置-纸张剔除处理方法和装置.zip
一个粗略的八叉树实现,可在复杂的THREE.js场景中支持视锥剔除和射线投射。 注意:代码通常是未完成和未完成的。 去做 如果彼此之间正好有一堆物体,则需要最大深度 考虑使用SAH添加优化并进一步限制边界框 提供...