#include "stdafx.h" #include <gl/glut.h> static GLfloat xRot = 0.0f; static GLfloat yRot = 0.0f; // 绘制场景 void RenderScene(void) { //gluPerspective(60,10,1.0,400); // 围绕原子核的旋转角度 static GLfloat fElect1 = 0.0f; //用当前颜色清除窗口 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //重置模型视图矩阵 glMatrixMode(GL_MODELVIEW);//设置矩阵模式为模型视图 glLoadIdentity();//重置坐标系 // 移动整个场景到视图中 // 这是初始的视图转换 glTranslatef(0.0f, 0.0f, -200.0f);//相当于把物体向远处移动200像素! // 设置颜色为红色,绘制椭球(原子核) glColor3ub(255, 0, 0); glutSolidSphere(10.0f, 15, 15); // 黄色电子 glColor3ub(255,255,0); // 第一个电子轨道 // 保存试图转换;仅仅只是保存当前矩阵,并不代表重置坐标 glPushMatrix(); //以下两个函数只是改变了局部坐标的方向与位置,并未改变物体方向与位置,因为此时物体并未绘制; //可以理解为将即将绘制的物体进行了平移和旋转 // 根据一个旋转角度进行旋转;当向量(原点到该点)的头部对着观察者时的逆时针旋转,以局部坐标为基准 glRotatef(fElect1, 0.0f, 1.0f, 0.0f); // 从原点移动到轨道距离 glTranslatef(90.0f, 0.0f, 0.0f); // 绘制电子,该函数内部已指定法线方向,glutWireSphere(参数一样)是线框球体 glutSolidSphere(6.0f, 15, 15);//参数分别是半径,经线条数,纬线条数;后两个代表圆的细分程度 //恢复试图转换 glPopMatrix(); //第二个电子轨道 glPushMatrix(); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glTranslatef(-70.0f, 0.0f, 0.0f); glRotatef(fElect1, 0.0f, 1.0f, 0.0f); //glTranslatef(-70.0f, 0.0f, 0.0f); glutSolidSphere(6.0f, 15, 15); glPopMatrix(); ///???????????? glLoadIdentity(); //??????????????? // 第三个电子轨道 glPushMatrix(); //glRotatef(360.0f-45.0f,0.0f, 0.0f, 1.0f);//使电子之间产生差异,从不同的方向进行环绕 //glRotatef(fElect1, 0.0f, 1.0f, 0.0f); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -6.98880f); glutSolidSphere(6.0f, 15, 15); glLoadIdentity(); glPopMatrix(); // 增加旋转角度 fElect1 += 10.0f; if(fElect1 > 360.0f) fElect1 = 0.0f; // 显示图像 glutSwapBuffers(); } // This function does any needed initialization on the rendering // context. void SetupRC() { glEnable(GL_DEPTH_TEST); // Hidden surface removal glFrontFace(GL_CCW); // Counter clock-wise polygons face out glEnable(GL_CULL_FACE); // Do not calculate inside of jet // Black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); } void SpecialKeys(int key, int x, int y) { if(key == GLUT_KEY_UP) xRot-= 5.0f; if(key == GLUT_KEY_DOWN) xRot += 5.0f; if(key == GLUT_KEY_LEFT) yRot -= 5.0f; if(key == GLUT_KEY_RIGHT) yRot += 5.0f; if(key > 356.0f) xRot = 0.0f; if(key < -1.0f) xRot = 355.0f; if(key > 356.0f) yRot = 0.0f; if(key < -1.0f) yRot = 355.0f; // Refresh the Window glutPostRedisplay(); } void TimerFunc(int value) { glutPostRedisplay(); glutTimerFunc(100, TimerFunc, 1); } void ChangeSize(int w, int h) { //GLfloat nRange = 100.0f; GLfloat fAspect; //防止被零所除 if(h == 0) h = 1; // 把视口设置为窗口大小 glViewport(0, 0, w, h); fAspect=(GLfloat)w/(GLfloat)h; // 重置坐标系统 glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Establish clipping volume (left, right, bottom, top, near, far) /*if (w <= h) glOrtho (-nRange, nRange, nRange*h/w, -nRange*h/w, -nRange*2.0f, nRange*2.0f); else glOrtho (-nRange*w/h, nRange*w/h, nRange, -nRange, -nRange*2.0f, nRange*2.0f); */ //产生透视投影 gluPerspective(60,fAspect,1.0,400); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("OpenGL Atom"); glutReshapeFunc(ChangeSize); glutSpecialFunc(SpecialKeys); glutDisplayFunc(RenderScene); glutTimerFunc(500, TimerFunc, 1); SetupRC(); glutMainLoop(); return 1; }
// 第三个电子轨道
glPushMatrix();
//glRotatef(360.0f-45.0f,0.0f, 0.0f, 1.0f);//使电子之间产生差异,从不同的方向进行环绕
//glRotatef(fElect1, 0.0f, 1.0f, 0.0f);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -6.98880f);
glutSolidSphere(6.0f, 15, 15);
glLoadIdentity();
glPopMatrix();
为什么将设置为-0.6988880f会是下面图片的这个效果,画了一个球,现在显示的效果怎么似一个环了? ,而设置成-7.0时,显示的全是黄颜色。为什么不是-1.0时,全是黄颜色? 该怎么理解OpenGL坐标呢?
环的问题是由于代码的作用: glEnable(GL_CULL_FACE); //do not calculate inside of jet