logo资料库

三维图形的几何变换;.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
实验七 三维图形的几何变换 一、实验目的 1、掌握三维图形的几何变换; 2、掌握投影变换算法。 二、实验要求 1、利用三维图形的平移、缩放、旋转等几何变换,任意画出一个三维综合图形。 2、任意画出一个二维半图形, 分别画出该图形的正视图、俯视图、侧视图;(提 高题,在第四象限画出这个二维半图形的轴测图)。 三、实验代码 1、 #include GLfloat yRot = 0; GLfloat xRot = 0; GLfloat zRot = 0; void Init() { } glClearColor(1.0, 1.0, 1.0, 1.0); //背景 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(1.3, 1.6, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //gluLookAt()共有九个参数,分别是眼睛的位置,眼睛朝向的位置,以及相机朝向的方向。 }
void Mydisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-2.0, 2.0, -2.0, 2.0, -100, 100); glPointSize(1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(1.3, 1.6, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //保存当前位置,并旋转 glPushMatrix(); glRotatef(xRot, 1.0f, 0.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 0.0f); glRotatef(zRot, 0.0f, 0.0f, 1.0f); //开始绘图 glPushMatrix(); glColor3f(0.0f, 1.0f, 1.0f); glTranslated(1.125, 0.125, 0.125); glutWireTeapot(0.5); //茶壶 glPopMatrix(); glPushMatrix(); glColor3f(0.0f, 1.0f, 1.0f); glTranslated(0.125, 0.125, 1.125); glutWireSphere(0.25, 8, 8);//球体 glPopMatrix(); glPushMatrix(); //保存当前位置 glTranslated(0.0, 1.0, 1.0); GLUquadricObj * quadricObj = gluNewQuadric(); gluQuadricDrawStyle(quadricObj, GLU_LINE); gluCylinder(quadricObj, 0.2, 0.2, 0.3, 6, 6); glRotated(-90, 0.0, 0.0, 0.0); glPopMatrix();
glPopMatrix();//回到原来位置 glutSwapBuffers();//双缓冲技术 } void SpecialKeys(int key, int x, int y) { } if (key == GLUT_KEY_LEFT) yRot -= 5.0f; if (key == GLUT_KEY_RIGHT) yRot += 5.0f; if (key == GLUT_KEY_UP) xRot -= 5.0f; if (key == GLUT_KEY_DOWN) xRot += 5.0f; if (key> 356.0f) yRot = 0.0f; if (key< -1.0f) yRot = 355.0f; if (key> 356.0f) xRot = 0.0f; if (key< -1.0f) xRot = 355.0f; if (key == GLUT_KEY_F1) //绕着 z 轴旋转 zRot += 5.0f; glutPostRedisplay(); // 使用新的坐标重新绘制场景 int main(int argv, char *argc[]) { glutInit(&argv, argc); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowSize(800, 800); glutInitWindowPosition(400, -400); glutCreateWindow("三维图形"); Init(); glutDisplayFunc(Mydisplay);
glutReshapeFunc(Reshape); glutSpecialFunc(SpecialKeys); glutMainLoop(); } 实验二: #include #include #include int x[10] = { 0,100,100,0,0,100,100,0,50 }; int y[10] = { 0,0,100,100,0,0,100,100,50 }; int z[10] = { 0,0,0,0,0,100,100,100,100,150 }; int Id[30] = { 0,1,2,3,0,4,5,6,7,4,8,7,3,4,6,2,5,1,6,8,5 }; int flog[30] = { 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }; void Init() { glClearColor(1.0f, 1.0f, 1.0f, 0.0f); } void Reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-w / 2, w / 2, -h / 2, h / 2, -300, 300); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void XY(void){ //坐标
glLineWidth(1); glColor3f(0.0, 0.0, 0.0); glBegin(GL_LINES); glVertex2i(-320, 0); glVertex2i(320, 0); glVertex2i(0, -240); glVertex2i(0, 240); glEnd(); glFlush(); } void TopView(int tx, int ty) { int i, j, k; glBegin(GL_LINES); for (i = 0;i <= 30;i++) { j = Id[i]; k = Id[i + 1]; if (flog[i + 1] == 1) { glVertex3i(-x[j] - tx, -y[j] - ty, 0); glVertex3i(-x[k] - tx, -y[k] - ty, 0); } glEnd(); glFlush(); } } void FrontView(int tx, int ty) { int i, j, k; glBegin(GL_LINES); for (i = 0;i < 30;i++) { j = Id[i]; k = Id[i + 1];
if (flog[i + 1] == 1) { glVertex3i(-x[j] - tx, z[j] + ty, 0); glVertex3i(-x[k] - tx, z[k] + ty, 0); } } glEnd(); glFlush(); } void LeftView(int tx, int ty) { int i, j, k; glBegin(GL_LINES); for (i = 0;i < 30;i++) { j = Id[i]; k = Id[i + 1]; if (flog[i + 1] == 1) { glVertex3i(y[j] + tx, z[j] + ty, 0); glVertex3i(y[k] + tx, z[k] + ty, 0); } } glEnd(); glFlush(); } void mydisplay(void) { int tx = 80, ty = 50; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity();
XY(); glLineWidth(3); glColor3f(0.0, 1.0, 0.0); FrontView(tx, ty); glColor3f(0.0, 0.0, 1.0); TopView(tx, ty); glColor3f(1.0, 0.0, 0.0); LeftView(tx, ty); } int main(int argv, char *argc[]) glutInit(&argv, argc); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowSize(640, 480); glutInitWindowPosition(100, 100); glutCreateWindow("Demo"); Init(); glutDisplayFunc(mydisplay); glutReshapeFunc(Reshape); glutMainLoop(); return 0; { } 四、实验结果截图
分享到:
收藏