OpenGL 视景体裁剪
视锥体(frustum),是指场景中摄像机的可见的一个锥体范围。它有上、下、左、右、近、远,共6个面组成。在视锥体内的景物可见,反之则不可见。为提高性能,只对其中与视锥体有交集的对象进行绘制。我们计算出视锥体六个面的空间平面方程,将点坐标分别代入六个面的平面方程做比较,则可以判断点是否在视锥体内。具体可参见:http://www.cnblogs.com/dragon2012/p/3891519.html
接下来的部分翻译(水平有限,翻译不是很好,体会意思即可(:)自Frustum Culling In OpenGL部分内容主要讲解了对于物体的包围盒以及包围球的视景体裁剪。
包围盒
在我们继续进行更精细的测试之前,我们应该谈谈包围盒。
假如说,你的一个对象是一个包含有大量多边形的很精细的物体。我们会对模型中的每一个顶点进行PointInFrustum()操作进行测试,但是测试可能会比简单的将其交给OpenGL处理要慢。
【事实上,不是每个点的测试都是有效的——如果模型完全包围视景体呢?所有的点都将在视景体外,但是我们依旧要绘制它。】
那我们该怎么办?想象一个可以完全包围模型的球体。现在,我们只是去测试这个球体而不是这个模型。如果球体的所有部分都是“可见”的久绘制模型(但不是球)。
这使我们可以决定是否使用一个简单的测试来绘制一个对象,而不是对模型中的每个点都进行测试。当然,有时尽管模型是不可见的而我们测试的包围球依旧是可见的,此时我们可以交给OpenGL处理。
我们测试的这个球叫做包围球,是包围体的一个例子。其他的包围体通常是包围盒。你也可以用其他的几何体,但是球和盒通常是最实用的。
这个思想用来对每个加载到内存中的模型计算包围球。对于每个球只需要存储四个数字——一个点和一个半径。对于一个立方体,你可以做同样的,和一个任意的方块,你需要八点。在任何情况下,开销小。
所以,哪个更好,球或者是盒?我们稍后再回到这个问题。
包围球是否在视景体中
现在我们知道为什么要对包围球进行测试,但是我们该如何实现呢?事实上,它几乎和PointInFrustum()是相同的测试。
bool SphereInFrustum( float x, float y, float z, float radius )
{ int p; for( p = 0; p < 6; p++ ) if( frustum[p][0] * x + frustum[p][1] * y + frustum[p][2] * z + frustum[p][3] <= -radius )
<span style="white-space:pre"> </span>return false;
return true;
}
我们通过包围球球心的X,Y,Z坐标和半径(来计算)。跟点测试唯一的区别是,比较的距离是半径而不是0。
一个奇妙的改动
float SphereInFrustum( float x, float y, float z, float radius )
{int p;float d;for( p = 0; p < 6; p++ ){d = frustum[p][0] * x + frustum[p][1] * y + frustum[p][2] * z + frustum[p][3];if( d <= -radius )return 0;}return d + radius;
}
这个方法除了当球在视景体内时返回0,否则返回distance+radius跟上一个方法是相同的。
这为我们做了什么?在frustum数组中最后一个面是近平面,所以,除了告诉我们球是否可见外,还会告诉我们物体距离照相机有多远。
这是非常cool的,因为我们可以用它来改变细节的层次。如果物体靠近近平面我们可以用更多的多边形来渲染,但是如果它远离,我们可能会用一个不是和详细的版本。巧妙的是,这是完全是没有任何消费的——反正无论如何我们都得做这些计算。
【请注意,简单地使用的距离,以确定一个物体细节的级别并不总是最好的方法。你也许还想考虑这个球的半径。例如,一个远处的非常大的物体,可能比近处的一个小的物体需要更多的细节。】
包围盒是否在视景体内?
一个点不可能比视景体还要大,并且包围球测试即使是在包围球完全包围视景体是依旧是有效的,但是包围盒还是要更复杂一点。
我们可以测试包围盒的八个角是否在视景体内,并且对于很多情况是有效的,但是当包围盒完全包围视景体时呢?所有的角都在视景体外,但是它依旧是可见的。
这个例子中我们将假定的包围盒是一个立方体,但你可以很容易地修改常规工作八点任意一组(或如果你想使用一个更复杂的包围盒)。
bool CubeInFrustum( float x, float y, float z, float size )
{int p;for( p = 0; p < 6; p++ ){if( frustum[p][0] * (x - size) + frustum[p][1] * (y - size) + frustum[p][2] * (z - size) + frustum[p][3] > 0 )continue;if( frustum[p][0] * (x + size) + frustum[p][1] * (y - size) + frustum[p][2] * (z - size) + frustum[p][3] > 0 )continue;if( frustum[p][0] * (x - size) + frustum[p][1] * (y + size) + frustum[p][2] * (z - size) + frustum[p][3] > 0 )continue;if( frustum[p][0] * (x + size) + frustum[p][1] * (y + size) + frustum[p][2] * (z - size) + frustum[p][3] > 0 )continue;if( frustum[p][0] * (x - size) + frustum[p][1] * (y - size) + frustum[p][2] * (z + size) + frustum[p][3] > 0 )continue;if( frustum[p][0] * (x + size) + frustum[p][1] * (y - size) + frustum[p][2] * (z + size) + frustum[p][3] > 0 )continue;if( frustum[p][0] * (x - size) + frustum[p][1] * (y + size) + frustum[p][2] * (z + size) + frustum[p][3] > 0 )continue;if( frustum[p][0] * (x + size) + frustum[p][1] * (y + size) + frustum[p][2] * (z + size) + frustum[p][3] > 0 )continue;return false;}return true;
}
OpenGL 视景体裁剪相关推荐
- 3D坐标系、矩阵变换、视景体与裁剪
背景 当前3D图形界主要有两个:微软的Direct 3D以及某组织的OpenGL.曾经一度OpenGL几乎占据所有3D图形领域,这在巨人微软面前简直就是屌丝逆袭.曾几何时微软搞IDE borland公 ...
- OpenGL投影变换:视景体及glFrustum、gluPerspective 与glOrtho、gluOrtho2D
一. 视景体 视景体是指成像景物所在空间的集合.它是一个空间集合体. 注意视景体指的是一个空间集合.一般来说,集合中的每个空间都是个立方体.然后所有的这些空间堆在一起,在外侧取一 ...
- [WorldWind学习]17.视域调度(视域体裁剪)
视域调度(视域体裁剪) 在WW中用户改变自己的的视角,纹理影像和高程会动态加载,在视野范围内的影像和DEM显示,超出视域范围的瓦片则不显示.不仅是瓦片,太阳.大气网格.三维模型ModelFeature ...
- 基于OpenGL的冰川与火鸟(光照计算模型、视景体、粒子系统)
目录 一. 项目简介 3 功能与操作简介 3 代码简介 3 与课程设计要求的对应 4 二. 场景实现 4 冰川 4 太阳与时间变化 5 天空 6 雾效 6 风 6 三. 粒子系统 7 粒子生成器 7 ...
- 判断点是否在视景体内的参考资料
最近在研究视景体裁剪的问题,在网上搜索资料,以下是可以参考的内容,希望对大家有帮助. http://www.lighthouse3d.com/tutorials/view-frustum-cullin ...
- OpenGL视椎体 裁剪和剔除
毕设做的是<基于四叉树的LOD地形渲染>,其中主要参考了潘李亮的<基于LOD的大规模真实感室外场景试试渲染技术的初步研究>一文,如有有兴趣做四叉树LOD的话,建议读一读这篇文章 ...
- 史上最全虚拟现实VR(视景仿真/系统仿真/可视化)工作站硬件配置方案
主要内容 第一章 虚拟现实(视景仿真.系统仿真.可视化)系统介绍 第二章 虚拟现实系统对硬件技术要求 第三章 行业应用VR工作站配置方案 VR应用1-视景仿真与训练工作站配置方案 ...
- 虚拟现实VR(视景仿真、系统仿真、可视化)工作站配置方案
主要内容 第一章 虚拟现实(视景仿真.系统仿真.可视化)系统介绍 第二章 虚拟现实系统对硬件技术要求 第三章 行业应用VR工作站配置方案 VR应用1-视景仿真与训练工作站配置方案 ...
- 军事仿真新纪元——全数据实时驱动视景仿真
进入21世纪,高技术的迅猛发展和广泛应用,推动了武器装备的发展和作战方式的演变,促进了军事理论的创新和编制体制的变革,由此引发新的军事革命.信息化战争最终将取代机械化战争,成为未来战争的基本形态.信息 ...
最新文章
- 速度超快!字节跳动开源序列推理引擎LightSeq
- 树莓派避障小车(python)
- 51Nod-1136 欧拉函数【数论】
- cocos2dx 坐标系统详解
- Orace 12.2 ORA-12012: error on auto execute of job SYS.ORA$AT_OS_OPT_SY_21
- 14-angular.isDefined
- Centos7搭建Java环境,并设置项目自启动脚本、定时数据库备份/日志清理脚本
- 软件使用手册模板_我的印象笔记使用手册(精简说明)
- vim 复制一行并且粘贴_Vim常用命令2之文本操作
- JS中关于异步的那点事~
- RN子组件获取redux数据
- 微信内测新功能:公众号们脖子一凉...
- [Ext JS 4] Extjs 之 initComponent 和 constructor的区别
- Ubuntu Git安装与使用
- Android系统信息获取 之八:WIFI设备和WIFI信号信息获取
- C++知识点(三)函数
- python之手机号码的验证查询
- 华为s8600手机驱动_深度丨国产OLED驱动芯片玩家的机遇与困难
- The serializable class Myplayer does not declare a static final serialVersionUID field of type long
- 将multisim中波形在matlab中输出