位置: 编程技术 - 正文

视锥裁剪(视锥是什么意思)

编辑:rootadmin
转自: OpenGL 实现。 背景

推荐整理分享视锥裁剪(视锥是什么意思),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:四种视锥测试,视锥范围,视锥是什么意思,视椎体裁剪算法,视椎体裁剪算法,视锥剔除算法,视锥的角度,视椎体裁剪算法,内容如对您有帮助,希望把文章链接给更多的朋友!

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

视锥体

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

空间平面方程可表示为:

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

求视锥平面系数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' 就在这个盒子里。

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

视锥裁剪(视锥是什么意思)

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

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

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

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

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

其中,a = ( m &#; m) , b = ( m &#; m ), c = ( m &#; m) , d = ( m &#; m )

到这里左裁剪面就得到了。重复以上几步,可推导出到其他的几个裁剪面,具体见参考文献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)判断节点是否在视锥内

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

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

[置顶] 什么是OpenGL中的深度、深度缓存、深度测试? 1)直观理解深度其实就是该象素点在3d世界中距离摄象机的距离,深度缓存中存储着每个象素点(绘制在屏幕上的)的深度!深度测试决定了是否绘制

openGL ES 2.0开发流程 一:添加必须的framework(框架)OpenGLES.frameworks和QuartzCore.framework二:修改OpenGLView.h引入OpenGl的Header,创建一些后面会用到的实例变量CAEAGLLayer*_eaglLayer;EAG

C#+OpenGL编程之OpenGL 变换(机器人) 本文基础:C#OpenGL编程之环境搭建原书第三章使用了一个机器人完成变换。正如基础教程所述,我们现在使用C#继承来修改基础场景。usingSystem;usingSystem.C

标签: 视锥是什么意思

本文链接地址:https://www.jiuchutong.com/biancheng/373248.html 转载请保留说明!

上一篇:OpenGL教程翻译 第九课 插值(opengl transform)

下一篇:openGL ES 2.0开发流程(opengl es应用开发实践指南(android卷)pdf)

  • 福建税务网上办税流程
  • 小企业会计准则适用于哪些企业
  • 公司端午礼盒
  • 现流表怎么编
  • 股权投资公司属于金融企业吗
  • 一般纳税人简易计税可以抵扣进项税额吗
  • 小微企业和小规模纳税人的区别
  • 其它综合收益影响因素
  • 运输费增值税专用发票几个点
  • 一般纳税人转成小规模的条件
  • 固定资产折旧购买日期还是使用日期呢
  • 进口增值税可以抵税吗
  • 银行汇票存款和银行存款的区别
  • 新成立的企业都有哪些
  • 个税手续费返还会计分录
  • 通用定额发票属于哪一类
  • 小规模纳税人购车可以抵扣多少税
  • 主营业务收入计入什么明细账
  • 购买空调的报销单怎么写
  • 人工材料成本怎么分配
  • 收到工程施工进度款如何记账
  • 注销一个公司需要多久
  • 可以选择用简易计算办法计税的是哪些
  • 小规模纳税人还是一般纳税人
  • 纳税调增调减项目有哪些各站多少比例
  • 产品质量认证的基本条件有哪些
  • 建材销售公司需要交哪些税
  • 款已付没有发票就入账
  • 财政拨款税务处理方法
  • 工商年报纳税总额怎么填写才正确
  • macos 关闭屏幕
  • 确认收入是收到款了吗
  • 什么是汇兑损益,汇兑损益产生的原因有哪些?(10分)
  • 厂区道路施工步骤
  • 如何设置鼠标移过超链接
  • u盘一键启动安装系统
  • vue页面获取url参数
  • 计提本月应缴纳的所得税
  • 最常用的成本核算方法表
  • 固定资产更新改造的账务处理
  • 商业企业会计科目表
  • 如何确定销售数量
  • 商业会计的做账流程
  • php操作步骤
  • php错误级别有哪些
  • 请问怎么清除
  • XGboost算法预测股价模型
  • ps命令显示进程状态
  • 购买车辆的进项税怎么抵扣
  • 独立核算的分公司责任承担问题
  • 所得税时间性差异
  • 弥补以前年度亏损怎么算
  • SQL中DATEADD和DATEDIFF的用法示例介绍
  • 小规模纳税人申报步骤
  • 开模具厂一年能挣多少钱
  • 商业承兑汇票风险高吗
  • 库存和结存
  • 上月财务费用多做了,本月怎么调
  • 公司注销退回投资款如何账务处理
  • 资金占用费如何计算企业所得税
  • 印花税可以去地方申报吗
  • 职工福利费和工会经费
  • 对公提现是什么意思啊
  • 冲红的发票抵扣联要放在凭证里吗
  • 还原精灵使用教程
  • mac怎么创建网络
  • linux滚动更新是什么
  • win10蓝屏故障
  • win7系统电脑怎么开热点
  • java如何自定义函数
  • 举例讲解水生花卉栽培管理
  • 基于专业性的家校双向互动,需要家长的学校教育参与
  • js中的apply方法
  • excel一行首尾互换
  • 国家税务总局会议管理办法
  • 机票票号怎么查航班
  • 济宁税务大厅上班时间
  • 福利费是否计入成本费用
  • 北京四合院为什么出名那么多
  • 湖北注册税务师协会
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设