2014年5月1日 星期四

可愛的旋轉茶壺












先劃出一個茶壺

加上打光的程式碼 複製貼上
     const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };
     glEnable(GL_LIGHT0);
     glEnable(GL_NORMALIZE);
     glEnable(GL_COLOR_MATERIAL);
     glEnable(GL_LIGHTING);   
     glLightfv(GL_LIGHT0, GL_POSITION, light_position);
最後在最後面加上
        myLight();
即可跑出立體的茶壺

void keyboard(unsigned char key, int x, int y)
{
     printf("%c %d %d\n", key, x, y);
     if(key=='a') angleX+=3;
     if(key=='b') angleX-=3;
     glutPostRedisplay();
         
}這段keyboard的程式碼改成
void mouse(int button, int state, int x, int y)
{
     printf("%d %d %d %d\n", button, state, x, y);
     startX=x;    
}
void motion(int x, int y)
{
     printf("%d %d\n", x, y);
     angleX= x -startX;
     glutPostRedisplay();    
}
用滑鼠在動
上面的函數加上一個startX=0.
以及最後面把//glutKeyboardFunc(keyboard);
改成
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
即可用滑鼠左右移動控制茶壺

加入y軸的函數
float angleY=0, startY=0;
再將
void mouse(int button, int state, int x, int y)
void motion(int x, int y)
void display()
中加入y
即可上下旋轉
最後
前面函數多加一個
float m[16] = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
再將void display()
glRotatef(angleX, 0,-1,0);
glRotatef(angleY, -1,0,0);
改成
float dist = sqrt(angleX*angleX + angleY*angleY);
glRotatef( dist, -angleY ,-angleX, 0);
glMultMatrixf(m);
glGetFloatv(GL_MODELVIEW_MATRIX ,m);
angleX = x - startX; startX=x;
angleY = y - startY; startY=y;
原本為+=的地方改成=
運算即可變得較簡單  不會因為每次轉動而累積
大功告成!!



沒有留言:

張貼留言