视锥体(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 视景体裁剪相关推荐

  1. 3D坐标系、矩阵变换、视景体与裁剪

    背景 当前3D图形界主要有两个:微软的Direct 3D以及某组织的OpenGL.曾经一度OpenGL几乎占据所有3D图形领域,这在巨人微软面前简直就是屌丝逆袭.曾几何时微软搞IDE borland公 ...

  2. OpenGL投影变换:视景体及glFrustum、gluPerspective 与glOrtho、gluOrtho2D

    一.            视景体 视景体是指成像景物所在空间的集合.它是一个空间集合体. 注意视景体指的是一个空间集合.一般来说,集合中的每个空间都是个立方体.然后所有的这些空间堆在一起,在外侧取一 ...

  3. [WorldWind学习]17.视域调度(视域体裁剪)

    视域调度(视域体裁剪) 在WW中用户改变自己的的视角,纹理影像和高程会动态加载,在视野范围内的影像和DEM显示,超出视域范围的瓦片则不显示.不仅是瓦片,太阳.大气网格.三维模型ModelFeature ...

  4. 基于OpenGL的冰川与火鸟(光照计算模型、视景体、粒子系统)

    目录 一. 项目简介 3 功能与操作简介 3 代码简介 3 与课程设计要求的对应 4 二. 场景实现 4 冰川 4 太阳与时间变化 5 天空 6 雾效 6 风 6 三. 粒子系统 7 粒子生成器 7 ...

  5. 判断点是否在视景体内的参考资料

    最近在研究视景体裁剪的问题,在网上搜索资料,以下是可以参考的内容,希望对大家有帮助. http://www.lighthouse3d.com/tutorials/view-frustum-cullin ...

  6. OpenGL视椎体 裁剪和剔除

    毕设做的是<基于四叉树的LOD地形渲染>,其中主要参考了潘李亮的<基于LOD的大规模真实感室外场景试试渲染技术的初步研究>一文,如有有兴趣做四叉树LOD的话,建议读一读这篇文章 ...

  7. 史上最全虚拟现实VR(视景仿真/系统仿真/可视化)工作站硬件配置方案

    主要内容 第一章 虚拟现实(视景仿真.系统仿真.可视化)系统介绍 第二章 虚拟现实系统对硬件技术要求 第三章 行业应用VR工作站配置方案          VR应用1-视景仿真与训练工作站配置方案   ...

  8. 虚拟现实VR(视景仿真、系统仿真、可视化)工作站配置方案

    主要内容 第一章 虚拟现实(视景仿真.系统仿真.可视化)系统介绍 第二章 虚拟现实系统对硬件技术要求 第三章 行业应用VR工作站配置方案            VR应用1-视景仿真与训练工作站配置方案 ...

  9. 军事仿真新纪元——全数据实时驱动视景仿真

    进入21世纪,高技术的迅猛发展和广泛应用,推动了武器装备的发展和作战方式的演变,促进了军事理论的创新和编制体制的变革,由此引发新的军事革命.信息化战争最终将取代机械化战争,成为未来战争的基本形态.信息 ...

最新文章

  1. 速度超快!字节跳动开源序列推理引擎LightSeq
  2. 树莓派避障小车(python)
  3. 51Nod-1136 欧拉函数【数论】
  4. cocos2dx 坐标系统详解
  5. Orace 12.2 ORA-12012: error on auto execute of job SYS.ORA$AT_OS_OPT_SY_21
  6. 14-angular.isDefined
  7. Centos7搭建Java环境,并设置项目自启动脚本、定时数据库备份/日志清理脚本
  8. 软件使用手册模板_我的印象笔记使用手册(精简说明)
  9. vim 复制一行并且粘贴_Vim常用命令2之文本操作
  10. JS中关于异步的那点事~
  11. RN子组件获取redux数据
  12. 微信内测新功能:公众号们脖子一凉...
  13. [Ext JS 4] Extjs 之 initComponent 和 constructor的区别
  14. Ubuntu Git安装与使用
  15. Android系统信息获取 之八:WIFI设备和WIFI信号信息获取
  16. C++知识点(三)函数
  17. python之手机号码的验证查询
  18. 华为s8600手机驱动_深度丨国产OLED驱动芯片玩家的机遇与困难
  19. The serializable class Myplayer does not declare a static final serialVersionUID field of type long
  20. 将multisim中波形在matlab中输出

热门文章

  1. 在校外时利用Easy Connect连接西工大校园内网(FTP、内网资源)简易教程
  2. wpspbc按钮是什么意思_10秒搞定 超简单的PBC按钮配置法
  3. ASEMI肖特基二极管SBT30100VDC的特点有哪些
  4. 有了中值联区块链证书我们对钓鱼网站说“不”
  5. Java如何计算2个时间段内共有几天几小时几分几秒
  6. pdf转word文档
  7. android RecyclerView列表自动播放实现
  8. Koltin26,flutter人脸识别模块
  9. ACL基本概述与配置
  10. android之IM即时通信原理