计算机图形学——大作业
生活随笔
收集整理的這篇文章主要介紹了
计算机图形学——大作业
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
計算機圖形學大作業(yè)
一、實驗要求
繪制一個簡單的三維場景,可以是室內(nèi):臥室,辦公室,教室,也可以是室外:運動場,公園等,加上光照效果,簡單的紋理映射,透視投影;不能過于簡單;可以加動畫、鼠標和鍵盤交互。
??? 上交材料: project和word文檔(具體內(nèi)容展示,思路和心得)
二、實驗思路
首先初始化窗口,定義攝像機坐標與視口坐標,利用實驗二的知識內(nèi)容繪制三維立體模型,定義每一個模型的坐標值以及利用變換函數(shù)實現(xiàn)相對位置的放置;利用實驗三中的知識給整個場景進行燈光的設置;然后使用實驗四中的代碼實現(xiàn)模型材質(zhì)的紋理貼圖;最后進行鼠標與鍵盤的交互,實現(xiàn)鼠標可以控制攝像機的高度以及鍵盤的上下左右實現(xiàn)攝像機的移動。
三、實驗代碼
?
#include<windows.h> #include<gl/glut.h> #include<stdio.h> #include<math.h> #include<GL/glaux.h> GLuint drawcube,drawsphere,drawteapot;static float a=0.0; static GLdouble eye=1.0; static GLfloat locate=1.0; static int lflag=GL_TRUE,rflag=GL_TRUE;GLfloat planes[] = { 1.0,0.0,0.0,0.0 }; GLfloat planet[] = { 0.0,0.5,0.0,0.5 };GLuint texture[8]; //創(chuàng)建一個紋理空間 AUX_RGBImageRec* LoadBMP(CHAR* Filename) //載入位圖圖像 {FILE* File = NULL; //文件句柄if (!Filename) //確保文件名已提供{return NULL;}File = fopen(Filename, "r"); //嘗試打開文件if (File){fclose(File); //關閉文件return auxDIBImageLoadA(Filename); //載入位圖并返回指針}return NULL; //如果載入失敗,返回NULL }int LoadGLTextures() //載入位圖并轉(zhuǎn)換成紋理 {int Status = FALSE; //狀態(tài)指示器AUX_RGBImageRec* TextureImage[8]; //創(chuàng)建紋理的存儲空間memset(TextureImage, 0, sizeof(void*) * 8);//初始化 //載入位圖,檢查有無錯誤,如果位圖沒找到則退出char* image[] = {(char*)"texture.bmp",(char*)"texture1.bmp",(char*)"texture2.bmp",(char*)"texture3.bmp",(char*)"texture4.bmp",(char*)"texture5.bmp",(char*)"texture6.bmp",(char*)"texture7.bmp",};for (int i = 0; i < 8; i++){if (TextureImage[i] = LoadBMP(image[i])){Status = TRUE;glGenTextures(1, &texture[i]);//使用來自位圖數(shù)據(jù)生成的紋理glBindTexture(GL_TEXTURE_2D, texture[i]);//指定二維紋理glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[i]->sizeX, TextureImage[i]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[i]->data);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);}if (TextureImage[i]) //紋理是否存在{if (TextureImage[i]->data) //紋理圖像是否存在{free(TextureImage[i]->data); //釋放紋理圖像占用的內(nèi)存}free(TextureImage[i]); //釋放圖像結(jié)構(gòu)}}return Status; //返回Status }void reshape(int w, int h) {glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(90,w/h,0.5,1000); //透視效果glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(80,100,300,0,0,0,0,10,0);//設置觀察點} void init1() //初始化 {glClearColor(0.0, 0.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//畫出正方體顯示列表drawcube = glGenLists(1);glNewList(drawcube, GL_COMPILE);glutSolidCube(1);glEndList();//畫出茶壺顯示列表drawteapot = glGenLists(1);glNewList(drawteapot, GL_COMPILE);glutSolidTeapot(1);glEndList();//設置普通燈光照0位置及參數(shù);GLfloat position0[] = { 30,5,30,1 };GLfloat light0s[] = { 0.10,0.10,0.10,0.0 };GLfloat light0d[] = { 0.6,0.7,0.7 };GLfloat light0a[] = { 0.9,0.9,0.9 };glLightfv(GL_LIGHT0, GL_POSITION, position0);glLightfv(GL_LIGHT0, GL_SPECULAR, light0s);glLightfv(GL_LIGHT0, GL_DIFFUSE, light0d);glLightfv(GL_LIGHT0, GL_AMBIENT, light0a);//設置探照燈光照1位置及參數(shù)GLfloat position1[] = { -60,40,0,1 };GLfloat light1s[] = { 1.0,1.0,1.0,1.0 };GLfloat light1d[] = { 0.06,0.1,0.1 };GLfloat light1a[] = { 0.91,0.99,0.96 };GLfloat direction[] = { 0,-60,0,1 };glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, direction);glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 30.0);glLightfv(GL_LIGHT1, GL_POSITION, position1);glLightfv(GL_LIGHT1, GL_SPECULAR, light1s);glLightfv(GL_LIGHT1, GL_DIFFUSE, light1d);glLightfv(GL_LIGHT1, GL_AMBIENT, light1a);glEnable(GL_LIGHTING);glEnable(GL_DEPTH_TEST);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);LoadGLTextures();}void draw() //繪制 {if(lflag)glEnable(GL_LIGHT0);if(rflag)glEnable(GL_LIGHT1);glClearColor(0.51,0.40,0.5,0.0); //背景色glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();glRotatef(a,0.0,1.0,0.0);glScaled(eye,eye,eye);glTranslatef(0,locate,0);glPushMatrix();//房子地面貼圖glPushMatrix();//glEnable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D);glShadeModel(GL_SMOOTH);glBindTexture(GL_TEXTURE_2D, texture[4]);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);////房子地面glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,0.0);glTranslatef(0,-20,0);glScalef(147.5,1,147.5);glRotatef(90, 1, 0, 0);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.0);glutSolidCube(1);glDisable(GL_TEXTURE_2D);//glPopMatrix();////房頂貼圖glPushMatrix();//glEnable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D);glShadeModel(GL_SMOOTH);glBindTexture(GL_TEXTURE_2D, texture[7]);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);////房頂glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT, GL_AMBIENT);glColor4f(1.0, 1.0, 1.0, 0.0);glTranslatef(0, 75, 0);glScalef(147.5, 1, 147.5);glRotatef(90, 1, 0, 0);glCallList(drawcube);glColor4f(0.0, 1.0, 0.0, 0.0);glutSolidCube(1);glDisable(GL_TEXTURE_2D);//glPopMatrix();////草坪貼圖glPushMatrix();//glEnable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D);glShadeModel(GL_SMOOTH);glBindTexture(GL_TEXTURE_2D, texture[6]);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);////草坪glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,0.5);glTranslatef(0,-22,0);glScalef(700,2,700);glRotatef(90, 1, 0, 0);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.5);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glDisable(GL_TEXTURE_2D);//glPopMatrix();////土地glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(210.0/255,105.0/255,30.0/255,0.5);glTranslatef(0,-32,0);glScalef(700,20,700);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.5);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//墻貼圖glPushMatrix();//glEnable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D);glShadeModel(GL_SMOOTH);glBindTexture(GL_TEXTURE_2D, texture[0]);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);////墻1glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,0.0);glTranslatef(75,0,0);glScalef(2,150,150);glRotatef(90, 0, 1, 0);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//墻2glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,0.0);glTranslatef(-75,0,0);glScalef(2,150,150);glRotatef(90,0,1,0);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//墻3glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,0.0);glTranslatef(0,0,-75);glScalef(150,150,2);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//墻4glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,0.0);glTranslatef(-45,0,75);glScalef(60,150,2);glCallList(drawcube);glColor4f(1.0,1.0,1.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//墻5glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,0.0);glTranslatef(45,0,75);glScalef(60,150,2);glCallList(drawcube);glColor4f(1.0,1.0,1.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//墻6glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,0.0);glTranslatef(0,60,75);glScalef(30,30,2);glCallList(drawcube);glColor4f(1.0,1.0,1.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glDisable(GL_TEXTURE_2D);//glPopMatrix();////門貼圖glPushMatrix();//glEnable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D);glShadeModel(GL_SMOOTH);glBindTexture(GL_TEXTURE_2D, texture[1]);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);////門glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1,1,1,0.0);glTranslatef(15,0,85);glScalef(2,90,20);glRotatef(90,0,1,0);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glDisable(GL_TEXTURE_2D);//glPopMatrix();////墻柱貼圖glPushMatrix();//glEnable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D);glShadeModel(GL_SMOOTH);glBindTexture(GL_TEXTURE_2D, texture[2]);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);////墻柱glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,1.0);glTranslatef(75,0,-75);glScalef(10,150,10);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,1.0);glTranslatef(-75,0,-75);glScalef(10,150,10);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,1.0);glTranslatef(75,0,75);glScalef(10,150,10);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,1.0,1.0);glTranslatef(-75,0,75);glScalef(10,150,10);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glDisable(GL_TEXTURE_2D);//glPopMatrix();////樹干貼圖glPushMatrix();//glEnable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D);glShadeModel(GL_SMOOTH);glBindTexture(GL_TEXTURE_2D, texture[3]);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);////樹干glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1,1,1,1.0);glTranslatef(-120,0,120);glScalef(15,120,15);glRotatef(90, 0, 1, 1);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glDisable(GL_TEXTURE_2D);//glPopMatrix();////白 枕頭glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,1.0,0.9,0.0);glTranslatef(-62.5,-7,-67);glScalef(18,5,9);glCallList(drawcube);glColor4f(0.0,1.0,0.0,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//床glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.51,0.40,0.01,0.0);glTranslatef(-70,-15,-70);glScalef(3,10,3);glCallList(drawcube);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.51,0.40,0.01,0.0);glTranslatef(-55,-15,-70);glScalef(3,10,3);glCallList(drawcube);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.51,0.40,0.01,0.0);glTranslatef(-70,-15,-40);glScalef(3,10,3);glCallList(drawcube);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.51,0.40,0.01,0.0);glTranslatef(-55,-15,-40);glScalef(3,10,3);glCallList(drawcube);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();//床板glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.51,0.40,0.01,0.0);glTranslatef(-62.5,-10,-55);glScalef(17,5,32);glCallList(drawcube);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();//紅 被子glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1.0,0.0,0.0,0.0);glTranslatef(-62.5,-7,-50);glScalef(18,5,25);glCallList(drawcube);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//繪制四個桌腿:glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0, 0, 0, 0.0);glTranslatef(20,-10,-20);glScalef(1,20,1);glCallList(drawcube);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0, 0, 0, 0.0);glTranslatef(-20,-10,-20);glScalef(1,20,1);glCallList(drawcube);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0, 0, 0, 0.0);glTranslatef(-20,-10,20);glScalef(1,20,1);glCallList(drawcube);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0, 0, 0, 0.0);glTranslatef(20,-10,20);glScalef(1,20,1);glCallList(drawcube);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//桌面貼圖glPushMatrix();//glEnable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D);glShadeModel(GL_SMOOTH);glBindTexture(GL_TEXTURE_2D, texture[5]);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);////畫出桌面:glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(1,1,1,0);glScalef(50,1,50);glRotatef(90, 1, 0, 0);glCallList(drawcube);glColor4f(0.39,0.30,0.1,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glDisable(GL_TEXTURE_2D);//glPopMatrix();////繪制兩邊臺階;glPushMatrix();//左邊第一級臺階glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.51,0.40,0.2,1.0);glTranslatef(-32,-12,0);glScalef(10,4,50);glCallList(drawcube);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.1,0.50,0.51,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();// 右邊第一級臺階glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.51,0.40,0.2,1.0);glTranslatef(32,-12,0);glScalef(10,4,50);glCallList(drawcube);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.1,0.50,0.51,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();//左邊第二級臺階glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.5,0.40,0.3,0.0);glTranslatef(-34.5,-8,0);glScalef(5,4,50);glCallList(drawcube);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.1,0.50,0.51,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();//右邊第二級臺階glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.5,0.40,0.3,0.0);glTranslatef(34.5,-8,0);glScalef(5,4,50);glCallList(drawcube);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.1,0.50,0.51,0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//桌面上擺放物品,茶壺glPushMatrix();//茶壺glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.1,0.1,0.1,0.0);glTranslatef(0,8,0);glScalef(5,10,5);glCallList(drawteapot);glDisable(GL_COLOR_MATERIAL);glPopMatrix();GLUquadricObj *pObj;glPushMatrix();//第一個杯子 左邊pObj=gluNewQuadric();gluQuadricNormals(pObj,GLU_SMOOTH);glTranslatef(-8,6,-8);glRotatef(90,1,0,0);gluCylinder(pObj, 1.50f, 1.0f,5.0f, 26, 13);glPopMatrix();glPushMatrix(); //第2個杯子 右邊glTranslatef(8,6,8);glRotatef(90,1,0,0);gluCylinder(pObj, 1.50f, 1.0f,5.0f, 26, 13);glPopMatrix();glPushMatrix(); //第3個杯子glTranslatef(-8,6,8);glRotatef(90,1,0,0);gluCylinder(pObj, 1.50f, 1.0f,5.0f, 26, 13);glPopMatrix();glPushMatrix(); //第4個杯子glTranslatef(8,6,-8);glRotatef(90,1,0,0);gluCylinder(pObj, 1.50f, 1.0f,5.0f, 26, 13);glPopMatrix();glPushMatrix(); //桌面上墊圈glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor4f(0.21,0.21,0.21,0.0);pObj= gluNewQuadric();//gluQuadricDrawStyle(pObj3,GLU_LINE);glTranslatef(-8,1,-8);glRotatef(90,1,0,0);gluDisk(pObj, 0.50f, 3.0f, 10, 10);glPopMatrix();glPushMatrix(); //桌面上墊圈pObj = gluNewQuadric();glTranslatef(8,1,8);glRotatef(90,1,0,0);gluDisk(pObj, 0.50f, 3.0f, 30, 30);glPopMatrix();glPushMatrix(); //桌面上墊圈pObj = gluNewQuadric();glTranslatef(-8,1,8);glRotatef(90,1,0,0);gluDisk(pObj, 0.50f, 3.0f, 30, 30);glPopMatrix();glPushMatrix(); //桌面上墊圈pObj = gluNewQuadric();glTranslatef(8,1,-8);glRotatef(90,1,0,0);gluDisk(pObj, 0.50f, 3.0f, 30, 30);glPopMatrix();glPushMatrix(); //月亮glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor3f(1.0,1.0,0.0);//moonglTranslatef(200,180,200);glutSolidSphere(35.0,20,20);glCallList(drawteapot);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//外地面貼圖-樹葉glPushMatrix();//glEnable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D);glShadeModel(GL_SMOOTH);glBindTexture(GL_TEXTURE_2D, texture[6]);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGenfv(GL_S, GL_OBJECT_LINEAR, planes);glTexGenfv(GL_T, GL_OBJECT_LINEAR, planet);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);//glPushMatrix(); //樹葉glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT);glColor3f(0.0,100.0/255,0.0);//leafglTranslatef(-120,90,120);glutSolidSphere(50.0,5,5);glCallList(drawteapot);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glDisable(GL_TEXTURE_2D);//glPopMatrix();//glPushMatrix();//啞鈴球glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT, GL_AMBIENT);glColor3f(0.0,0.0, 0.0);glTranslatef(-62.5, -15, 10);glutSolidSphere(4.0, 12, 10);glCallList(drawteapot);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPushMatrix();//啞鈴球glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT, GL_AMBIENT);glColor3f(0.0, 0.0, 0.0);glTranslatef(-62.5, -15, 30);glutSolidSphere(4.0, 12, 10);glCallList(drawteapot);glDisable(GL_COLOR_MATERIAL);glPopMatrix();//啞鈴棍glPushMatrix();glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT, GL_AMBIENT);glColor4f(0, 0, 0, 1.0);glTranslatef(-62.5, -15, 20);glScalef(1.5, 1.5, 20);glCallList(drawcube);glColor4f(0.0, 1.0, 0.0, 0.0);glutSolidCube(1);glDisable(GL_COLOR_MATERIAL);glPopMatrix();glPopMatrix();glutSwapBuffers(); } void NormalKeysProc(unsigned char key,int x,int y) //退出按鍵 {if(key==27) exit(0); } void SpecialKeys(int key, int x, int y) //按鍵功能 {if (key == GLUT_KEY_LEFT){a += 1.0;glutPostRedisplay();}if (key == GLUT_KEY_RIGHT){a -= 1.0;glutPostRedisplay();}if (key == GLUT_KEY_DOWN){eye -= 0.05;glutPostRedisplay();}if (key == GLUT_KEY_UP){eye += 0.05;glutPostRedisplay();}} void MouseFunc(int button, int state, int x, int y) {switch (state) {case GLUT_UP:switch (button) {case GLUT_LEFT_BUTTON:locate += 5.0;glutPostRedisplay();break;case GLUT_RIGHT_BUTTON:locate -= 5.0;glutPostRedisplay();break;}} } int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(800,600);glutInitWindowPosition(100,100);glutCreateWindow("finally"); init1();glutDisplayFunc(draw);glutReshapeFunc(reshape);glutIdleFunc(draw);glutKeyboardFunc(NormalKeysProc);glutSpecialFunc(SpecialKeys);glutMouseFunc(MouseFunc);glutMainLoop();return 0; }四、實驗結(jié)果與心得
?
本次作業(yè),對模型的坐標值的計算進行放置比較復雜,其次還有賦予材質(zhì)貼圖時也出現(xiàn)了各式各樣的毛病,比如進行一個貼圖的賦予時,就會給整個場景賦予相同的貼圖;之后進行修改代碼,最后可以給每一個模型進行賦予材質(zhì),但也只有幾個面的貼圖鋪張是正確的顯示,目前尚未解決。通過此次大作業(yè),對圖形學中三維可編程繪制流水線已經(jīng)有部分的了解與學習。雖然過程中有各式各樣的困難但也是逐個擊破,對今后的學習也是有了較大的幫助。
?
?
總結(jié)
以上是生活随笔為你收集整理的计算机图形学——大作业的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用RTX51 Tiny系统给串口发送—
- 下一篇: RTX二次开发问题