#include <gl/glut.h>
#define imageWidth 64
#define imageHeight 64
static GLubyte image[imageWidth][imageHeight][4];
static GLuint texName;
/*绘制一个简单的二维纹理图*/
void makeImage(void)
{
int i,j,c;
/*根据点的位置设置不同的颜色*/
for(i = 0;i < imageWidth;i++)
{
for(j = 0;j <imageHeight;j++)
{
c=((((i&0x8)==0)^((j&0x8))==0))*255;
image[i][j][0] = (GLubyte)c;
image[i][j][1] = (GLubyte)c;
image[i][j][2] = (GLubyte)c;
image[i][j][3] = (GLubyte)255;
}
}
}
void Initial(void) //初始化窗口
{
glEnable(GL_DEPTH_TEST);
glClearColor(1.0f, 1.0f, 0.5f, 1.0f); // 设置窗口颜色为蓝色
makeImage();
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glGenTextures(1,&texName);
glBindTexture(GL_TEXTURE_1D,texName);
/*设置纹理参数*/
//glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_1D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
/*指定二维纹理映射*/
glTexImage1D(GL_TEXTURE_1D,0,GL_RGBA,imageWidth,0,GL_RGB,GL_UNSIGNED_BYTE,image);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_1D);
glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glMaterialf(GL_FRONT,GL_SHININESS,64.0);
glShadeModel(GL_FLAT);
}
void ChangeSize(GLsizei w, GLsizei h) // 窗口大小改变时调用的登记函数
{ if(h == 0) h = 1;
glViewport(0, 0, w, h); // 设置视区尺寸
glMatrixMode(GL_PROJECTION); // 重置坐标系统
glLoadIdentity();
GLfloat fAspect;
fAspect=(float)w/(float)h;
gluPerspective(45.0,fAspect,0.5,5000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void Display(void)
{
static float fElect1=0.0f; //绕原子转动的角度
/*
GLfloat mat_ambient[]={0.2f,0.2f,0.2f,1.0f};
GLfloat mat_diffuse[]={0.8f,0.8f,0.8f,1.0f};
GLfloat mat_specular[]={1.0f,1.0f,1.0f,1.0f};
GLfloat mat_shininess[]={50.0f};
GLfloat mat_ambient2[]={0.2f,0.4f,0.2f,1.0f};
GLfloat mat_diffuse2[]={0.4f,0.4f,0.4f,1.0f};
GLfloat mat_specular2[]={1.0f,1.0f,1.0f,1.0f};
GLfloat mat_shininess2[]={30.0f};
GLfloat light0_diffuse[]={0.0f,0.0f,1.0f,1.0f};
GLfloat light0_position[]={1.0f,1.0f,1.0f,0.0f};
GLfloat light1_ambient[]={0.2f,0.2f,0.2f,1.0f};
GLfloat light1_diffuse[]={1.0f,0.0f,0.0f,1.0f};
GLfloat light1_specular[]={1.0f,0.6f,0.6f,1.0f};
GLfloat light1_position[]={-3.0f,-3.0f,-3.0f,1.0f};
GLfloat spot_direction[]={1.0f,1.0f,1.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);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light0_diffuse);
glLightfv(GL_LIGHT0,GL_POSITION,light0_position);
glLightfv(GL_LIGHT1,GL_AMBIENT,light1_ambient);
glLightfv(GL_LIGHT1,GL_DIFFUSE,light1_diffuse);
glLightfv(GL_LIGHT1,GL_SPECULAR,light1_specular);
glLightfv(GL_LIGHT1,GL_POSITION,light1_position);
glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,30.0);
glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spot_direction);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_DEPTH_TEST);
*/
// glClearColor(1.0f, 1.0f, 0.5f, 1.0f); // 设置窗口颜色为蓝色
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除颜色和深度缓冲区
glMatrixMode(GL_MODELVIEW); //指定当前操作模型视图矩阵堆栈
glLoadIdentity(); //重置模型视图矩阵
//保证当前的模型视图矩阵
glTranslatef(0.0f,0.0f,-250.0f);//将图形沿Z轴负向移动
glPushMatrix();
glColor3f(0.0f,1.0f,0.0f);
glRotatef(fElect1,0.0f,1.0f,0.0f);
glBindTexture(GL_TEXTURE_1D,texName);
//glutSolidSphere(2.0f,30,30);
glutSolidSphere(20.0f,30,30); //绘制红绿色的原子
glPopMatrix(); //恢复模型视图矩阵
// glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient2);
// glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse2);
// glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular2);
// glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess2);
glColor3f(1.0f,0.0f,1.0f);
glPushMatrix(); //保证当前的模型视图矩阵
glRotatef(fElect1,0.0f,1.0f,0.0f); //绕Y轴旋转一定的角度
glTranslatef(90.0f,0.0f,0.0f); //平移一定的距离
glutSolidSphere(6.0f,30,30); //画出第一个电子
glPopMatrix(); //恢复模型视图矩阵
glPushMatrix(); //保存当前的模型视图矩阵
glRotatef(45.0f,0.0f,0.0f,1.0f); //绕Z轴旋转45度
glRotatef(fElect1,0.0f,1.0f,0.0f);
glTranslatef(-70.0f,0.0f,0.0f);
glutSolidSphere(6.0f,30,30); //画出第二个电子
glPopMatrix(); //恢复模型视图矩阵
glPushMatrix(); //保存当前的模型视图矩阵
glRotatef(-45.0f,0.0f,0.0f,1.0f); //绕Z轴旋转-45度
glRotatef(fElect1,1.0f,1.0f,0.0f);
glTranslatef(0.0f,0.0f,60.0f);
glutSolidSphere(6.0f,30,30); //画出第三个电子
glPopMatrix();
fElect1+=10.0f;
if(fElect1>360.0f) fElect1=10.0f;
glutSwapBuffers();
}
void TimerFunc(int value) //设置时间回调函数
{ glutPostRedisplay();
glutTimerFunc(100, TimerFunc,1);//100毫秒后调用定时器回调函数
}
int main(int argc, char* argv[])
{ glutInit(&argc, argv); //初始化GLUT库OpenGL窗口的显示模式
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
//窗口使用RGB颜色,双缓存和深度缓存
glutInitWindowSize(512,512);
glutCreateWindow("分子动画");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(Display);
glutTimerFunc(500, TimerFunc, 1); //指定定时器回调函数
Initial(); // 窗口初始化
glutMainLoop(); //启动主GLUT事件处理循环
return 0;
}