实验一 VS+OpenGL绘图环境及基本图形绘制

一、实验目的

  1. 熟悉OpenGL的主要功能;
  2. 掌握OpenGL的绘图流程和原理;
  3. 掌握OpenGL核心函数的使用;
  4. 熟悉OpenGL基本图形元素的绘制函数。

二、实验内容

  1. 如预备知识所述,创建一个OpenGL工程,修改第一个程序中的Display()函数,如下:

void Display(void)

{

glClear (GL_COLOR_BUFFER_BIT); //清除缓存

glBegin(GL_LINES);             //开始画线

glColor3f (1.0f, 1.0f, 0.0f);          //设置颜色为黄色

//设置第一根线的两个端点,请注意:OpenGL坐标系的原点是在屏幕左下角

glVertex2f(10.0f, 50.0f);

glVertex2f(110.0f, 50.0f);

glColor3f (1.0f, 0.0f, 0.0f);           //设置颜色为红色

//设置第二根线的两个端点

glVertex2f(110.0f, 50.0f);

glVertex2f(110.0f, 150.0f);

glEnd();      //画线结束

glFlush ();

}

该程序是在窗口中画两条线,分别用黄色和红色绘制。如上所述,OpenGL是一个状态机,glBegin(UINT State)可以设定如下状态:

GL_POINTS   画点

GL_LINES    画线,每两个顶点(Vertex)为一组

GL_LINE_STRIP  画线,把若干个顶点顺次连成折线

GL_LINE_LOOP   画线,把若干个顶点顺次连成封闭折线

GL_TRIANGLES   画三角形,每三个顶点为一组

GL_QUADS    画四边形,每四个顶点为一组

GL_POLYGON     画多边形

还有GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP 等等。另外,程序可以有多组glBegin()、glEnd()并列的形式,如:

... ...

glBegin(GL_LINES);

......

glEnd();

 

glBegin(GL_QUADS);

... ...

glEnd();

... ...

要求:利用OpenGL库函数绘制基本图形,输出绘制结果。

  1. 绘制函数,通过设置观察矩形和视口,使得曲线在窗口的显示效果如下图所示。

  1. 利用OpenGL函数绘制圆弧和心脏线

圆弧通过其中心c,外接圆的半径R,以及开始的角度a和它展开的角度b来表示,函数可以表示为:

void drawArc(Point2 center, float radius, float startAngle, float sweep)

心脏线要求平铺屏幕窗口,并创建菜单,通过菜单设定心脏线的大小(K值决定大小),通过鼠标动作改变心脏线的颜色。心脏线的极坐标形式为:

参考代码:

恐龙平铺屏幕窗口polyline.cpp

菜单GlutMenu.cpp

三、实验设计思路

1. 创建一个OpenGL工程,修改初始化代码Display函数,glBegin(GL_LINES)开始画线;glColor3f ()设置颜色;glVertex2f()设置第一根线的两个端点。从而得到两条颜色及位置不同的线段。

2.修改Display函数,glBegin(GL_LINE_STRIP);开始画线,把若干个顶点顺次连成折线glColor3f(0.0f, 0.0f, 0.0f);设置颜色,利用for循环描点glVertex2f(i, exp(-i) * cos(2 * 3.14 * i));函数。再修改Initial函数中gluOrtho2D(0.0, 4.0, -1.0, 1.0);的X与Y轴显示区域。

3. 圆弧通过其中心c,外接圆的半径R,以及开始的角度a和它展开的角度b来表示;对心脏线进行绘制,创建菜单以控制心脏线的大小,用鼠标左键控制菜单弹出,K设置了五个心脏线大小。通过鼠标右键来控制颜色,glColor3f(red/256.0+0.5, green/256.0+0.5, blue/256.0+0.5);设置随机数,最后通过glViewport调节视口,来实现了一个5*5的平铺屏幕窗口效果。

四、实验代码

1.

#include <gl/glut.h>void Initial(void)
{glClearColor(1.0f, 1.0f, 1.0f, 1.0f);      //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);     //设置投影参数glLoadIdentity();gluOrtho2D(0.0, 200.0, 0.0, 200.0);
}void Display(void)
{glClear(GL_COLOR_BUFFER_BIT); //清除缓存glBegin(GL_LINES);             //开始画线glColor3f(1.0f, 1.0f, 0.0f);          //设置颜色为黄色
//设置第一根线的两个端点,请注意:OpenGL坐标系的原点是在屏幕左下角glVertex2f(10.0f, 50.0f);glVertex2f(110.0f, 50.0f);glColor3f(1.0f, 0.0f, 0.0f);           //设置颜色为红色
//设置第二根线的两个端点glVertex2f(110.0f, 50.0f);glVertex2f(110.0f, 150.0f);glEnd();      //画线结束glFlush();
}void main(int argc, char* argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  //初始化窗口的显示模式glutInitWindowSize(400, 400);                  //设置窗口的尺寸glutInitWindowPosition(100, 120);               //设置窗口的位置glutCreateWindow("矩形");                    //创建一个名为矩形的窗口glutDisplayFunc(Display);                     //设置当前窗口的显示回调函数Initial();                                    //完成窗口初始化glutMainLoop();                             //启动主GLUT事件处理循环//       return 0;
}

