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

3、使用裁剪空间的方法提取平面

上一篇中,我们讨论了通过几何的方法提取视锥体的六个片面。在这一篇中,我们继续讨论通过裁剪空间的方法来提取视锥体的平面。



假设现在在世界坐标系中有一点p=(x,yz,1),modelview矩阵记作M,projection矩阵记作P。当点p经过这两个矩阵变换后变到pc=(xc,yc,zc,wc)的位置,即

因为pc点是由齐次坐标表示的,则其正则化后为pcn:

在正则化的裁剪空间中,视锥体的中心与单位立方体的原点对齐,且它的六个平面由以下平面界定:

  • Left Plane: x’ = -1
  • Right Plane: x’ = 1
  • Top Plane: y’ = 1
  • Bottom Plane: y’ = -1
  • Near Plane: z’ = -1
  • Far Plane: z’ = 1

那么,当pcn=(x‘,y‘,z‘)的坐标满足以下关系时,就证明pcn在视锥体内部:

往前推一步,没有正则化的pc=(xc,yc,zc),如果想在视锥体内的话,那它的坐标范围为:

基于这样的信息,那么我们就可以用世界坐标来届定六个平面,例如,当pc点在左平面的“右”侧时,就必须满足:

继续向前推一步,考虑点p的坐标,记A=MP,如下图所示

点pc中xc和wc坐标就可以通过以下式子计算:

则p点在视锥体左平面的右侧就可以用以下不等式表示:

经过如下简单代数变换:

就可以得到左平面的一般方程:(Ax+By+Cz+D=0)

其中,col1和col4分别代表A矩阵的第一列和第四列。

如果我们只需要考虑一个点在平面左还是右,那上面的定义已经足够了,但是在后面我们还要检测球体在平面的左侧还是右侧,这需要计算球心到平面的距离。就还需要对平面进行一般化,即求出其一般方程。

右平面也可以通过同样地方式获得:

右平面方程的系数:

剩余的平面:

下平面

上平面

近平面

远平面

时间: 2024-08-08 00:23:19

【翻译】View Frustum Culling --3 Clip Space Approach – Extracting the Planes的相关文章

View Frustum Culling

作者:i_dovelemon 来源:CSDN 日期:2014 / 10 / 28 主题:View Frustum, Culling 引言 在前面的一篇文章获取View Frustum的6个面中讲述了如何根据View-Proj矩阵来获取View Frustum在世界坐标系中的6个平面.研究过场景管理的同学就会知道,在将图元数据传入到流水线之前,我们需要对数据进行组织.而场景管理通常就是进行这样的工作,通过场景管理,我们剔除(Culling)那些不在View Frustum中的物体,也就是在显示器中

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

这是一些列来自lighthouse3d的视锥体裁剪教程.旨在学习总结,及便于查阅. 1.视锥体的形状 在OpenGL中,透视投影是由两个函数定义的gluPerspective和gluLookAt.我们先来回顾下这两个函数的参数 gluPerspective(fov, ratio, nearDist, farDist); gluLookAt(px,py,pz, lx,ly,lz, ux,uy,uz); 照相机的位置在四棱锥的顶点处(px,py,pz) 记为向量p, 观察点的位置在(lx,ly,lz

homogeneous clip space and NDC

CVV  canonical view volume HCS homogeneous clip space NDC nomolized device coordinates pipeline 的 geometry stage 的 projection前后有这样一些概念 次序 以及什么时候做了什么 哪里做的 还有那时候的维度 model --world--view space---hcs- ndc -screen coordinates 从hcs开始说 这里的h就是齐次 齐次就是三维加一维 用四维

Libgdx New 3D API 教程之 -- Libgdx中的3D frustum culling

This blog is a chinese version of xoppa's Libgdx new 3D api tutorial. For English version, please refer to >>LINK<< 我要偷懒了,好久没看LibGDX,也很久没看3D,新教程的题目我就不懂了.不过看了课程的内容,相信你们都会理解. 正文: 当渲染一个3d场景时,其中真正可见的对象通常都比总对象数少很多.因此渲染全部的物体,包括那些根本看不到的,即浪费了富贵的GPU时间,

得到View Frustum的6飞机

笔者:i_dovelemon 资源:CSDN 日期:2014 / 9 / 30 主题:View Frustum, Plane, View Matrix, Perspective Projection Matrix 引言 在3D图形学中,一种优化的手法,叫做物体剔除(Object Culling). 这种技术的提出是基于这种策略:我们不希望将不存在View Frustum里面的物体送往流水线中进行处理. 尽管,你可能会说,如今的图形卡都已近支持了三角形剔除的技术.可是,不要忘了流水线的步骤. 我们

获取View Frustum的6个平面

作者:i_dovelemon 来源:CSDN 日期:2014 / 9 / 30 主题:View Frustum, Plane, View Matrix, Perspective Projection Matrix 引言 在3D图形学中,一种优化的手法,叫做物体剔除(Object Culling).这种技术的提出是基于这样的策略:我们不希望将不存在View Frustum里面的物体送往流水线中进行处理.虽然,你可能会说,现在的图形卡都已近支持了三角形剔除的技术.但是,不要忘了流水线的步骤.我们是先

Screen position out of view frustum

Screen position out of view frustum (screen pos 512.000000, 0.000000, 100.000000) (Camera rect 0 0 512 512) UnityEngine.Camera:Render() MirrorReflection2:OnWillRenderObject() (at Assets/UnityChanStage/Visualizer/MirrorReflection2.cs:118) 在用unity3d调优时

GPU 图形绘制管线

参考自 <GPU 编程与CG 语言之阳春白雪下里巴人> 图形绘制管线描述 GPU 渲染流程,即"给定视点.三维物体.光源.照明模式和纹理等元素,如何绘制一幅二维图像". 在<实时计算机图形学>一书中,将图形绘制管线分为三个主要阶段:应用 程序阶段.几何阶段.光栅阶段. 应用程序阶段,使用高级编程语言(C.C++.JAVA 等)进行开发,主要和 CPU.内存打交道,诸如碰撞检测.场景图建立.空间八叉树更新.视锥裁剪等 经典算法都在此阶段执行.在该阶段的末端,几何体

Bounding Volume Hierarchy BVH in OpenCASCADE

Bounding Volume Hierarchy BVH in OpenCASCADE [email protected] Abstract. Bounding Volume Hierarchy(BVH) organizes geometric objects in the tree based on spatial relationships. Each node in the tree contains an axis-aligned bounding box of all the obj