【翻译】View Frustum Culling --2 Geometric Approach – Extracting the Planes
在上一篇中,我们知道了视锥体的形状,并且也确定了我们进行裁剪时的步骤。那我们接下来要走的就是确定视锥体的六个平面:
near, far, top, bottom, left and right
2、计算平面
这些平面通过一个点和一个法向量定义,并且规定视锥体的内表面为法线正向。
那么测试物体是否在视锥体之内就可以化为 检测物体在平面哪一侧 的工作,检测物体在平面的哪一侧可以通过计算物体上某点到该平面的距离。如果计算出的距离是正号,就意味着该点在平面法线方向一侧。
那么如果该点在六个面的法线方向一侧,结合上面定义法线方向是指向视锥体内部的,就可以得出,该点在视锥体的内部。
接下来,我们就一起看下这6个平面怎么确定。
第一步,要先确定8个顶点的坐标,如下图

顶点坐标的标识方法很有意思,n--近平面 t--上方 l--左边 依次类推
接下来回顾上一节中已经明确的变量得含义:
- p -- 照相机的位置
- d -- 是表示照相机射线的向量,在此假设它已经归一化了
- nearDist -- 近平面的距离
- Hnear -- 近平面上矩形的高
- Wnear -- 近平面上矩形的宽
- farDist -- 远平面的距离
- Hfar -- 远平面上矩形的高
- Wfar -- 远平面上矩形的宽
现在我们还需要一个表示空间中指示“上”的向量up(ux,uy,uz),它刚好来自gluLookAt函数的最后三个参数。
还需要一个表示“右”的向量,它可以右up和d的叉乘得到。
用一张示意图来表示点ftl的计算方法

计算公式为
fc = p + d * farDist
ftl = fc + (up * Hfar/2) - (right * Wfar/2)
其余点
ftr = fc + (up * Hfar/2) + (right * Wfar/2)
fbl = fc - (up * Hfar/2) - (right * Wfar/2)
fbr = fc - (up * Hfar/2) + (right * Wfar/2) nc = p + d * nearDist ntl = nc + (up * Hnear/2) - (right * Wnear/2)
ntr = nc + (up * Hnear/2) + (right * Wnear/2)
nbl = nc - (up * Hnear/2) - (right * Wnear/2)
nbr = nc - (up * Hnear/2) + (right * Wnear/2)
有了八个点的坐标,然后就可以很容易的算出六个平面的方程。但是不要急,我们想下还有没有更简单的方法计算平面的方程。
知道平面上一个点和这个平面的法向量一样可以确定这个平面,而我们在计算点时也多次用到了由照相机确定的向量up right 和 d
那么近平面就可以右向量d和点nc确定,
远平面右-d和点fc确定,-d是为了保证远平面的正向朝着视锥体内部
再考虑其他四个面,它们都有一个共同点,那就是照相机这个点,换句话说 上下左右四个平面在计算时都可使用p(照相机)这个点的坐标
那就只用计算它们的法向量就可以了,
nc = p + d * nearDist
fc = p + d * farDist
a = (nc + right * Wnear / 2) - p
a.normalize();
normalRight = up * a
如下示意图

