OpenGL室內(nèi)三維環(huán)境北郵計算機(jī)圖形學(xué)作業(yè)_第1頁
OpenGL室內(nèi)三維環(huán)境北郵計算機(jī)圖形學(xué)作業(yè)_第2頁
OpenGL室內(nèi)三維環(huán)境北郵計算機(jī)圖形學(xué)作業(yè)_第3頁
OpenGL室內(nèi)三維環(huán)境北郵計算機(jī)圖形學(xué)作業(yè)_第4頁
OpenGL室內(nèi)三維環(huán)境北郵計算機(jī)圖形學(xué)作業(yè)_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 計算機(jī)圖形學(xué)第二次作業(yè) 姓 名: 學(xué)號: 學(xué) 院: 任課教師: 一 設(shè)計要求試設(shè)計一個室內(nèi)三維環(huán)境,并利用OPEN GL展示它的三維效果。要求:(1) 包含基本的實(shí)體元素:球,多面體,椎體,柱體,曲面等;(2) 有全局光照和紋理功能(3) 程序具有交互功能二交互說明鍵盤的4個按鍵:上鍵:視角上移下鍵:視角下移左鍵:視角左移右鍵:視角右移三 效果展示四 程序代碼#include <stdlib.h>#include <stdio.h>#include "glew.h"#include "glut.h"#include <wi

2、ndows.h>#pragma comment (lib, "glew32.lib")#define checkImageWidth 64#define checkImageHeight 64static GLubyte checkImagecheckImageHeightcheckImageWidth4;static GLuint texName;static GLfloat xrot=0;static GLfloat yrot=0;/函數(shù)功能:繪制地面紋理圖案void makeCheckImage(void)int i, j, c;for (i = 0; i &l

3、t; checkImageHeight; i+) for (j = 0; j < checkImageWidth; j+) c = (i&0x16)=0)(j&0x16)=0)*255;checkImageij0 = (GLubyte) c;checkImageij1 = (GLubyte) c;checkImageij2 = (GLubyte) c;checkImageij3 = (GLubyte) 255;/函數(shù)功能:初始化void SetupRC(void)glEnable(GL_LIGHTING);/啟用燈源glEnable(GL_LIGHT0);/啟用0號燈gl

4、ShadeModel(GL_SMOOTH); /設(shè)置光滑著色模式glEnable(GL_DEPTH_TEST);/啟用深度測試glEnable(GL_NORMALIZE);/啟用法向量glClearColor(1.0f, 1.0f, 1.0f, 0.0f); /為色彩緩沖區(qū)指定用于清除的值/設(shè)置表面材料的屬性GLfloat mat_ambient = 0.6f,0.6f,0.6f,1.0f;GLfloat mat_diffuse = 0.5f,0.5f,0.5f,1.0f;GLfloat mat_specular = 1.0f,1.0f,1.0f,1.0f,;GLfloat mat_shini

5、ness = 40.0f;glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);/指定環(huán)境泛光的強(qiáng)度 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);/漫反射的強(qiáng)度glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);/鏡面反射的強(qiáng)度glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);/鏡面反射光的會聚強(qiáng)度/紋理makeCheckImage();/繪制地面紋理圖案glPixelStorei(GL_UNPACK

6、_ALIGNMENT, 1);/控制像素存儲模式glGenTextures(1, &texName);/用來生成紋理的數(shù)量為1glBindTexture(GL_TEXTURE_2D, texName);/綁定紋理/紋理濾波,圖象從紋理圖象空間映射到幀緩沖圖象空間glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_M

7、AG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth,checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);/函數(shù)功能:繪制墻壁void DrawWall(void)glPushMatrix(); /矩陣堆棧壓入glTranslated(1.2, 0.01, 1.2); /將變換矩陣與當(dāng)前矩陣相乘

8、,使原點(diǎn)移動到(參數(shù)值坐標(biāo)) glScaled(2.4, 0.02, 2.4); /將比例矩陣與當(dāng)前矩陣相乘,將當(dāng)前圖形沿x,y,z軸分別放大為原來的(參數(shù)值)倍glutSolidCube(1.0); /size=1.0的實(shí)心立方體glPopMatrix(); /矩陣堆棧彈出/函數(shù)功能:繪制立方柱體void DrawPillar(void)glPushMatrix();glTranslated(0, 0.15, 0);glScaled(0.02, 0.3, 0.02);glutSolidCube(1.0);glPopMatrix();/函數(shù)功能:繪制桌子void DrawTable(void)

9、glPushMatrix();glTranslated(0.05, 0.3, 0.05);glScaled(0.6, 0.02, 0.6);glutSolidCube(1.0);/繪制桌面glPopMatrix();glPushMatrix();glTranslated(0.275, 0, 0.275);DrawPillar();/繪制桌腿glTranslated(0, 0, -0.45);DrawPillar();/繪制桌腿glTranslated(-0.45, 0, 0.45);DrawPillar();/繪制桌腿glTranslated(0, 0, -0.45);DrawPillar()

