資源簡介
試設計一個室內三維環境, 并利用OPENGL展示它的三維效果。要求:(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(“室內三維環境opengl-2015110749“); //創建名為“室內三位環境“的窗口
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.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_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?cd;
for?(i?=?0;?i?128;?i++)?{
for?(j?=?0;?j?128;?j++)?{
c?=?((((i?&?0x10)?==?0)?^?((j?&?0x8))?==?0))?*255;
d?=?((((i?&?0x16)?==?0)?^?((j?&?0x16))?==?0))?*?155;
checkImage[i][j][0]?=?(GLubyte)250;//R
checkImage[i][j][1]?=?(GLubyte)d;//G
checkImage[i][j][2]?=?(GLubyte)c;//B
checkImage[i][j][3]?=?(GLubyte)255;//alpha
}
}
}
//繪制墻壁
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();
glTran
評論
共有 條評論