2018年3月17日 星期六

Week 03 宋侑恩

Week 03 - Part 1 - 使用Shape來看繪製圖形

登入facebook從社團中老師的PO文取得網址 : http://jsyeh.org/3dcg10


下載 data.zip、windows.zip、glut32.dll 三個檔案


將windows.zip解壓縮


接著將剛剛下載下來的glut32.dll複製


貼到剛剛解完壓縮的windows資料夾


接著打開Shape.exe就可以看到各種繪製圖形


在右邊程式碼的區塊按下滑鼠右鍵,可以選擇不同的繪製圖形
    (1)在程式碼區塊可以透過按著滑鼠左鍵上下調整來控制顏色和位置


在左邊圖形的區塊按下滑鼠右鍵,可以選擇切換成大頂點或者讓圖形有外框
    (1) Toggle big vertices - 切換成大頂點
    (2) Toggle drawing outlines - 切換成讓圖形有外框


Toggle big vertices - 切換成大頂點(如圖用紅色框起來的部分)


Toggle drawing outlines - 切換成讓圖形有外框(如圖紅色箭頭指向的框線)


Week 03 - Part 2-1 - mouse() 滑鼠事件

先開啟一個GLUT,繪製一個茶壺,並打上等一下會用到的程式碼

#include <stdio.h>
#include <GL/glut.h>///整套GLUT外掛
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glutSwapBuffers();///搭配GLUT_DOUBLE兩倍顯示
}
int main (int argc,char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);///兩個顯示參數
    glutCreateWindow("Week03 Mouse");

    glutDisplayFunc(display);
    ///glutMouseFunc(mouse);///等一下會有mouse()滑鼠事件
    ///glutMotionFunc(motion);///等一下會有mouse()滑鼠motion事件
    glutMainLoop();
}


將mouse滑鼠事件的函式程式碼加上

#include <stdio.h>
#include <GL/glut.h>///整套GLUT外掛
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glutSwapBuffers();///搭配GLUT_DOUBLE兩倍顯示
}
void mouse(int button,int state,int x,int y)
{///button:左、中、右鍵,state:按下去、彈起來,x,y:mouse的位置
    printf("button:%d,state:%d,x:%d,y:%d\n",button,state,x,y);
}
int main (int argc,char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);///兩個顯示參數
    glutCreateWindow("Week03 Mouse");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);///mouse()滑鼠事件
    ///glutMotionFunc(motion);///等一下會有mouse()滑鼠motion事件
    glutMainLoop();
}

下圖為執行程式碼後的截圖,由紅色框起來的部分可以得知
    (1)button:左鍵為0,中鍵(滑鼠滾輪)為1,右鍵為2
    (2)state:按下去為0,彈起來為1
    (3)x,y:位置所在



Week 03 - Part 2-2 - 利用滑鼠點下來看頂點的程式碼

#include <stdio.h>
#include <GL/glut.h>///整套GLUT外掛
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glutSwapBuffers();///搭配GLUT_DOUBLE兩倍顯示
}
void mouse(int button,int state,int x,int y)
{///button:左、中、右鍵,state:按下去、彈起來,x,y:mouse的位置
    if(state==GLUT_DOWN) printf("glVertex2f(%f, %f);\n",(x-150)/150.0,(150-y)/150.0);
    ///如果滑鼠按下去,將頂點x,y的位置印出來
}
int main (int argc,char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);///兩個顯示參數
    glutCreateWindow("Week03 Mouse");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);///mouse()滑鼠事件
    ///glutMotionFunc(motion);///等一下會有mouse()滑鼠motion事件
    glutMainLoop();
}

下圖為程式碼執行後的截圖,由紅色框起來的部分可得到茶壺頂點的程式碼




Week 03 - Part 3 - mouse() 滑鼠motion事件

將mouse()函示裡的程式碼刪掉或者註解掉,加上今天的重點motion()函式

#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 mouse(int button,int state,int x,int y)
{
    
}
void motion(int x,int y)
{
    teapotX=(x-150)/150.0; teapotY=(150-y)/150.0;///依照motion時的x,y來改teapot的座標
    glutPostRedisplay();///讀3M Post便利貼,貼出來說,有空時記得要Redisplay()
}
int main (int argc,char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week03 Mouse");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);///mouse()滑鼠motion事件
    glutMainLoop();
}

下圖為程式碼執行後的截圖,可以看到茶壺的位置可以移動






沒有留言:

張貼留言