《计算机图形学》实验指导书
《计算机图形学》实验指导书
实验1:OpenGL入门
一:实验目的和要求
1. 掌握在利用OpenGL进行程序设计的基本方法。 2. 掌握windows环境下的消息处理方法。 3. 理解在三维图形加速下OpenGL运行机制。
二:内容和方法 内容:
1. 使用OpenGL画一个正方体。
提示:
? 可参考: OpenGL教程_NeHe01-11_基础.chm 。
例6-1 辅助库应用例程 testaux.c
#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
#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 黄可坤