转自:http://blog.csdn.net/oktears/article/details/42915623

除了视景体的6个裁剪平面(左、右、底、顶、近和远)之外,还可以另外再指定最多可达6个的其他裁剪平面,对视景体施加进一步的限制。

每个平面都是由它的方程式Ax + By + Cz + D= 0的系数所指定的。裁剪平面会根据模型和视图矩阵自动执行适当的变换。最终的裁剪区域将是视景体与其他裁剪平面定义的所有半空间的交集。记住,OpenGL会自动对部分被裁剪的多边形的边进行正确的重构。

[cpp] view plain copy
  1. void glClipPlane(GLenum plane, const GLdouble *equation);

定义一个裁剪平面。equation参数指向平面方程Ax + By + Cz + D = 0的4个系数。满足(A B C D)M-1 (xe ye ze we) T≥0的所有视觉坐标(xe ye ze we)点都位于这个平面定义的半空间中,其中M是在调用glClipPlane()时的当前模型视图矩阵。所有不是位于这个半空间内的点都将裁剪掉。plane参数是GL_CLIP_PLANEi,其中i是一个整数,表示需要定义哪个有效裁剪平面。i的值位于0和最大其他裁剪平面数减1之间。
我们需要启用每个被定义的裁剪平面:

[cpp] view plain copy
  1. glEnable(GL_CLIP_PLANEi);

也可以用下面这个函数禁用一个裁剪平面:

[cpp] view plain copy
  1. glDisable(GL_CLIP_PLANEi);

所有的OpenGL实现都必须支持至少6个其他裁剪平面,有些实现可能允许超过6个的其他裁剪平面。可以用GL_MAX_CLIP_PLANES为参数调用glGetIntegerv()函数,查询自己使用的OpenGL实现所支持的其他裁剪平面的最大数量。

调用glClipPlane()函数所执行的裁剪是在视觉坐标中完成的,而不是在裁剪坐标中进行的。如果投影矩阵为奇异矩阵(也就是把三维坐标压平到二维坐标的真正投影矩阵),这个区别就非常大。在视觉坐标中进行裁剪时,即使投影矩阵是奇异矩阵,裁剪仍然是在三维空间中进行的。

下面的例子通过两个裁剪平面对球体进行了裁剪。

[cpp] view plain copy
  1. //
  2. //  main.cpp
  3. //  OpenGL_10_ClipPlane
  4. //
  5. //  Created by apple on 15/1/19.
  6. //  Copyright (c) 2015年 cc. All rights reserved.
  7. //
  8. #include <iostream>
  9. #include <GLUT/GLUT.h>
  10. /**
  11. *  初始化操作
  12. */
  13. void init() {
  14. //设置清屏色
  15. glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  16. //设置着色模式,填充色与顶点一致
  17. glShadeModel(GL_FLAT);
  18. }
  19. /**
  20. *  展示绘制效果
  21. */
  22. void display() {
  23. //清理颜色缓冲区
  24. glClear(GL_COLOR_BUFFER_BIT);
  25. //设置绘制颜色
  26. glColor3f(1.0, 1.0, 1.0);
  27. //复制当前矩阵并保存到栈顶
  28. glPushMatrix();
  29. //沿z轴负方向移动5个单位长度
  30. glTranslatef(0.0f, 0.0f, -5.0f);
  31. //定义裁剪平面数组, Ax + By + Cz + D = 0
  32. GLdouble equn[4] = {0.0f, 1.0f, 0.0f, 0.0f};
  33. GLdouble equn2[4] = {1.0f, 0.0f, 0.0f, 0.0f};
  34. //设置裁剪平面,y>0
  35. glClipPlane(GL_CLIP_PLANE0, equn);
  36. glEnable(GL_CLIP_PLANE0);
  37. //设置裁剪平面,x>0
  38. glClipPlane(GL_CLIP_PLANE1, equn2);
  39. glEnable(GL_CLIP_PLANE1);
  40. //沿x轴旋转90度
  41. glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
  42. //渲染一个球体,球体半径,以Z轴上线段为直径分布的圆周线的条数(经线),围绕在Z轴周围的线的条数(维线)
  43. glutWireSphere(2.0f, 20.0f, 16.0f);
  44. //弹出栈顶矩阵
  45. glPopMatrix();
  46. //强制完成绘制指令
  47. glFlush ();
  48. }
  49. /**
  50. *  调整窗口尺寸
  51. *
  52. *  @param width  宽度
  53. *  @param height 高度
  54. */
  55. void reshape(int width, int height) {
  56. //设置视口矩形区域,在默认情况下,视口被设置为占据打开窗口的整个像素矩形
  57. glViewport(0, 0, (GLsizei)width, (GLsizei)height);
  58. //之后的矩阵操作定义为投影矩阵操作
  59. glMatrixMode(GL_PROJECTION);
  60. //等于是将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵!等于是之前的矩阵变换带来的影响到此为止了!
  61. glLoadIdentity();
  62. //创建一个表示对称透视视图平截头体的矩阵
  63. //设置眼睛睁开的角度,视景体的宽高比,近截面的距离,远截面的距离
  64. gluPerspective(60.0f, (GLfloat)width / (GLfloat)height, 1.0f, 20.0f);
  65. //之后的矩阵操作定义为模型视图矩阵操作
  66. glMatrixMode(GL_MODELVIEW);
  67. }
  68. int main(int argc, const char * argv[]) {
  69. //初始化GLUT库
  70. glutInit(&argc, (char**)argv);
  71. //设置单缓冲,RGB像素格式的窗口
  72. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  73. //设置窗口大小
  74. glutInitWindowSize(500, 500);
  75. //设置窗口坐标
  76. glutInitWindowPosition (100, 100);
  77. //创建窗口
  78. glutCreateWindow("ClipPlane");
  79. //初始化操作
  80. init();
  81. //设置展示的回调方法
  82. glutDisplayFunc(display);
  83. glutReshapeFunc(reshape);
  84. //绘制线程开始循环
  85. glutMainLoop();
  86. return 0;
  87. }

