OpenGL.裁剪算法

来源:互联网 发布:伐木累软件 编辑:程序博客网 时间:2024/06/11 09:57
  • 裁剪就是来确定
    • 哪些是位于视景体内,应当被最后成图来考虑的
    • 哪些是位于视景体外,不需要后续的处理了(因为不属于成图范围嘛)

线段的裁剪算法

  • Cohen-Sutherlend算法
  • 这是一种很巧妙的裁剪算法,运用了编码的思想
  • 先考虑二维的裁剪,即一条二维的线段和一个方形的裁剪区域
  • 方形的裁剪区域为
    二维裁剪区域
  • 对于一条线段,其是由两个顶点来刻画的
  • 对于每个顶点都根据其位置(x,y)进行编码
  • 编码 b1b2b3b4
    • 当 y > Ymax 时,b1为1,否则为0
    • 当 y < Ymin 时,b2为1,否则为0
    • 当 x > Xmax 时,b3为1,否则为0
    • 当 x < Xmin 时,b4为1,否则为0
    • 如下

线段裁剪编码

  • 对于线段的两个端点,分别得到了两个编码
    • 均为0000,则线段必在裁剪区域内,整条线段被接受
    • 仅一个为0000,则线段必然与裁剪区域有交点
      • 如果另一个只有一位为1,则可以直接判断出是与哪条边界有交点,进而直接求交
      • 如果有两位为1,则是与对应的两个边界其中之一有交点,但只需要先对其中一条边界所在的直线求交点,再更新编码即可
    • 如果两者都不为0000
      • 若两者的逻辑与值不为0,意味这必然有一位都为1,也就意味着这两个点必然都在某条边界的同一侧,那么必然是与裁剪区域无任何交点,所以拒绝整条线段
      • 否则根据逻辑与的值所指示的边界,选其中一条求交并更新编码,在重新判断即可
  • 扩展到三维空间中,一个方体的区域和一条线段,对应的编码就有6位,分别根据上下面、左右面、前后面进行编码。同样的思路

  • Sutherland-Hodgeman算法
  • 这种算法就比较容易实现
    • 对于某条边界,比如顶端的边界y=Ymax
      • 判断是否有交点(两端点是否分布在y=Ymax的两侧,也就是两个端点的y值是否是一个大于Ymax一个小于Ymax)

        • 若y值均小于Ymax则返回两个交点
        • 否则直接拒绝这条线段
      • 有则计算交点(相似三角形)
      • 返回交点和y值小于Ymax(因为是顶端边界)的两个点作为顶端边界裁剪后的输出结果
    • 对于其余的边界也有类似的想法
    • 于是裁剪一个线段就变成了流水化的作业
      流水裁剪线段

多边形裁剪

  • Sutherland-Hodgeman算法
  • 同样是一个流水化的过程
    多边形流水裁剪

  • 对于每一步要如何进行呢?

  • 比如
    图

  • 输入v1-v2-v3-v4

  • 经过红色的裁剪线
    • p1-v2
    • p1-v2-v3
    • p1-v2-v3-p2
  • 输出p1-v2-v3-p2
  • 简单讲是这样讲,但实际上会面临各种各样的复杂的问题,不过基本的思想是这样罢了
0 0