在3D空间中绘制四边形

四边形 GL_QUADS

OpenGL的GL_QUADS图元用于绘制四边形,它根据每四个顶点绘制一个四边形。

注意,在使用四边形时,必需记住一个重要规则:一个四边形的四个角必须位于同一个平面中(不存在弯曲的四边形)。如图所示

四边形带 GL_QUAD_STRIP

该图元指定一个连接的四边形带。它们都保持相同方向的环绕。如图所示

通用多边形 GL_POLYGON

我们可以用它绘制任意数量的多边形。与四边形一样,多边形的所有顶点也必须位于同一平面中。如果想越过这个规则,可以采用一种变通的方法,使用GL_TRIANGLE_FAN代替GL_POLYGON。如图所示

多边形的创建规则:

1、 第一个规则是所有的多边形都必须是平面的。也就是说,多边形的所有顶点必须位于同一个平面中。在空间中,多边形不能扭曲或弯曲。

2、 第二个规则是多边形的边必须不相交,多边形必须是凸的。

注意,OpenGL施加这些限制的原因,是为了使用一些非常快速的算法对多边形进行渲染。

细分和边界

尽管OpenGL只能绘制凸多边形,但我们仍然能够创建非凸的多边形,那就是把两个或多个多边形排列在一起。我们使用OpenGL命令glPolygonMode可以把绘图模式切换到线框模式,这样就能看到组成较大表面区域的每一个较小的三角形。另外,我们还可以通过glEdgeFlag命令来通知OpenGL哪些线段属于边界线(围绕形状边缘的直线),哪些线段不属于边界线(形状内部的直线),这些形状内部的直线将不可见。下面的程序展示了glEdgeFlag函数的用法,当这个函数设置为true时,接下来所有的顶点都将作为多边形边界线的起点,反之则作为形状内部的直线。

/* 程序清单 3-11

* 2014/5/6

*/

#include <glut.h>

#include <math.h>

// 设置渲染状态

void SetupRC()

{

// 设置清除窗口的颜色(黑色背景)

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

// 设置绘图颜色为绿色

glColor3f(0.0f, 1.0f, 0.0f);

}

// 绘制场景(显示回调函数)

void RenderScene()

{

// OpenGL命令,清除颜色缓冲区(使用当前设置的颜色)

glClear(GL_COLOR_BUFFER_BIT);

// OpenGL命令,使用线框模式

glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

// 开始绘制三角形

glBegin(GL_TRIANGLES);

glEdgeFlag(false);

glVertex2f(-20.0f, 0.0f);

glEdgeFlag(true);

glVertex2f(20.0f, 0.0f);

glVertex2f(0.0f, 40.0f);

glVertex2f(-20.0f, 0.0f);

glVertex2f(-60.0f, -20.0f);

glEdgeFlag(false);

glVertex2f(-20.0f, -40.0f);

glEdgeFlag(true);

glVertex2f(-20.0f, -40.0f);

glVertex2f(0.0f, -80.0f);

glEdgeFlag(false);

glVertex2f(20.0f, -40.0f);

glEdgeFlag(true);

glVertex2f(20.0f, -40.0f);

glVertex2f(60.0f, -20.0f);

glEdgeFlag(false);

glVertex2f(20.0f, 0.0f);

glEdgeFlag(true);

glEdgeFlag(false);

glVertex2f(-20.0f, 0.0f);

glVertex2f(-20.0f, -40.0f);

glVertex2f(20.0f, 0.0f);

glVertex2f(-20.0f, -40.0f);

glVertex2f(20.0f, -40.0f);

glVertex2f(20.0f, 0.0f);

glEdgeFlag(true);

// 结束绘制三角形

glEnd();

// 刷新绘图命令,此时所有未执行的OpenGL命令被执行

glutSwapBuffers();

}

// 当窗口大小改变时由GLUT函数库调用

void ChangeSize(GLsizei w, GLsizei h)

