OpenGL立方体带黑白格格纹理有光照可以鼠标键盘交互c文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用方法:新建一个工程,把以下代码拷贝到类文件里。#include "stdafx.h"
#include
#include
GLfloat light0_pos[4] = {0.00f, 0.00f, 1.00f, 0.0f};
typedef struct materialStruct {
GLfloat ambient[4];
GLfloat diffuse[4];
GLfloat specular[4];
GLfloat shininess;
} materialStruct;
typedef struct lightingStruct {
GLfloat ambient[4];
GLfloat diffuse[4];
GLfloat specular [4];
} lightingStruct;
materialStruct colorCubeMaterials = {
{0.2, 0.2, 0.2, 1.0},
{0.8, 0.8, 0.8, 1.0},
{0.0, 0.0, 0.0, 1.0},
1.0
};
materialStruct brassMaterials = {
{0.33, 0.22, 0.03, 1.0},
{0.78, 0.57, 0.11, 1.0},
{0.99, 0.91, 0.81, 1.0},
27.8
};
materialStruct redPlasticMaterials = {
{0.3, 0.0, 0.0, 1.0},
{0.9, 0.0, 0.0, 1.0},
{0.8, 0.6, 0.6, 1.0},
32.0
};
materialStruct whiteShinyMaterials = {
{1.0, 1.0, 1.0, 1.0},
{1.0, 1.0, 1.0, 1.0},
{1.0, 1.0, 1.0, 1.0},
100.0
};
lightingStruct whiteLighting = {
{0.0, 0.0, 0.0, 1.0},
{1.0, 1.0, 1.0, 1.0},
{1.0, 1.0, 1.0, 1.0}
};
materialStruct *currentMaterials;
lightingStruct *currentLighting;
GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},
{1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0},
{1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}};
GLfloat normals[][3] = {{0.0,0.0,-1.0},{0.0,1.0,0.0},
{-1.0,0.0,0.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0},
{0.0,-1.0,0.0}};
GLfloat colors[][4] = {{1.0,1.0,1.0,1.0}, {1.0,1.0,1.0,1.0}, {1.0,1.0,1.0,1.0}, {1.0,1.0,1.0,1.0}, {1.0,1.0,1.0,1.0},
{1.0,1.0,1.0,1.0}, {1.0,1.0,1.0,1.0}, {1.0,1.0,1.0,1.0}};
void polygon(int a, int b, int c , int d)
{
glBegin(GL_POLYGON);
glColor4fv(colors[a]);
glTexCoord2f(0.0,0.0);
glVertex3fv(vertices[a]);
glColor4fv(colors[b]);
glTexCoord2f(0.0,1.0);
glVertex3fv(vertices[b]);
glColor4fv(colors[c]);
glTexCoord2f(1.0,1.0);
glVertex3fv(vertices[c]);
glColor4fv(colors[d]);
glTexCoord2f(1.0,0.0);
glVertex3fv(vertices[d]);
glEnd();
}
void colorcube(void)
{
glNormal3fv(normals[0]);
polygon(0,3,2,1);
glNormal3fv(normals[1]);
polygon(2,3,7,6);
glNormal3fv(normals[2]);
polygon(0,4,7,3);
glNormal3fv(normals[3]);
polygon(1,2,6,5);
glNormal3fv(normals[4]);
polygon(4,5,6,7);
glNormal3fv(normals[5]);
polygon(0,1,5,4);
}
static GLfloat theta[] = {0.0,0.0,0.0};
static GLint axis = 1;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(theta[0], 1.0, 0.0, 0.0);
glRotatef(theta[1], 0.0, 1.0, 0.0);
glRotatef(theta[2], 0.0, 0.0, 1.0);
colorcube();
glutSwapBuffers();
}
void spinCube()
{
theta[axis] += 0.01;
if( theta[axis] > 360.0 ) theta[axis] -= 360.0;
glutPostRedisplay();
}
void mouse(int btn, int state, int x, int y)
{
if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0;
if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1;
if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2; }