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(因为是顶端边界)的两个点作为顶端边界裁剪后的输出结果
- 对于其余的边界也有类似的想法
- 于是裁剪一个线段就变成了流水化的作业
- 对于某条边界,比如顶端的边界y=Ymax
多边形裁剪
- Sutherland-Hodgeman算法
同样是一个流水化的过程
对于每一步要如何进行呢?
比如
输入v1-v2-v3-v4
- 经过红色的裁剪线
- p1-v2
- p1-v2-v3
- p1-v2-v3-p2
- 输出p1-v2-v3-p2
- 简单讲是这样讲,但实际上会面临各种各样的复杂的问题,不过基本的思想是这样罢了
0 0
- OpenGL.裁剪算法
- opengl 直线裁剪Cohen-Sutherland算法
- OpengL裁剪
- OpengL裁剪
- OpenGL裁剪
- opengl实现cs、liang-barsky直线裁剪算法
- 计算机图形学-基于OpenGL的直线段的裁剪算法
- OPENGL—参数裁剪(Liang-Barsky算法)
- OpenGL使用裁剪平面
- OpenGL: 深度裁剪glClearDepth
- OpenGL之裁剪平面
- [OpenGL]计算机图形学:直线裁剪算法中Cohen-Sutherland算法和Liang-Barsky算法
- 【OpenGL】窗口,视口,裁剪区
- Cohen-Sutherland裁剪算法
- 直线的裁剪算法
- 多边形裁剪算法
- 梁友栋-Barsky裁剪算法
- 直线裁剪算法
- ontouchevent,oninterceptTouchEvent
- 用数组代替递归极大提高算法时间
- Dagger2, Retrofit和MVP设计模式案例分析
- 在js里获得type="file"的文件大小从而进行限制
- 利用Fragment + FragmentTabHost实现书签导航
- OpenGL.裁剪算法
- 文件存储实现通讯录
- BSOJ 4685 DOG进游戏 回顾——KMP
- C++基类的析构函数为什么是虚函数
- Coursera机器学习 week6 编程作业代码
- android基础之依赖注入
- 【SSH】hibernate之hql学习
- 硬件产品研发必须注意事项(必要了解的前提)
- TCP/UDP的客户端/服务器编程