实验三 OpenGL的简单交互绘制new
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三 OpenGL的简单交互绘制
一、实验目的
1、理解OpenGL坐标系的概念,掌握OpengGL裁剪窗口、视区、显示窗口
的概念和它们之间的关系,学会计算世界坐标和屏幕坐标。
2、学会OpenGL的简单键盘交互操作。
3、学会OpenGL的简单字符绘制。
3、进一步掌握OpengGL点、直线、多边形的绘制。
二、实验环境
硬件要求:
PC机,主流配置,最好为独立显卡,显存512M以上。
软件环境:
操作系统:Windows XP。
语言开发工具:Microsoft Visual studio 2008,Visual C++。
程序框架:Win32应用程序
三、实验内容与要求
3.1 键盘交互
1、调出实验一的源代码运行,调整修改使得显示窗口在屏幕中央保持缺省大
小(300*300),绘制的矩形在显示窗口中央。如图2-1所示。
提示:
(1)添加修改窗口位置的函数glutInitWindowPosition(int x, int y);
其中(x,y)为窗口左上角在屏幕上的位置。
(2)显示窗口的左下角坐标为(-1,-1),右上角坐标为(1,1)。
图2-1
未修改前的win32初始源程序参考如下:
/*my first program.cpp*/
#include"stdafx.h"
#include
void display(void);
void myreshape(GLsizei w, GLsizei h);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
char *argv[] = {"hello ", " "};
int argc = 2; // must/should match the number of strings in argv
glutInit(&argc, argv); //初始化GLUT库;
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式;(缓冲,颜色类型)glutInitWindowSize(500, 500);
glutInitWindowPosition(1024 / 2 - 250, 768 / 2 - 250);
glutCreateWindow("Hello"); //创建窗口,标题为“hello”;
glutDisplayFunc(display); //用于绘制当前窗口;
glutMainLoop(); //表示开始运行程序,用于程序的结尾;
return 0;
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT); //刷新颜色缓冲区
glRectf(-0.5,-0.5,0.5,0.5);
glFlush(); //用于刷新命令队列和缓冲区,使所有尚未被执行的OpenGL命令得到执行
}
2、在实验一的基础上添加键盘交互,按W键绘制的矩形上移,按S键矩形
下移,按A键矩形左移,按D键矩形右移,如图2-2。参考步骤如下:
(1)在主函数里添加注册键盘回调函数
glutKeyboardFunc(mykeyboard);
此函数可放在 glutDisplayFunc(display);后面。
并在程序头部声明添加键盘回调函数:
void mykeyboard(unsigned char key, int x, int y);
(2)在display()绘制函数中修改绘制矩形代码,用变量代替数值参数。
例如: glRectf(-0.5,-0.5,0.5,0.5)改为glRectf(x1,y1,x2,y2);
程序前面加上变量声明和初始值,如:float
x1=-0.5,y1=-0.5,x2=0.5,y2=0.5; 注意语句的位置。
(3)在程序中增加mykeyboard键盘子函数,可放在display()函数之后。并在如下代码中进行修改,实现键盘控制矩形移动,运行程
序自行测试。
void mykeyboard(unsigned char key, int x, int y)
{
switch(key)
{ case 'W':
case 'w':// 矩形对角坐标变量修改使得矩形上移
y1+=0.1; y2+=0.1;
break;
case 'S':
case 's'://矩形对角坐标变量修改使得矩形下移
y1-=0.1;y2-=0.1;
break;
case 'A':
case 'a'://矩形对角坐标变量修改使得矩形左移
x1-=0.1; x2-=0.1;
break;
case 'D':
case 'd'://矩形对角坐标变量修改使得矩形右移
x1+=0.1; x2+=0.1;
break;
}
//参数修改后调用重画函数,屏幕图形将发生改变
glutPostRedisplay();
}