資源簡介
綜合練習
試設計一個室內三維環境, 并利用OPEN GL展示它的三維效果。要求:
(1)包含基本的實體元素:球、多面體、錐體、柱體、曲面等;
(2)有全局光照效果和紋理功能;
(3)程序具有交互功能.

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
static?GLubyte?checkImage[128][128][4];
static?GLuint?texName;
static?GLfloat?xrot=0;
static?GLfloat?yrot=0;
void?Initial(void); //初始化
void?floor(void); //繪制地面紋理
void?table(void); //繪制桌子
void?chair(void); //繪制椅子
void?wall(void); //繪制墻壁
void?pillar(void); //繪制柱體
void?keyboard(int?key?int?x?int?y); //處理鍵盤輸入,用于交互
void?sizeChange(int?w?int?h); //改變窗口大小
void?build(void); //構建室內三維模型
//主函數
void?main?()
{
glutInitDisplayMode(GLUT_SINGLE?|?GLUT_RGB?|?GLUT_DEPTH);
glutInitWindowSize(960?720); //設置窗口大小
????glutInitWindowPosition(500?100); //設置窗口位置
glutCreateWindow(“室內三維環境“); //創建名為“室內三位環境“的窗口
Initial();
glutDisplayFunc(build); //構建模型
glutReshapeFunc(sizeChange); //處理窗口大小變化
glutSpecialFunc(keyboard); //處理按鍵交互信息
glutMainLoop(); //處理交互事件
}
//初始化
void?Initial(void)
{
glEnable(GL_LIGHTING); //啟動光源
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST); //刪除隱藏的表面
glEnable(GL_NORMALIZE); //將陰影向量正則化
glClearColor(1.0f?1.0f?1.0f?0.0f);
//設置表面材料的屬性
GLfloat?mat_ambient[]?=?{0.6f0.6f0.6f1.0f};
GLfloat?mat_diffuse[]?=?{0.5f0.5f0.5f1.0f};
GLfloat?mat_specular[]?=?{1.0f1.0f1.0f1.0f};
GLfloat?mat_shininess[]?=?{40.0f};
glMaterialfv(GL_FRONT?GL_AMBIENT?mat_ambient); //指定環境泛光的強度
????glMaterialfv(GL_FRONT?GL_DIFFUSE?mat_diffuse); //漫反射的強度
glMaterialfv(GL_FRONT?GL_SPECULAR?mat_specular); //鏡面反射的強度
glMaterialfv(GL_FRONT?GL_SHININESS?mat_shininess); //鏡面反射光的會聚強度
floor(); //繪制地面紋理圖案
glPixelStorei(GL_UNPACK_ALIGNMENT?1); //控制像素存儲模式
glGenTextures(1?&texName); //生成紋理的數量為1
glBindTexture(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_MAG_FILTER?GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D?GL_TEXTURE_MIN_FILTER?GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D?0?GL_RGBA?128
128?0?GL_RGBA?GL_UNSIGNED_BYTE?checkImage);
}
//繪制地面紋理圖案
void?floor(void)
{
int?i?j?c;
for?(i?=?0;?i?128;?i++)?{
for?(j?=?0;?j?128;?j++)?{
c?=?((((i&0x16)==0)^((j&0x16))==0))*255;
checkImage[i][j][0]?=?(GLubyte)?c;
checkImage[i][j][1]?=?(GLubyte)?c;
checkImage[i][j][2]?=?(GLubyte)?c;
checkImage[i][j][3]?=?(GLubyte)?255;
}
}
}
//繪制墻壁
void?wall(void)
{
glPushMatrix();
glTranslated(1.2?0.01?1.2);
glScaled(2.4?0.02?2.4);
glutSolidCube(1.0);
glPopMatrix();
}
//繪制立方柱體
void?pillar(void)
{
glPushMatrix();
glTranslated(0?0.15?0);
glScaled(0.02?0.3?0.02);
glutSolidCube(1.0);
glPopMatrix();
}
//繪制桌子
void?table(void)
{
//繪制桌面
glPushMatrix();
glTranslated(0.05?0.27?0.05);
glScaled(0.6?0.02?0.6);
glutSolidCube(1.0);
glPopMatrix();
//繪制桌腿
glPushM
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????7189??2014-06-02?12:57??3D_Indoor\3D_Indoor.cpp
?????文件???????4320??2014-06-02?12:41??3D_Indoor\3D_Indoor.dsp
?????文件????????524??2014-06-02?12:37??3D_Indoor\3D_Indoor.dsw
?????文件??????41984??2014-06-02?12:58??3D_Indoor\3D_Indoor.ncb
?????文件??????53760??2014-06-02?12:58??3D_Indoor\3D_Indoor.opt
?????文件???????1442??2014-06-02?12:57??3D_Indoor\3D_Indoor.plg
?????文件?????196674??2014-06-02?12:57??3D_Indoor\Debug\3D_Indoor.exe
?????文件?????239796??2014-06-02?12:57??3D_Indoor\Debug\3D_Indoor.ilk
?????文件??????27226??2014-06-02?12:57??3D_Indoor\Debug\3D_Indoor.obj
????I.A....???3683820??2014-06-02?12:56??3D_Indoor\Debug\3D_Indoor.pch
?????文件?????476160??2014-06-02?12:57??3D_Indoor\Debug\3D_Indoor.pdb
?????文件?????132096??2014-06-02?12:57??3D_Indoor\Debug\vc60.idb
?????文件??????77824??2014-06-02?12:57??3D_Indoor\Debug\vc60.pdb
?????目錄??????????0??2014-06-02?12:57??3D_Indoor\Debug
?????目錄??????????0??2014-06-02?12:58??3D_Indoor
-----------?---------??----------?-----??----
??????????????4942815????????????????????15
- 上一篇:高并發撮合系統
- 下一篇:籃球24S定時的verilog程序
評論
共有 條評論