2016年3月21日 星期一

/Noshiro/移動 - 旋轉 - 交換


到 http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/
下載老師編輯的"data","win32(window系統)",和
"glut32.dll"  將其解壓縮後即可操作一些成品

(A)Translate移動
    Roate旋轉
    Scale大小

先進行移動後旋轉,是移動後才旋轉,就像芭蕾舞
,先到點才旋轉,所以是像在自體旋轉一樣
然後旋轉的時候沒有移動的感覺也沒有遠近




(B)Roate旋轉
    Translate移動
    Scale大小

先旋轉再進行移動,先旋轉角度才進行移動
就像原地圓圈甩尾,車子旋轉向前,
所以有在旋轉的時候有移動遠近的感覺





茶壺旋轉

#include <GL/glut.h>
float rotX=0;//加上X旋轉代數
void display()
{
    glClearColor(1,1,1,1);
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();///記住
        glRotatef(rotX,0,1,0);//設X旋轉
        glColor3f(1,0,0);
        glutSolidTeapot(0.3);
    glPopMatrix();回到初始狀態
    glutSwapBuffers();
}
void motion(int x,int y)//旋轉
{
    rotX=x;
    display();//播放
}
int main(int argc,char**argv)
{
   glutInit(&argc,argv);
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
   glutCreateWindow("HELLO 3D");

   glutDisplayFunc(display);
   glutMotionFunc(motion);

   glutMainLoop();
}
Q1:什麼是glPushMatrix();
                   glPopMatrix();
A1:glPushMatrix()記住自己現在的位置
      glPopMatrix()回到之前記住的位置
Q2:什麼是Buffers?
                 Double?
A2:Buffers指的是緩存器,就像是記憶體
     Double指的是說兩倍的,這裡是說Double_Buffers
     是說有兩倍的記憶體,他會先將畫好的東西先紀錄起來,然後再一次print出來
     效果比較好

加強版remix

#include <GL/glut.h>
float rotX=0,rotY=0;///多加上Y旋轉代數
void display()
{
    glClearColor(1,1,1,1);
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
        glRotatef(rotY,1,0,0);設Y旋轉
        glRotatef(rotX,0,1,0);
        glColor3f(1,0,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void motion(int x,int y)//旋轉
{
    rotX=x;
    rotY=y;
    display();
}
int main(int argc,char**argv)
{
   glutInit(&argc,argv);
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
   glutInitWindowSize(400,400);///設定視窗的大小
   glutInitWindowPosition(400,400);///設定視窗左上角之初始位置
   glutCreateWindow("HELLO 3D");

   glutDisplayFunc(display);
   glutMotionFunc(motion);

   glutMainLoop();
}

回家作業:

可以旋轉了!!!

沒有留言:

張貼留言