10、;/繪制桌腿glPopMatrix();/函數(shù)功能:繪圖void RenderScene(void)GLfloat light_position=2.0f, 6.0f, 3.0f, 0.0f;glLightfv(GL_LIGHT0,GL_POSITION,light_position); /指定0號光源的位置glMatrixMode(GL_PROJECTION); /對投影矩陣應(yīng)用隨后的矩陣操作glLoadIdentity(); /將當(dāng)前的用戶坐標(biāo)系的原點(diǎn)移到了屏幕中心 GLfloat h = 1.0; /窗口的一半高度glOrtho(-h*64/48.0, h*64/48.0, -h, h,

11、 0.1, 100.0); /將當(dāng)前的可視空間設(shè)置為正投影空間:左,右,下,上,近,遠(yuǎn)。glMatrixMode(GL_MODELVIEW); /對模型視景矩陣堆棧應(yīng)用隨后的矩陣操作 glLoadIdentity();gluLookAt(2, 1.6, 2, 0, 0.2, 0, 0, 1, 0);/設(shè)置觀察坐標(biāo)系 /開始繪制glRotatef(xrot, 1.0f, 0.0f, 0.0f);/旋轉(zhuǎn)軸經(jīng)過原點(diǎn),方向?yàn)?1,0,0),旋轉(zhuǎn)角度為xrot,方向滿足右手定則glRotatef(yrot, 0.0f, 1.0f, 0.0f); /旋轉(zhuǎn)軸經(jīng)過原點(diǎn),方向?yàn)?0,1,0),旋轉(zhuǎn)角度為yrot

12、 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();glRotated(90.0, 0.0, 0.0, 1.0);DrawWall();/繪制一面墻壁 glPopMatrix();glPushMatrix();glRotated(-90.0, 1.0, 0.0, 0.0);DrawWall();/繪制另一面墻壁glPopMatrix();glPushMatrix();glTranslated(0.4, 0, 0.4);DrawTable();/繪制桌子glPopMatrix();glPushMatrix();gl

13、Translated(0.2, 0.1, 0.85);glScaled(0.8, 0.8, 1.0);glutSolidCube(0.2);/繪制箱子glPopMatrix();glPushMatrix();glTranslated(0.6, 0.38, 0.6);glRotated(-100, 0, 1, 0);glutSolidTeapot(0.1);/繪制茶壺glPopMatrix();glPushMatrix();glTranslated(0.3, 0.33, 0.5);glRotated(180, 0, 180, 180);glutSolidTorus(0.02f, 0.05, 25

14、, 50);/繪制手鐲 【絲狀花環(huán)】glPopMatrix();glPushMatrix();glTranslated(0.45, 0.42, 0.3);glutSolidSphere(0.1, 15, 50);/繪制球體glPopMatrix();glPushMatrix();glTranslated(1.0, 0.35, 0.3);glScaled(0.03, 0.7, 0.03);glutSolidCube(1.0);/繪制燈柱glPopMatrix();glPushMatrix();glTranslated(1.0, 0.7, 0.3);glRotated(190, 180, 200,

15、 270);glutSolidCone(0.15, 0.25f, 30, 25);/繪制圓錐型燈罩glPopMatrix();/繪制紋理glEnable(GL_TEXTURE_2D);/開啟紋理glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);/映射方式glBegin(GL_QUADS);/繪制地面/繪制四邊形并給出當(dāng)前頂點(diǎn)所對應(yīng)的紋理坐標(biāo)glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0);glTexCoord2f(0.0, 1.0); glVertex3f(0.0, 0.0, 2.

16、4);glTexCoord2f(1.0, 1.0); glVertex3f(2.4, 0.0, 2.4);glTexCoord2f(1.0, 0.0); glVertex3f(2.4, 0.0, 0.0);glEnd();glDisable(GL_TEXTURE_2D);/關(guān)閉紋理glFlush();/繪圖結(jié)果顯示到屏幕上/函數(shù)功能:處理按鍵交互信息void SpecialKeys(int key, int x, int y)switch (key) case GLUT_KEY_UP:/上鍵xrot += 1.0;break;case GLUT_KEY_DOWN:/下鍵xrot -= 1.0;

17、break;case GLUT_KEY_LEFT:/左鍵yrot += 1.0;break;case GLUT_KEY_RIGHT:/右鍵yrot -= 1.0;break;default:break;glutPostRedisplay();/標(biāo)記當(dāng)前窗口需要重新繪制glFlush();/繪圖結(jié)果顯示到屏幕上/函數(shù)功能:改變窗口大小void ChangeSize(int w, int h)GLfloat lightPos = -50.f, 50.0f, 100.0f, 1.0f;GLfloat nRange = 1.9f;if (h = 0)h = 1;glViewport(0, 0, w,

18、h);/重新設(shè)置屏幕上的窗口大小glMatrixMode(GL_PROJECTION);/后繼操作都在投影變換范圍內(nèi)glLoadIdentity();/設(shè)置當(dāng)前矩陣為單位矩陣/正交投影if (w <= h) glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);else glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);glMatrixMode(GL_MODELVIEW);/選擇模型觀察矩陣glLoadIdentity();/設(shè)置當(dāng)前矩陣為單位矩陣glLightfv(GL_LIGHT0, GL_POSITION, lightPos);/重新定義光源void main ()glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);/雙緩存glutInit

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論