2.

#include <gl/glut.h>
#include<math.h> void Initial(void)
{glClearColor(1.0f, 1.0f, 1.0f, 1.0f);      //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);     //设置投影参数glLoadIdentity();gluOrtho2D(0.0, 4.0, -1.0, 1.0);
}void Display(void)
{glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_LINE_STRIP);glColor3f(0.0f, 0.0f, 0.0f);for (float i = 0; i <= 4; i = i + 0.01){glVertex2f(i, exp(-i) * cos(2 * 3.14 * i));}glEnd();glFlush();
}void main(int argc, char* argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  //初始化窗口的显示模式glutInitWindowSize(400, 400);                  //设置窗口的尺寸glutInitWindowPosition(100, 120);               //设置窗口的位置glutCreateWindow("矩形");                    //创建一个名为矩形的窗口glutDisplayFunc(Display);                     //设置当前窗口的显示回调函数Initial();                                    //完成窗口初始化glutMainLoop();                             //启动主GLUT事件处理循环//       return 0;
}

3.1

#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>GLuint startList;void init(void)
{GLUquadricObj* qobj;startList = glGenLists(1);qobj = gluNewQuadric();gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); /* 只画边缘  */gluQuadricNormals(qobj, GLU_NONE);/*不算NORMAL(顶点的方向)*/glNewList(startList, GL_COMPILE);/*只编译DISPLAY LIST不绘制*/gluPartialDisk(qobj, 0.0, 1.0, 20, 4, 0.0, 225.0);/* 第一个参数是A quadric object,然后内圆半径为0.0,外圆半径为1.0,z轴向分割片数,最后两个参数是圆弧的起始角和结束角  */glEndList();
}void display(void)
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();glColor3f(1.0, 1.0, 0.0);glCallList(startList);glPopMatrix();glFlush();
}void reshape(int w, int h)
{glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-2.5, 2.5, -2.5 * (GLfloat)h / (GLfloat)w,2.5 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);elseglOrtho(-2.5 * (GLfloat)w / (GLfloat)h,2.5 * (GLfloat)w / (GLfloat)h, -2.5, 2.5, -10.0, 10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}/* ARGSUSED1 */
void keyboard(unsigned char key, int x, int y)
{switch (key) {case 27:exit(0);break;}
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(300, 300);glutInitWindowPosition(100, 100);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;
}

3.2

