glutMouseFunc(mouse); glutMainLoop();
return 0; /* ANSI C requires main to return int. */ }
2、课堂教学中关于模型变化讲解时,对一个三角形分别实现平移、缩放、旋转等变化的源码及效果图。请以该例为蓝本,实现3题的代码编写。 源码:
#include
void init(void) {
glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); }
void draw_triangle(void) {
glBegin (GL_LINE_LOOP); glVertex2f(0.0, 25.0); glVertex2f(25.0, -25.0); glVertex2f(-25.0, -25.0); glEnd(); }
void display(void) {
glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0);
glLoadIdentity ();
glColor3f (1.0, 1.0, 1.0); draw_triangle ();
glEnable (GL_LINE_STIPPLE); glLineStipple (1, 0xF0F0); glLoadIdentity ();
glTranslatef (-20.0, 0.0, 0.0); draw_triangle ();
glLineStipple (1, 0xF00F); glLoadIdentity (); glScalef (1.5, 0.5, 1.0);
20
draw_triangle ();
glLineStipple (1, 0x8888); glLoadIdentity ();
glRotatef (90.0, 0.0, 0.0, 1.0); draw_triangle ();
glDisable (GL_LINE_STIPPLE);
glFlush (); }
void reshape (int w, int h) {
glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (w <= h)
gluOrtho2D (-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w, 50.0*(GLfloat)h/(GLfloat)w); else
gluOrtho2D (-50.0*(GLfloat)w/(GLfloat)h, 50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0); glMatrixMode(GL_MODELVIEW); }
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init ();
glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }
实验结果图:
21
3、已知某三角形的三顶点坐标为{50.0,25.0},{150.0,25.0},{100.0,100.0}。
要求:(1)创建一个长宽分别为600、600的窗口,窗口的左上角位于屏幕坐标(100,100)处。(提示:请试着修改gluOrtho2D函数参数,使得绘制的三角形尽可能居中显示)
(2)绘制一个由上述顶点所描绘的三角形,实现该三角形进行下列的几何变化:首先使三角形沿着其中心的x轴,y轴方向缩小50%;然后沿着初始中心旋转90度;最后沿着y轴平移100个单位。
实验结果如下图所示:
22
实验五 裁剪
一、实验学时 2学时 二、实验类型 设计型实验 三、实验目的和要求
1、掌握二维图形的基本裁剪算法,如编码算法、中点分割算法、Liang-Barsky算法; 2、掌握OpenGL中矩阵堆栈函数的使用,实现简单的组合变换。 四、实验内容
1、采用Liang-Barsky算法,编程实现教材177页6.15题。(其他裁剪算法同学们可作为课后练习)
要求:1)单击鼠标左键,运行窗口出现裁剪窗口及待裁剪线段,效果图如左下图; 2)单击鼠标右键,窗口呈现出裁剪后的裁剪窗口及裁剪线段,效果图如右下图。
提示:1)关于鼠标的交互操作,请同学们参考实验四中的第1题; 2)绘制图形的函数,建议放在回调函数mouse(int button,int state,int x,int y)中,而display()函数中可只保留glClear (GL_COLOR_BUFFER_BIT)清除颜色缓存这个函数。
3)考虑到该裁剪窗口和裁剪线段的大小,建议将reshape()函数中的正交投影函数参数变为glOrtho(-5.0, 5.0, -5.0, 5.0, -1.0, 1.0);
2、下面的程序绘制的是一个简单的太阳系,其中包括一个太阳和一颗行星,它们使用线框球体绘制函数实现。当按下键盘“D”或“d”时,行星将实现自转;按下键盘“Y”或“y”时,行星将绕太阳公转。
请同学们认真读懂每一段代码,然后试着修改这段程序,实现
1)将行星的中心倾斜; 2)给行星加上卫星。 #include
static int year = 0, day = 0;
void init(void) {
glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT);
23
}
void display(void) {
glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0);
glPushMatrix();
// glutWireSphere中第一、二、三个参数分别表示半径,经度线数、纬度线数 glutWireSphere(1.0, 20, 16); /* draw sun */ glRotatef ((GLfloat) year, 0.0, 1.0, 0.0); glTranslatef (2.0, 0.0, 0.0);
glRotatef ((GLfloat) day, 0.0, 1.0, 0.0);
glutWireSphere(0.2, 10, 8); /* draw smaller planet */ glPopMatrix(); glutSwapBuffers(); }
void reshape (int w, int h) {
glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity ();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); }
void keyboard (unsigned char key, int x, int y) {
switch (key) { case 'd':
day = (day + 10) % 360; glutPostRedisplay(); break; case 'D':
day = (day - 10) % 360; glutPostRedisplay(); break; case 'y':
year = (year + 5) % 360; glutPostRedisplay(); break;
24