{

// 范围

GLfloat nRange = 100.0f;

// 纵横比

GLfloat aspectRatio;

// 防止被0所除

if (0== h){

h = 1;

}

// 根据窗口大小设置视口

glViewport(0, 0, w, h);

// 选择投影矩阵,并重置坐标系统

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

// 计算窗口的纵横比(像素比)

aspectRatio = (GLfloat) w / (GLfloat)h;

// 定义裁剪区域(根据窗口的纵横比,并使用正投影)

if (w<=h) {//宽 <高

glOrtho(-nRange, nRange,-nRange /aspectRatio, nRange / aspectRatio, -nRange, nRange);

} else{//宽 >高

glOrtho(-nRange * aspectRatio,nRange *aspectRatio, -nRange, nRange,-nRange, nRange);

}

// 选择模型视图矩阵,并重置坐标系统

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

int main(int argc,char *argv[])

{

// 传递命令行参数,并对GLUT函数库进行初始化

glutInit(&argc, argv);

// 设置创建窗口时的显示模式(双缓冲区、RGB颜色模式)

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

// 设置窗口的初始大小

glutInitWindowSize(480, 320);

// 创建窗口

glutCreateWindow("Bounce");

// 设置显示回调函数

glutDisplayFunc(RenderScene);

// 设置当窗口的大小发生变化时的回调函数

glutReshapeFunc(ChangeSize);

// 设置渲染状态

SetupRC();

// 启动GLUT框架的运行,一经调用便不再返回,直到程序终止

glutMainLoop();

return0;

}

程序的运行结果如图所示,分别显示了调用glEdgeFlag函数的效果,隐藏形状内部的直线,以及未做内部直线隐藏的效果:

隐藏形状内部的直线

显示全部的直线

在3D空间中绘制四边形相关推荐

  1. python 3d绘图平面_python 用 matplotlib 在 3D 空间中绘制平面 实例详解

    #创建画布 fig = plt.figure(figsize=(12, 8), facecolor='lightyellow')#创建 3D 坐标系 ax = fig.gca(fc='whitesmo ...

  2. python 3d绘图 范围_python – 在3D绘图中绘制所有三个轴上的分布轮廓

    我在三维空间中有一堆点,并估计了这些点上的一些分布(也在3D空间中;使用 kernel density estimation虽然这与这个问题无关).我想将该分布的投影绘制为所有三个轴(x,y和z)上的 ...

  3. 【学习OpenGL】(三)——3D空间中的点与线

    一.3D空间中的点 #include <gl/glut.h> #include <math.h>#define GL_PI 3.1415fstatic GLfloat xRot ...

  4. 使3D空间中物体朝向和其速度方向一致的旋转矩阵计算方案

    在3D空间中的物体以某一速度运动,有时候需要这个物体的朝向和速度的方向一致, 为了实现这个目标我们一般借助旋转矩阵 M 来将物体旋转到对应的朝向. 例如速度方向矢量 spdV: Vector3D(1, ...

  5. 使用脑电图慢皮层电位重建3D空间中的手,肘和肩的实际和想象的轨迹

    导读 从神经活动中解码想象运动的运动学的能力对于开发可以帮助行动不便的人的假肢设备至关重要.当前采用脑电图(EEG)等无创记录方法解码实际和想象的手运动轨迹来控制神经运动假体,通常通过应用多维线性回归 ...

  6. 3D 空间中拟合曲线

    算法来源:C++/PCL:最小二乘拟合平面直线,平面多项式曲线,空间多项式曲线 以下是我改写的算法,未经验证正确性!!! // 3D 空间中拟合曲线 void fittingPolynomial3D( ...

  7. 3D空间中的点坐标转化为屏幕二维点坐标(一)

    每个人在进入计算机图形学的世界中,都有一个同样的困惑,三维世界中的三维坐标是如何被转换成屏幕上的二维坐标的,我如何在屏幕上找到一个点(二维点)对应三维世界中的点(三维点)呢? 要理解其中的过程,对学习 ...

  8. 一般向量空间的基变换_向量几何--3-D空间中的基变换与坐标变换【转】 - 回到未来 - C++博客...

    <6>3-D空间中的基变换与坐标变换-Twinsen编写 -本人水平有限,疏忽错误在所难免,还请各位数学高手.编程高手不吝赐教 -我的Email-address:popyy@netease ...

  9. 2D平面上的变换和3D空间中的变换以及求无穷远点

    求两个平行线的无穷远点,最简单的方法(二维空间和三维空间都适用) 两个平行线的交点就是无穷远点.求解的方法就是把直线的方向向量(向量我们都用列向量表示)拿到,然后给最后一维加个0就是它们的交点(无穷远 ...

最新文章

  1. tp3.2 连接两个数据库
  2. Vim as Python IDE on windows(转)
  3. c语言 二级菜单_收下计算机二级秘笈,考场上说好不哭!
  4. 【转知乎】人工智能会是泡沫吗?
  5. mysql导出数据表 .xls_mysql数据库导出xls-自定义
  6. ITK:从灰度图像计算直方图
  7. SGU 183. Painting the balls( dp )
  8. (一个)AngularJS获取贴纸Hello World
  9. freetextbox java_FreeTextBox3.2.2下载及使用详解(图)
  10. 前端笔记----定位
  11. Erlang/Elixir 社区摘要: 2016-05-21
  12. NLP之路-Dataset大全
  13. LeetCode:Permutations, Permutations II(求全排列)
  14. antd的table遍历之后添加合计行_付费?是不可能的!20行Python代码实现一款永久免费PDF编辑工具...
  15. 第一天,搬家到博客园
  16. c++ map 析构函数_面向偷懒的编程 - C/C++项目中使用Go的分布式系统库
  17. 计算机网络常用端口号大全
  18. vs2019 无法打开包括文件:“SDKDDKVer.h”: No such file or directory的另外一种解决思路
  19. 分式加法JAVA程序_分式加减运算的八种技巧,有几种方法学校老师没讲过,记得收藏...
  20. LCD6210字符型液晶显示器 (1)

热门文章

  1. 7-13 愿天下有情人都是失散多年的兄妹 (25 分)
  2. Realsense-Ros安装配置
  3. 送书【新书】 |《python数据科学实战》
  4. 阿里云服务器域名备案、域名解析、以及解析域名到服务器指定端口号
  5. YUV 420 444 421 422 的正解(转载)
  6. 【疑难解决】H265编码流媒体播放器EasyPlayer.js播放HLS H265视频流,遇到黑屏如何排查?
  7. 树与二叉树基本概念与性质
  8. iOS UITextField自动换行
  9. VR技术与生态:大咖跟你聊VR未来
  10. 进化优化算法--第二章:爬山法