opengl学习指导实验 计算机图形学上机(5)

2019-04-13 22:52

glutMouseFunc(mouse); glutMainLoop();

return 0; /* ANSI C requires main to return int. */ }

2、课堂教学中关于模型变化讲解时,对一个三角形分别实现平移、缩放、旋转等变化的源码及效果图。请以该例为蓝本,实现3题的代码编写。 源码:

#include #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 #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


opengl学习指导实验 计算机图形学上机(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:仪器分析习题(色谱)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: