在上一篇中,我们知道了视锥体的形状,并且也确定了我们进行裁剪时的步骤。那我们接下来要走的就是确定视锥体的六个平面:

                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的更多相关文章

  1. 【翻译】View Frustum Culling --3 Clip Space Approach – Extracting the Planes

    3.使用裁剪空间的方法提取平面 上一篇中,我们讨论了通过几何的方法提取视锥体的六个片面.在这一篇中,我们继续讨论通过裁剪空间的方法来提取视锥体的平面. 假设现在在世界坐标系中有一点p=(x,yz,1) ...

  2. 【翻译】 View Frustum Culling --1 View Frustum’s Shape

    这是一些列来自lighthouse3d的视锥体裁剪教程.旨在学习总结,及便于查阅. 1.视锥体的形状 在OpenGL中,透视投影是由两个函数定义的gluPerspective和gluLookAt.我们 ...

  3. 简单的Viewing Frustum Culling

    Viewing Frustum Culling是图形绘制流水线中,将不可见物体(即不在视锥体内的物体)提前剔除的操作. 在实践中,精确判断物体的可见性开销较大,因而通常用物体包围球或包围盒与视锥体(平 ...

  4. 得到View Frustum的6飞机

    笔者:i_dovelemon 资源:CSDN 日期:2014 / 9 / 30 主题:View Frustum, Plane, View Matrix, Perspective Projection ...

  5. Bounding Volume Hierarchy BVH in OpenCASCADE

    Bounding Volume Hierarchy BVH in OpenCASCADE eryar@163.com Abstract. Bounding Volume Hierarchy(BVH) ...

  6. [比较老的文章]三维渲染引擎 OGRE 与 OSG 的比较综述

    1 .引言随着计算机可视化.虚拟现实技术的飞速发展,人们对实时真实感渲染以及场景复杂度提出了更高的要求.传统的直接使用底层图形接口如OpenGL.DirectX开发图形应用的模式越来越暴露出开发复杂性 ...

  7. (转)GPU图形绘制管线

    摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”第二章. 图形绘制管线描述GPU渲染流程, ...

  8. 转:关于 OGRE 与 OSG 的简单比较

    1   前言 我曾经细致阅读过 OGRE 和 OSG 官方提供的文档,有<Pro OGRE 3D Programming>.OGRE自带手册(manual).王锐老师等翻译的<Ope ...

  9. 关于OGRE与OSG的简单比较【转】

    关于OGRE与OSG的简单比较 林乃养 lnychina{at}gmail.com 浙江大学CAD&CG实验室 2010年3月27日 1 前言 我曾经细致阅读过OGRE和OSG官方提供的文档, ...

随机推荐

  1. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  2. linux socket使用情况 ss -s ss -t -a | cat /proc/net/socketstat

    Linux系统中,查看SOCKET使用情况可以使用ss命令. 1.命令格式:ss [参数]ss [参数] [过滤]2.命令功能:ss(Socket Statistics的缩写)命令可以用来获取 soc ...

  3. Centos7 搭建Gitlab服务器并配置项目全过程

    https://blog.csdn.net/Abysscarry/article/details/79402695 gitlab与jenkins整合搭建      https://blog.csdn. ...

  4. MVC基于角色权限控制--数据库设计

    在网站后台设计过程中都会遇上权限控制这一问题 当前较为流行的解决方案是基于角色的权限管理 基本思路如下 分别建立 用户信息表.角色信息表.权限信息表 让用户和角色关联,角色和权限关联,当用户访问时,通 ...

  5. react-native-vector-icons 图标库使用

    安装链接 yarn add react-native-vector-icons react-native link react-native-vector-icons 在项目工程中打开 .xcodep ...

  6. 机器学习进阶-直方图与傅里叶变化-直方图均衡化 1.cv2.equalizeHist(进行直方图均衡化) 2. cv2.createCLAHA(用于生成自适应均衡化图像)

    1. cv2.equalizeHist(img)  # 表示进行直方图均衡化 参数说明:img表示输入的图片 2.cv2.createCLAHA(clipLimit=8.0, titleGridSiz ...

  7. ASP.NET HTTP 协议

    http是无状态的,不会记得“上个请求***”,所以哪怕是同一个页面中的js.css.jpg也都要重复的提交Accept-Language.Accept-Encoding.Cookie等. 一般情况下 ...

  8. 使用karma做多浏览器的UI测试

    avalon1.6开发得差不多,这次使用先进的开发理念进行开发,比如模块化,单元测试什么... ui测试是重要的一环,之前用阿里的totoro,但打开浏览器不方便.于是从webdrieverio, n ...

  9. jgGrid

    jqGrid的表格加载 function GetGrid() { var selectedRowIndex = 0; var $gridTable = $("#gridTable" ...

  10. 15.过滤器-基础.md

    目录 基础 实例 图解 核心API interface Filter过滤器接口 interface FilterConfig获取过滤器初始化信息 interface FilterChain 过滤器参数 ...