本文由CC原创总结,如需转载请注明出处:http://blog.csdn.net/oktears/article/details/42915623

裁剪平面ClipPlane相关推荐

  1. osg::ClipPlane 裁剪平面 空间平面方程

    已知空间平面上三点 (x1,y1,z1),  (x2,y2,z2),  (x3,y3,z3) //空间三维平面方程ax+by+cz+d=0; 计算 a,  b,  c,  d四个参数值 a = y1* ...

  2. OpenGL编程指南9:裁剪平面+glPushMatrix和glPopMatrix矩阵栈顶操作

    1.任意裁剪平面 Opengl中,除了视景体的立方体裁剪平面之外,另外还可以额外指定多达6个裁剪平面,对视景体做进一步限制.每一个平面都由平面公式定义:Ax+By+Cz+D = 0.裁剪平面的指定通过 ...

  3. Vulkan_平面反射

    平面反射 屏幕空间反射是利用屏幕空间数据进行计算反射的一种技术.它通常用于创建更精细的反射,如在潮湿的地板表面或水坑. 一.实现思路 主要分两次进行基本的离屏渲染.第一遍将镜像的场景渲染到具有颜色和深 ...

  4. VTK修炼之道66:体绘制裁剪_Cripping技术

    1.基于Clipping的体绘制裁剪技术 Clipping技术支持VTKImageData和VTKUntructuredGrid数据类型.该功能由vtkAbstractMapper3D类提供,对于那些 ...

  5. 计算面平均边_计算机图形学补充2:齐次空间裁剪(Homogeneous Space Clipping)

    齐次空间裁剪 齐次空间裁剪是指发生在vertex shader之后,透视除法( 顶点坐标/w )之前的一段操作.其目标非常直接,因为我们并没有必要去渲染视锥体之外的物体,如下图: 只有位于视锥体之内的 ...

  6. glClipPlane剪裁平面

    glClipPlane裁剪平面 (2012-02-21 12:49:18) 转载▼ 标签: 半平面 裁剪 线框 球体 表示 杂谈 分类: OPENGL void glClipPlane(GLenum  ...

  7. VTK笔记-裁剪分割-几何裁剪-vtkClipPolyData

    什么是裁剪分割   VTK加载二维数据和三维数据,我们通常观察到的是三视图图像,或者是vtkImageReslice获取到的转换矩阵对应的观察点三视图或者是斜平面图像,想要看到图像中间部分的渲染结果就 ...

  8. Unity下平面反射实现

    平面反射通常指的是在镜子或者光滑地面的反射效果上,如下图所示, 上图是一个光滑的平面,平面上的物体在平面上有对称的投影. 一.平面反射的原理 对于光照射到物体表面然后发生完美镜面反射的示意图,如下所示 ...

  9. UE4-(反射)平面反射

    一.创建 注意:平面反射拖拽到场景后,会创建一大块平面,这个平面是临时创建的,当程序运行后,我们不会看到这个平面. 平面反射会捕获反射信息,只能用于平面反射效果,所以只适用于平整的对象,例如镜子,水池 ...

最新文章

  1. hibernate 一对多、多对多的配置
  2. php7 编译参数详解,php7.4.5编译安装参数变更
  3. 14 篇论文为你呈现「迁移学习」研究全貌 | 论文集精选 #04
  4. 简单使用JDOM解析XML
  5. 前端学习(1335):mongoDB导入数据
  6. 现代软件工程 2012 北航 项目复审模板
  7. org.apache.commons.lang.StringUtils中常用的方法
  8. JS小技巧 ----- 将类数组 / 字符串转为数组的几种方式
  9. 【好书推荐】学习软件工程的必经之路 | 《人月神话》
  10. java excel转dbf
  11. [Android-ARCore开发]ARCore从入门到放弃1-Demo上手
  12. linux .deb文件安装
  13. anconda json.decoder.JSONDecodeError: Expecting property name enclosed in double quo
  14. 浮窗---创建Activity浮窗(可拖动)
  15. 手机二维码~~~ZXing简介
  16. 省公司交流期间一线工作总结
  17. 介绍一些新手入门FPGA的优秀网站(新增4)
  18. c语言笛卡尔坐标系两点坐标,计算笛卡尔坐标系或极坐标系中2个位置之间的夹角...
  19. keepalived工作原理和配置说明
  20. 左耳听风 第三十五周

热门文章

  1. python 模拟浏览器selenium_Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例...
  2. fastjson反序列化过滤字段属性_Fastjsonlt;=1.2.47反序列化漏洞源码分析及复现
  3. 把网站图片和php程序分离,我的图片服务器和WEB应用服务器相分离的简单方案
  4. java合并不连续的时间段_基于时间戳不完全匹配的pandas合并
  5. linux snap文件夹,SNAP 文件扩展名: 它是什么以及如何打开它?
  6. 二叉树层序遍历递归与非递归_二叉树的遍历「递归、非递归」以及自己的感受
  7. c语言810除以1000,【答题】C语言程序设计问题与解释实验
  8. 计算机模拟试题3,计算机一级考试MSoffice全真模拟试题3
  9. 某些微型计算机使用Pentium,2010四川省计算机等级考试二级理论考试试题及答案...
  10. c语言k歌4.0编程,一次在线K歌玩法的尝试