视锥体(frustum),是指场景中摄像机的可见的一个锥体范围。它有上、下、左、右、近、远,共6个面组成。在视锥体内的景物可见,反之则不可见。为提高性能,只对其中与视锥体有交集的对象进行绘制。

视锥体

我们计算出视锥体六个面的空间平面方程,将点坐标分别代入六个面的平面方程做比较,则可以判断点是否在视锥体内。

空间平面方程可表示为:

    Ax+By+Cz=0

对于点(x1, y1, z1),有

若 Ax1+By1+Cz1 = 0,则点在平面上;
若 Ax1+By1+Cz1 < 0,则点在平面的一侧;
若 Ax1+By1+Cz1 = 0,则点在平面的另一侧;

求视锥平面系数1

这里介绍的算法,可以直接从世界、观察以及投影矩阵中计算出Viewing Frustum的六个面。它快速,准确,并且允许我们在相机空间(camera space)、世界空间(world space)或着物体空间(object space)快速确定Frustum planes。

我们先仅仅从投影矩阵(project)开始,也就是假设世界矩阵(world)和观察矩阵(view)都是单位化了的矩阵。这就意味着相机位于世界坐标系下的原点,并且朝向Z轴的正方向。

定义一个顶点v(x y z w=1)和一个4*4的投影矩阵M=m(i,j),然后我们使用该矩阵M对顶点v进行转换,转换后的顶点为v'= (x' y' z' w'),可以写成这样:

转换后,viewing frustum实际上就变成了一个与轴平行的盒子,如果顶点 v' 在这个盒子里,那么转换前的顶点 v 就在转换前的viewing frustum里。在OpenGL下,如果下面的几个不等式都成立的话,那么 v' 就在这个盒子里。

  1. -w' < x' < w'

  2. -w' < y' < w'

  3. -w' < z' < w'

可得到如下结论,列在下表里:

我们假设现在想测试 x' 是否在左半边空间,只需判断

    -w < x'

用上面的信息,等式我们可以写成:

    −(v • row4 ) < (v • row1 )0 < (v • row4 ) + (v • row1 )0 < v • (row4 + row1 )

写到这里,其实已经等于描绘出了转换前的viewing frustum的左裁剪面的平面方程:

    x(m41 + m11) + y(m42 + m12) + z(m43 + m13) + w(m44 + m14) = 0

当W = 1,我们可简单成如下形式:

    x(m41 + m11) + y(m42 + m12) + z(m43 + m13) + (m44 + m14) = 0

这就给出了一个基本平面方程:

    ax + by + cz + d = 0

其中,a = ( m41 + m11) , b = ( m42 + m12 ), c = ( m43 + m13) , d = ( m44 + m14 )

到这里左裁剪面就得到了。重复以上几步,可推导出到其他的几个裁剪面,具体见参考文献1.

需要注意的是:最终得到的平面方程都是没有单位化的(平面的法向量不是单位向量),并且法向量指向空间的内部。这就是说,如果要判断 v 在空间内部,那么6个面必须都满足ax + by + cz + d > 0

到目前为止,我们都是假设世界矩阵( world )和观察矩阵( view )都是单位化了的矩阵。但是,本算法并不想受这种条件的限制,而是希望可以在任何条件下都能使用。实际上,这也并不复杂,并且简单得令人难以置信。如果你 仔细想一下就会立刻明白了,所以我们不再对此进行详细解释了,下面给出3个结论:

  • 1. 如果矩阵 M 等于投影矩阵 P ( M = P ),那么算法给出的裁剪面是在相机空间(camera space)
  • 2. 如果矩阵 M 等于观察矩阵 V 和投影矩阵 P 的组合( M = V * P ),那么算法给出的裁剪面是在世界空间(world space)
  • 3. 如果矩阵 M 等于世界矩阵 W,观察矩阵 V 和投影矩阵 P 的组合( M = W* V * P ),呢么算法给出的裁剪面是在物体空间(object space)

判断节点是否在视锥内

通过各种包围体方法求出近似包围体,对包围体上的各个点对视锥六个面作判断,存在以下三种情况:

  • 如果所有顶点都在视锥范围内,则待判区域一定在视锥范围内;
  • 如果只有部分顶点在视锥范围内,则待判区域与视锥体相交,我们同样视为可见;
  • 如果所有顶点都不在视锥范围内,那么待判区域很可能不可见了,但有一种情况例外,就是视锥体在长方体以内,这种情况我们要加以区分。

