2018年3月16日 星期五

Week03 璿元

Shapes是什麼?

1. 環境設置

 (a) 從 http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/ 下載 data.zip, windows.zip 及 glut32.dll


 (b) 將 glut32.dll 複製到 windows 資料夾中


2. 打開 windows 資料夾中的 Shapes


3. 在 Command manipulation window (右邊的視窗) 上按右鍵就可以更改顯示的圖形


4. 在每個數值上按住並上下拖曳可以調整數值的大小


5. 在 Screen-space view (左邊的視窗) 上按右鍵 Toggle big vertices 可以將圖形的頂點放大


6. 在 Screen-space view 上按右鍵選 Toggle drawing outlines 可以幫圖形加上邊框


繪製茶壺

1. 依照上禮拜的步驟新增一個 GLUT project

    #include <stdio.h>
    #include <GL/glut.h>

    void display()
   {
       glClear(GL_COLOR_BUFFER_BIT);
       glutSolidTeapot(0.3);
       glutSwapBuffers();
   }

   int main(int argc, char **argv)
   {
       glutInit(&argc, argv);
       glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
       //顯示的參數
       glutCreateWindow("A Teapot");
       glutDisplayFunc(display);
       ///glutMouseFunc(mouse);
       ///glutMotionFunc(motion);
       glutMainLoop();
   }


印出滑鼠點擊的座標及狀態

    #include <stdio.h>
    #include <GL/glut.h>

    void display()
   {
       glClear(GL_COLOR_BUFFER_BIT);
       glutSolidTeapot(0.3);
       glutSwapBuffers();
   }

   void mouse(int button, int state, int x, int y)
   {
       printf("%d %d %d %d\n", button, state, x, y);
       //button: 左, 中, 右鍵
       //state: 按下去/彈起
       //x, y: mouse 的位置
   }

   int main(int argc, char **argv)
   {
       glutInit(&argc, argv);
       glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
       //顯示的參數
       glutCreateWindow("A Teapot");
       glutDisplayFunc(display);
       glutMouseFunc(mouse);
       //呼叫函式 mouse
       ///glutMotionFunc(motion);
       glutMainLoop();
   }


取得圖形每個頂點的座標

1. 在圖形上任意點擊即可將對應的座標印出,mouse 下壓才會記錄
    #include <stdio.h>
    #include <GL/glut.h>

    void display()
   {
       glClear(GL_COLOR_BUFFER_BIT);
       glutSolidTeapot(0.3);
       glutSwapBuffers();
   }

   void mouse(int button, int state, int x, int y)
   {
       if(state == GLUT_DOWN)
       {
           printf("    glVertex2f(%f, %f);\n", (x-150)/150.0, (150-y)/150.0);
       }
   }

   int main(int argc, char **argv)
   {
       glutInit(&argc, argv);
       glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
       //顯示的參數
       glutCreateWindow("A Teapot");
       glutDisplayFunc(display);
       glutMouseFunc(mouse);
       //呼叫函式 mouse
       ///glutMotionFunc(motion);
       glutMainLoop();
   }



2. 將所有點複製貼回程式碼




讓圖形跟著滑鼠移動(一)

1. 移動中是以滑鼠的座標為圖形的中心點,中心點會一直黏著滑鼠
    #include <stdio.h>
    #include <GL/glut.h>
    float teapotX=0, teapotY=0;
    void display()
    {
        glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
        glPushMatrix();
            glTranslatef(teapotX, teapotY, 0);
            glutSolidTeapot(0.3);
        glPopMatrix();
        glutSwapBuffers();
    }
    
    void motion(int x, int y)
    {
        teapotX = (x-150)/150.0;
        //依照 motion 時的 x 來改 terpot 的座標
        teapotY = (150-y)/150.0;
        //依照 motion 時的 y 來改 teapot 的座標
        glutPostRedisplay();
        //重畫畫面
    }
    int main(int argc, char** argv)
    {
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
        glutCreateWindow("Week03 Mouse");
        glutDisplayFunc(display);
        ///glutMouseFunc(mouse);
        glutMotionFunc(motion);
        glutMainLoop();
    }


讓圖形跟著滑鼠移動(二)

1. 移動中是以所點選的位置當作原點來移動,類似 Google Map 的移動

#include <stdio.h>
#include <GL/glut.h>
float teapotX=0, teapotY=0;
//茶壺的座標
int oldX=0, oldY=0;
//紀錄mouse在哪裡按下去
void display()
{
    glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(teapotX, teapotY, 0);
        //依照茶壺的座標移動
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void mouse(int button, int state, int x, int y)
{
    oldX = x;
    oldY = y;
    //紀錄按下去的點在哪裡
}
void motion(int x, int y)
//mouse motion 事件
{
    teapotX += (x-oldX)/150.0;
    teapotY += (oldY-y)/150.0;
    oldX = x;
    oldY = y;
    //紀錄移動後新的位置
    glutPostRedisplay();
}
int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week03 Mouse");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

沒有留言:

張貼留言