实验指导书 下载本文

《计算机图形学》实验指导书

《计算机图形学》实验指导书

实验1:OpenGL入门

一:实验目的和要求

1. 掌握在利用OpenGL进行程序设计的基本方法。 2. 掌握windows环境下的消息处理方法。 3. 理解在三维图形加速下OpenGL运行机制。

二:内容和方法 内容:

1. 使用OpenGL画一个正方体。

提示:

? 可参考: OpenGL教程_NeHe01-11_基础.chm 。

例6-1 辅助库应用例程 testaux.c

#include #include #include #include #include

#pragma comment(lib, \ #pragma comment(lib, \ #pragma comment(lib, \

void myinit(void);

void CALLBACK myReshape(int w, int h); void CALLBACK display(void); void myinit(void) //初始化

{glClearColor(0.0,0.0,0.0,0.0); //将窗口清为黑色 }

void CALLBACK display(void) {

glClear(GL_COLOR_BUFFER_BIT); //将颜色缓存清为glClearColor命令所设置的颜色,即背景色

glColor4f(0.2,0.8,1.0,1.0); //选颜色(R,G,B) glRotatef(30,1.0,1.0,0.0); //做旋转变换 auxWireCube(1.0); //绘制六面体的虚线图 glFlush(); //强制绘图,不驻留缓存 }

void CALLBACK myReshape (int w, int h) //用于窗口大小改变时的处理,与绘图无关

第1页 http://www.cocoon.org.cn 黄可坤

《计算机图形学》实验指导书

{glViewport(0,0,w,h); }

void main(void) {

auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); //窗口显示单缓存和RGB(彩色)模式 auxInitPosition(0,0,200,200); //大小 x=200 y=200 (0,0)是屏幕左上点 auxInitWindow(\ //初始化窗口,参数是标题 myinit();

auxReshapeFunc(myReshape); auxMainLoop(display); }

实验2:OpenGL变换

一:实验目的和要求

4. 掌握在利用OpenGL进行程序设计的基本方法。 5. 掌握OpenGL下进行图形变换的方法。

二:内容(二选一)

2. 使用OpenGL画一个正方体和一个球。球的直径等于正方体的边长,球放在正方

体的正上方。球不断转动,正方体也不断转动。

3. 做一个不断旋转和移动的正方体,并且只在一个大正方体范围内移动,碰到边

界后反弹。

提示:

? 可参考: OpenGL教程_NeHe01-11_基础.chm 及 如下程序。 /*

OpenGL下显示旋转的正方体,并带有鼠标键盘响应 Create: 2009.3 Author: kk.h

Homepage: http://www.cocoon.org.cn/ */

#include \ #include #include #include #include

#pragma comment(lib, \链接时使用OpenGL32.lib #pragma comment(lib, \ // 链接时使用GLu32.lib #pragma comment(lib, \ // 链接时使用GLaux.lib

void myinit(void); // 初始化,只在主程序开始时调用一次 void CALLBACK myReshape(GLsizei w, GLsizei h); // 初始化和窗口形状改变时系统自动

第2页 http://www.cocoon.org.cn 黄可坤

《计算机图形学》实验指导书

调用的函数

void CALLBACK display(void); // 画图,在初始化和窗口重新获得焦点时系统自动调用

GLfloat theta=0; // 中心物体自传的角度

GLfloat zpos=-5; // 中心物体的z坐标(也可看成调整视点位置)

void myinit (void) {

GLfloat light_position[] = { 0.0, 0.0, 1.0, 0.0 };

glLightfv(GL_LIGHT0, GL_POSITION, light_position); // 设置0号光源的位置

glEnable(GL_LIGHTING); // 启动光照

glEnable(GL_LIGHT0); // 使得0号光源号有效 glShadeModel(GL_SMOOTH); // 阴影光滑明暗处理 glDepthFunc(GL_LESS); // 所作深度测试的类型 glEnable(GL_DEPTH_TEST); // 启用深度测试 }

// 在初始化和窗口重新获得焦点时系统自动调用的函数,最重要的函数! void CALLBACK display (void) {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清空屏幕,重新画

glLoadIdentity (); // 使得变换矩阵变为单位阵

glTranslatef (0.0, 0.0, zpos); // 为了让视点能看到,把物体平抑到z轴的zpos处 (视点在坐标原点,往z负轴观看)

glRotatef(theta,0,1,0); // 绕y轴旋转theta度 glRotatef(30,1,0,0); // 绕x轴旋转30度

auxSolidCube(2.0); // 以原点为中心,在内存中画一个边长为2的正方体。

glFlush(); // 把内存画好的数据显示在屏幕上

auxSwapBuffers(); // 双缓存模式(后台画前台显示),交换缓存,使得动画不闪烁。

_sleep(50); // 防止速度过快,太消耗CPU,停顿50毫秒 }

// 程序空闲时(即没有键盘鼠标消息时)系统自动调用的函数 void CALLBACK stepDisplay(void) {

第3页 http://www.cocoon.org.cn 黄可坤