视锥体裁剪(从矩阵中提取6个裁剪面)相关推荐

  1. 从矩阵中提取对角线元素;将一维数组转换为对角线矩阵:np.diag()函数

    [小白从小学Python.C.Java] [计算机等级考试+500强双证书] [Python-数据分析] 从矩阵中提取对角线元素 将一维数组转换为对角线矩阵 np.diag()函数 选择题 下列说法错 ...

  2. matlab将矩阵提取,matlab – 从现有矩阵中提取矩阵

    我编写了一个代码来生成一个包含四列的矩阵,以获得总和等于9的所有数字组合,每个数字从0到9不等. m = zeros(220, 4); pd = 9; i = 1; for p = 0:1:pd fo ...

  3. java 图片路径裁剪图片,Java中实现图片的裁剪

    我们将通过以下步骤来学习: 输入图像,指定要处理的图像路径 允许用户拖放要剪裁的部分 选择后使用 Robot 类来确定剪裁部分的坐标 剪裁所选图像并保持 代码由两个文件组成,一个是ImagePanel ...

  4. 【Matlab】矩阵中选取任意子矩阵

    1.Introduction 好久没用Matlab写代码了,嗯,也没用其他语言. 至于怎么实现在矩阵中提取子矩阵,又学了一会,好记性不如烂笔头呀. 2.Materials and methods 如下 ...

  5. 往矩阵中增加数3matlab,MATLAB入门(3):从矩阵开始

    从矩阵开始吧![注:因为第一篇里以声明过就不再重复声明了] 输入简单矩阵的最简单的方法是采用直接输入法.直接输入的元素用空格或逗号隔开,用";"表示一行的结束,并用中括号[ ] 将 ...

  6. DirectX11进阶5_硬件实例化与视锥体裁剪及鼠标拾取交互

    一.硬件实例化(Hardware Instancing) 硬件实例化指的是在场景中绘制同一个物体多次,但是是以不同的位置.旋转.缩放.材质以及纹理来绘制(比如一棵树可能会被多次使用以构建出一片森林). ...

  7. DirectX11 With Windows SDK--20 硬件实例化与视锥体裁剪

    DirectX11 With Windows SDK--20 硬件实例化与视锥体裁剪 原文:DirectX11 With Windows SDK--20 硬件实例化与视锥体裁剪 前言 这一章将了解如何 ...

  8. Unity HybridRender 视锥体裁剪

    Unity HybridRender 使用Unity.Rendering.FrustumPlanes 结构体来实现视锥体裁剪.这个结构体基本都为静态函数,其中使用NativeArray<Plan ...

  9. 【Matlab】如何提取矩阵中特定位置的元素?

    1.Introduction 如果在一个3×3的矩阵中,想提取第一行第一列,和第二行第二列的元素,可以直接在矩阵中索引吗? 试试看~ 好像,这样出来的结果是选出子矩阵,那么怎么选出行列索引对应的元素呢 ...

最新文章

  1. 三级结构_kegg pathway三级层级结构转对应表格
  2. android ota 版本校验,OTA升级签名校验简析
  3. java 学习笔记2022.1.26
  4. git-版本的创建与版本的切换操作
  5. Another test
  6. gulp自动化添加版本号并修改为参数格式
  7. SQL中COUNT()函数介绍
  8. Oracle下sqlplus无法使用命令退格删除和历史记录的解决方法--使用rlwrap
  9. 加一条平行于y轴的直线_Hepco海普克应用案例—直线V型滚轮导轨广泛应用于多轴机械手...
  10. adb 清理内存_教你几招如何清理手机内存,加快运行速度!
  11. QT项目二:局域网聊天工具
  12. 最新地形测量全套实习任务指导
  13. OLED12864(SSD1306)驱动代码
  14. 串口DMA方式发送接收
  15. 中国车牌号的分类说明识别及含义
  16. 【AI Data Science】第 1 章分析性思维与 人工智能驱动的企业
  17. Leetcode——121. Best Time to Buy and Sell Stock
  18. NS2中无线仿真场景生成
  19. 智慧协同新应用:FEv6.6,让组织更灵动/敏捷!
  20. 关于R语言中时间类POSIXct和POSIXlt的一点儿学习收获

热门文章

  1. 开拓高主频CPU场景,硅云第二代云服务器S2近日正式发布
  2. yyyy-MM-dd HH:mm:ss--SimpleDateFormat类的快速入门使用
  3. 简繁体的转换 word
  4. Java程序猿必学第二十二篇—— 网络编程
  5. linux修改密码和宽限天数,Linux用户和组管理
  6. 新词添加功能:错别字检查接口 API
  7. 关于虚拟货币内容发布规则的调整通知
  8. 各数据库sql对比差异
  9. 2022年湖南省临床执业医师考试混合单元随机模拟题
  10. 新毒霸悟空2014 v0709 官方版