实验三 OpenGL的简单交互绘制new

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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();

}

相关文档
最新文档