資源簡介
設計一個室內三維環境, 并利用OPEN GL展示它的三維效果。要求:
(1)包含基本的實體元素:球、多面體、錐體、柱體、曲面等;
(2)有全局光照效果和紋理功能;
(3)程序具有交互功能。
代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#define?checkImageWidth?64
#define?checkImageHeight?64
static?GLubyte?checkImage[checkImageHeight][checkImageWidth][4];
static?GLuint?texName;
static?GLfloat?xrot=0;
static?GLfloat?yrot=0;
//函數功能:繪制地面紋理圖案
void?makeCheckImage(void)
{
int?i?j?c;
for?(i?=?0;?i? for?(j?=?0;?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?SetupRC(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); //鏡面反射光的會聚強度
//紋理
makeCheckImage(); //繪制地面紋理圖案
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?checkImageWidth
checkImageHeight?0?GL_RGBA?GL_UNSIGNED_BYTE?checkImage);
}
//函數功能:繪制墻壁
void?DrawWall(void)
{
glPushMatrix();
glTranslated(1.2?0.01?1.2);
glScaled(2.4?0.02?2.4);
glutSolidCube(1.0);
glPopMatrix();
}
//函數功能:繪制立方柱體
void?DrawPillar(void)
{
glPushMatrix();
glTranslated(0?0.15?0);
glScaled(0.02?0.3?0.02);
glutSolidCube(1.0);
glPopMatrix();
}
//函數功能:繪制桌子
void?DrawTable(void)
{
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(); //繪制桌腿
glPopMatrix();
}
//函數功能:繪圖
void?RenderScene(void)
{
//設置光源屬性
GLfloat?light_position[]={2.0f?6.0f?3.0f?0.0f};
glLightfv(GL_LIGHT0GL_POSITIONlight_position);
glMatrixMode(GL_PROJECTION);//后繼操作都在投影變換范圍內
glLoadIdentity(); //設置當前矩陣為單位矩陣
???
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????7331??2010-06-23?20:09??My?Indoor2.cpp
?????文件???????6885??2010-06-22?02:10??My?Indoor.cpp
-----------?---------??----------?-----??----
????????????????14216????????????????????2
評論
共有 條評論