1、右键:视角右移三 效果展示四 程序代码#include #include #pragma comment (lib, )#define checkImageWidth 64#define checkImageHeight 64static GLubyte checkImagecheckImageHeightcheckImageWidth4;static GLuint texName;static GLfloat xrot=0;static GLfloat yrot=0;/函数功能:绘制地面纹理图案void makeCheckImage(void) int i, j, c; for (i = 0
2、; i 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; 初始化void SetupRC(void) glEnable(GL_LIGHTING); /启用灯源 glEnable(GL_LIGHT0); /启用0号灯 glShadeMod
3、el(GL_SMOOTH); /设置光滑着色模式 glEnable(GL_DEPTH_TEST); /启用深度测试 glEnable(GL_NORMALIZE); /启用法向量 glClearColor, , , ; /为色彩缓冲区指定用于清除的值 /设置表面材料的属性 GLfloat mat_ambient = ,; GLfloat mat_diffuse = ,; GLfloat mat_specular = ,; GLfloat mat_shininess = ; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); /指定环境泛光的强度 gl
4、Materialfv(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); /用来生成纹理的数量为
5、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_TE
6、XTURE_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, , ; /将变换矩阵与当前矩阵相乘,使原点移动到(参数值坐标) glScaled, , ; /将比例矩阵与当前矩阵相乘,将当前图形沿x,y,z轴分别放大为原来的(参数值)倍 glu
7、tSolidCube; /size=的实心立方体 glPopMatrix(); /矩阵堆栈弹出绘制立方柱体void DrawPillar(void) glTranslated(0, , 0);绘制桌子void DrawTable(void) /绘制桌面 glTranslated, 0, ; DrawPillar(); /绘制桌腿 glTranslated(0, 0, ;绘图void RenderScene(void) GLfloat light_position=, , , ; glLightfv(GL_LIGHT0,GL_POSITION,light_position); /指定0号光源的位
8、置 glMatrixMode(GL_PROJECTION); /对投影矩阵应用随后的矩阵操作 glLoadIdentity(); /将当前的用户坐标系的原点移到了屏幕中心 GLfloat h = ; /窗口的一半高度 glOrtho(-h*64/, h*64/, -h, h, , ; /将当前的可视空间设置为正投影空间:左,右,下,上,近,远。 glMatrixMode(GL_MODELVIEW); /对模型视景矩阵堆栈应用随后的矩阵操作 gluLookAt(2, , 2, 0, , 0, 0, 1, 0); /设置观察坐标系 /开始绘制 glRotatef(xrot, , , ; /旋转轴经
9、过原点,方向为(1,0,0),旋转角度为xrot,方向满足右手定则 glRotatef(yrot, , , ; /旋转轴经过原点,方向为(0,1,0),旋转角度为yrot glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glRotated, , , ; DrawWall(); /绘制一面墙壁 /绘制另一面墙壁 DrawTable(); /绘制桌子 /绘制箱子 glRotated(-100, 0, 1, 0); glutSolidTeapot; /绘制茶壶 glRotated(180, 0, 180, 180); glutSolidToru
10、s, , 25, 50);/绘制手镯 【丝状花环】 glutSolidSphere, 15, 50); /绘制球体 /绘制灯柱 glRotated(190, 180, 200, 270); glutSolidCone, , 30, 25); /绘制圆锥型灯罩 /绘制纹理 glEnable(GL_TEXTURE_2D); /开启纹理 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);/映射方式 glBegin(GL_QUADS); /绘制地面 /绘制四边形并给出当前顶点所对应的纹理坐标 glTexCoord2f, ; glVerte
11、x3f, , ; glEnd(); glDisable(GL_TEXTURE_2D); /关闭纹理 glFlush(); /绘图结果显示到屏幕上处理按键交互信息void SpecialKeys(int key, int x, int y) switch (key) case GLUT_KEY_UP: /上键 xrot += ; break; case GLUT_KEY_DOWN: /下键 xrot -= ; case GLUT_KEY_LEFT: /左键 yrot += ; case GLUT_KEY_RIGHT: /右键 yrot -= ; default: glutPostRedispla
12、y(); /标记当前窗口需要重新绘制改变窗口大小void ChangeSize(int w, int h) GLfloat lightPos = , , , ; GLfloat nRange = ; if (h = 0) h = 1; glViewport(0, 0, w, h); /重新设置屏幕上的窗口大小/后继操作都在投影变换范围内 /设置当前矩阵为单位矩阵 /正交投影 if (w = h) glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange); else glOrtho (-nRange*w/h, nRan
13、ge*w/h, -nRange, nRange, -nRange, nRange); /选择模型观察矩阵 /设置当前矩阵为单位矩阵 glLightfv(GL_LIGHT0, GL_POSITION, lightPos);/重新定义光源void main () glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); /双缓存 glutInitWindowSize(600, 400); /窗口大小 glutInitWindowPosition(300, 100); /窗口位置 glutCreateWindow(xdy room); /创建窗口,名为xdy room SetupRC(); /自定义的初始化函数 glutDisplayFunc(RenderScene); /显示回调函数,用于绘图 glutReshapeFunc(ChangeSize); /处理改变窗口大小 glutSpecialFunc(SpecialKeys); /处理按键交互信息 glutMainLoop(); /让GLUT框架开始运行, 处理交互事件
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2