• 【翻译】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向量都在右平面上,那么它们的叉乘(右手法则)结果即为右平面的法线

  • 相关阅读:
    Delphi WebService连接数据库
    编写一个单独的Web Service for Delphi7(步骤)
    Delphi stdCall意义
    Delphi WEB APP DEBUGGER是如何使用的
    用delphi的THTTPRIO控件调用了c#写的webservice。
    Delphi 编写的Web Service
    Delphi WebService 中 Web App Debugger 的建议
    flex布局浅谈和实例
    IOS开关效果
    文字渐变和边框渐变
  • 原文地址:https://www.cnblogs.com/wildbloom/p/7230168.html
Copyright © 2020-2023  润新知