#include <windows.h>
#include<iostream>
#include <GL/glut.h>
#include <cmath>#define PI 3.1415926
#define RED 1
#define GREEN 2
#define BLUE 3
#define WHITE 4
//初始化OpenGL场景float red = 1.0, blue = 1.0, green = 1.0;
float K = 1;
void myinit(void)
{glClearColor(0.0, 0.0, 0.0, 0.0);      //将背景置成黑色glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-12.0, 12.0, -12.0, 12.0);
}
//用户的绘图过程void mydisplay()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//glColor3f(1.0, 0.0, 0.0);glColor3f(red / 256.0 + 0.5, green / 256.0 + 0.5, blue / 256.0 + 0.5);for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++){glViewport(i * 64, j * 64, 100, 100);glBegin(GL_LINE_LOOP);for (float x = 0; x < 2 * 3.14; x = x + 0.1){glVertex2f((1 + cos(x)) * cos(x) * K, (1 + cos(x)) * sin(x) * K);}glEnd();}}glFlush();
}void myMouse(int button, int state, int x, int y) {if (state == GLUT_DOWN){if (button == GLUT_RIGHT_BUTTON){red = rand() / 128;blue = rand() / 128;green = rand() / 128;}else if (button == GLUT_RIGHT_BUTTON){glClearColor(1.0f, 0.0f, 0.0f, 0.0f); // RedglClear(GL_COLOR_BUFFER_BIT);glFlush();}}}
void processMenuEvents_two(int option) {switch (option){case 1:K = 1; break;case 2:K = 2; break;case 3:K = 3; break;case 4:K = 4; break;case 5:K = 5; break;default:break;}
}int main(int argc, char* argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(0, 0);glutInitWindowSize(400, 400);glutCreateWindow("心脏线");myinit();glutDisplayFunc(mydisplay);glutIdleFunc(mydisplay);//空闲回调函数glutMouseFunc(myMouse);glutCreateMenu(processMenuEvents_two);glutAddMenuEntry("one", 1);glutAddMenuEntry("two", 2);glutAddMenuEntry("three", 3);glutAddMenuEntry("four", 4);glutAddMenuEntry("five", 5);glutAttachMenu(GLUT_LEFT_BUTTON);glutMainLoop();
}

五、实验结果及心得体会

1.

2.

3

此次实验,学会了基本的VS+OpenGL绘图环境及基本图形绘制,了解了OpenGL的主要功能以及绘图流程和原理。实现了OpenGL核心函数的使用以及基本图形元素的绘制函数。还实现了鼠标交互等功能。通过本次实验绘制了不同的函数图像,对今后的学习也有了较大的帮助。

计算机图形学——实验一 VS+OpenGL绘图环境及基本图形绘制相关推荐

  1. 计算机图形学实验一 《MFC绘图基础》

    计算机图形学实验一 <MFC绘图基础> 视频讲解:无没啥讲的,有一些东西在实验二视频提了一下 一.MFC介绍 1.基本介绍: MFC是微软公司提供的一个类库,以C++类的形式封装了Wind ...

  2. 【计算机图形学】用python的turtle进行简单的图形绘制

    [计算机图形学]用python的turtle进行简单的图形绘制 python的turtle模块 绘制图形 绘制点 绘制直线 绘制椭圆 绘制六边形 绘制n次贝塞尔曲线 结语 python的turtle模 ...

  3. 【OpenGL】计算机图形学实验一:OpenGL基础实验(实验环境的熟悉、简单图形的绘制和输出)

    实验一:OpenGL基础实验 (实验环境的熟悉.简单图形的绘制和输出) 1.实验目的和要求 学习基本的OpenGL图形绘制和输出函数,掌握使用基于C++  OpenGL开发图形程序的流程. 2.实验设 ...

  4. 计算机图形学(三)——opengl实现动态钻石图的绘制

    钻石图的实验原理: 双缓冲技术: 双缓冲是一种基本的动画技术,主要用于解决单缓冲擦除图像时带来的屏幕闪烁问题. 所谓双缓冲,是指一个屏幕设备上下文(屏幕缓冲区)和一个内存设备上下文(内存缓冲区).内存 ...

  5. 计算机图形动画处理实训报告,西安石油大学计算机图形学 实验报告.doc

    文档介绍: 西安石油大学计算机图形学_实验报告实验报告 -计算机图形学实验大作业 课程名称计算机图形学 实验名称二维绘图系统与计算机动画 姓名 学号 专业班级 成绩 指导教师爨莹 实验报告 课程名称计 ...

  6. OpenGL南邮计算机图形学实验报告二——两个纹理的渐变变换和移动

    OpenGL南邮计算机图形学实验报告二--两个纹理的渐变变换和移动 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SOIL2 ...

  7. OpenGL南邮计算机图形学实验报告四——用键盘控制物体

    OpenGL南邮计算机图形学实验报告四--用键盘控制物体 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SOIL2 环境配置. ...

  8. OpenGL南邮计算机图形学实验报告三——实现类似地月系统的两物体环绕移动

    OpenGL南邮计算机图形学实验报告三--实现类似地月系统的两物体环绕移动 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SO ...

  9. 计算机图形Opengl的实验报告,opengl计算机图形学实验报告之3D漫游世界.doc

    opengl计算机图形学实验报告之3D漫游世界.doc 北师大珠海分校信息技术学院计算机图形学实验报告实验报告文件命名方式学号姓名_实验序号_实验名称.doc姓名学号1001010092专业计算机任课 ...

最新文章

  1. centos删除php_Linux CentOS完全卸载PHP
  2. 一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE
  3. 前端学习(2874):原生js模块化+canvas绘制弹幕
  4. 聊聊flink的FsStateBackend
  5. 一个简单的GTK的例子程序
  6. STL中map与hash_map容器的选择
  7. python 立方体切割块数_用参数化su计算立方体切割体积
  8. Web安全深度剖析-笔记
  9. 给Android系统瘦身,安卓优化大师:给系统瘦身
  10. VMware安装虚拟机操作步骤[史上最详细]
  11. mqtt 服务器 ca 证书,如何将SSL MQTT客户机与CA签名服务器证书连接?
  12. python概率分布拟合_使用曲线拟合在Python中拟合对数正态分布
  13. 用hook android 微信,【第一篇】【安卓微信】HOOK微信发消息,当HOOK遇上HOOK。
  14. 某招聘网站“数据分析”相关岗位招聘信息爬取并分析
  15. Python报错不要慌,这三个关键词帮你解决问题!
  16. wangEditor图片上传
  17. ORA-00923: 未找到要求的FROM关键字
  18. 视频文件太大如何压缩变小?
  19. 常见博客Blog托管提供商评测
  20. 涨点神器!南航提出AFF:注意力特征融合,即插即用!可用于分类、检测和分割等...

热门文章

  1. jira邮件自动提醒功能配置
  2. h5+实现手机端的录音,拍照,录像
  3. Linux内核中使用内存检测
  4. 大型情感类电视连续剧--Android高德之旅(2)地图类型
  5. Visio 图形大小如何随文字多少自动调整?
  6. 火热报名中! GDEC2022北京数字经济体验周低代码大赛开启
  7. OneNote丢失笔记分区后找回
  8. 华为OD机试真题:分糖果-均分【2022 Q1 Q2 |200分】
  9. 【视频】植物细胞分裂
  10. MATLAB的数值型数据类型有哪些,分别怎么表示