up 和 a向量都在右平面上,那么它们的叉乘(右手法则)结果即为右平面的法线
【翻译】View Frustum Culling --2 Geometric Approach – Extracting the Planes的更多相关文章
- 【翻译】View Frustum Culling --3 Clip Space Approach – Extracting the Planes
3.使用裁剪空间的方法提取平面 上一篇中,我们讨论了通过几何的方法提取视锥体的六个片面.在这一篇中,我们继续讨论通过裁剪空间的方法来提取视锥体的平面. 假设现在在世界坐标系中有一点p=(x,yz,1) ...
- 【翻译】 View Frustum Culling --1 View Frustum’s Shape
这是一些列来自lighthouse3d的视锥体裁剪教程.旨在学习总结,及便于查阅. 1.视锥体的形状 在OpenGL中,透视投影是由两个函数定义的gluPerspective和gluLookAt.我们 ...
- 简单的Viewing Frustum Culling
Viewing Frustum Culling是图形绘制流水线中,将不可见物体(即不在视锥体内的物体)提前剔除的操作. 在实践中,精确判断物体的可见性开销较大,因而通常用物体包围球或包围盒与视锥体(平 ...
- 得到View Frustum的6飞机
笔者:i_dovelemon 资源:CSDN 日期:2014 / 9 / 30 主题:View Frustum, Plane, View Matrix, Perspective Projection ...
- Bounding Volume Hierarchy BVH in OpenCASCADE
Bounding Volume Hierarchy BVH in OpenCASCADE eryar@163.com Abstract. Bounding Volume Hierarchy(BVH) ...
- [比较老的文章]三维渲染引擎 OGRE 与 OSG 的比较综述
1 .引言随着计算机可视化.虚拟现实技术的飞速发展,人们对实时真实感渲染以及场景复杂度提出了更高的要求.传统的直接使用底层图形接口如OpenGL.DirectX开发图形应用的模式越来越暴露出开发复杂性 ...
- (转)GPU图形绘制管线
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”第二章. 图形绘制管线描述GPU渲染流程, ...
- 转:关于 OGRE 与 OSG 的简单比较
1 前言 我曾经细致阅读过 OGRE 和 OSG 官方提供的文档,有<Pro OGRE 3D Programming>.OGRE自带手册(manual).王锐老师等翻译的<Ope ...
- 关于OGRE与OSG的简单比较【转】
关于OGRE与OSG的简单比较 林乃养 lnychina{at}gmail.com 浙江大学CAD&CG实验室 2010年3月27日 1 前言 我曾经细致阅读过OGRE和OSG官方提供的文档, ...
随机推荐
- 33.scrapy采集网站表单数据
这几天一直都再用scrapy写网站数据采集的爬虫,这里我就选一个写过的爬虫来记录一下. 杭州造价网:http://183.129.219.195:8081/bs/hzzjb/web/list 这里出现 ...
- <转载> nginx服务器安装及配置文件详解 https://segmentfault.com/a/1190000002797601
nginx在工作中已经有好几个环境在使用了,每次都是重新去网上扒博客,各种编译配置,今天自己也整理一份安装文档和nginx.conf配置选项的说明,留作以后参考.像负载均衡配置(包括健康检查).缓存( ...
- a标签自执行点击事件
//html <a href='http://www.baidu.com' ><button id='sss'>百度</button></a> //原生 ...
- leetcode1019
class Solution(object): def nextLargerNodes(self, head: ListNode) -> 'List[int]': n = 0 temp = he ...
- oracle常用函数详解(详细)
转自:https://www.cnblogs.com/lxl57610/p/7442130.html Oracle SQL 提供了用于执行特定操作的专用函数.这些函数大大增强了 SQL 语言的功能.函 ...
- office转pdf转swf
系统环境:CentOs5.5用到的工具:Openoffice 3 , Pdf2Swf tool , Jodconverter , FlexPaper 网上找了些资料,早有人已经实现了这样的功能,只不过 ...
- UI5-学习篇-7-Postman测试SAP OData Services
1.Postman简介 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具. postman ...
- intellij idea远程debug调试resin4教程
昨天有个项目部署在阿里云 想远程调试不知道怎么弄.看日志需要账户密码很不方便呀.今天加班特意baidu了下. 1.先在远程的resin修改conf中resin.xml配置文件 在server-defa ...
- Raft 为什么是更易理解的分布式一致性算法(转)
一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前. 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文<拜占庭将军问题>(参考[1]). 拜 ...
- ReactiveX 学习笔记(13)基础类型
Key Types and Life Management 本文主题是 Rx 中的基础类型 Subject 类及其生命周期的管理. 公共代码 RxNET private static void Wri ...