旋转典型列子讲解

#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <math.h>

 

// Rotation amounts
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;


// Called to draw scene
void RenderScene(void)
 {
 // Angle of revolution around the nucleus
 static float fElect1 = 0.0f;   

 // Clear the window with current clearing color
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 // Reset the modelview matrix
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();

 // Translate the whole scene out and into view 
 // This is the initial viewing transformation
 glTranslatef(0.0f, 0.0f, -100.0f); 

 // Red Nucleus
 glColor3f(255, 0, 0);
 glutSolidSphere(10.0f, 15, 15);

 // Yellow Electrons
 glColor3ub(255,255,0);

 // First Electron Orbit
 // Save viewing transformation
 glPushMatrix();

 // Rotate by angle of revolution
 //glRotatef(fElect1, 0.0f, 1.0f, 0.0f);

 // Translate out from origin to orbit distance
 glTranslatef(90.0f, 0.0f, 0.0f);

 // Draw the electron
 glutSolidSphere(6.0f, 15, 15);
   

 // Restore the viewing transformation
 glPopMatrix();

 // Second Electron Orbit
 glPushMatrix();
  glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
    glRotatef(fElect1, 0.0f, 0.0f, 1.0f);
 glTranslatef(-70.0f, 0.0f, 0.0f);
 glutSolidSphere(6.0f, 15, 15);
 glPopMatrix();


 // Third Electron Orbit
 glPushMatrix();
// glRotatef(360.0f-45.0f,0.0f, 0.0f, 1.0f);
 glRotatef(fElect1, 0.0f, 1.0f, 0.0f);
 glTranslatef(0.0f, 0.0f, 60.0f);
 glutSolidSphere(6.0f, 15, 15);
 glPopMatrix();


 // Increment the angle of revolution
 fElect1 += 10.0f;
 if(fElect1 > 360.0f)
  fElect1 = 0.0f;

 // Show the image
 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;

 // Prevent a divide by zero
 if(h == 0)
  h = 1;

 // Set Viewport to window dimensions
    glViewport(0, 0, w, h);


 // Reset coordinate system
 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);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
   }

int main(int argc, char* argv[])
 {
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
 glutCreateWindow("OpenGL Atom");
 glutReshapeFunc(ChangeSize);
 glutSpecialFunc(SpecialKeys);
 glutDisplayFunc(RenderScene);
    glutTimerFunc(500, TimerFunc, 1);
 SetupRC();
 glutMainLoop();

 return 0;
 }

 

其中红色在glpushmatrix()和glpopmatrix()中的部分如果改变不会使其他glpushmatrix()和glpopmatrix()中的部分受到影响,在glpushmatrix()和glpopmatrix()调用glrotatef会使坐标系发生改变,但是也不会影响其他glpushmatrix()和glpopmatrix()中的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值