2018年3月30日 星期五

week05-李紹銘


(1) 使用程式觀察轉動

1. 使用下列三個檔案開啟Transformation.exe,方法可以參照前幾周。













2. 開啟程式之後,可以點擊右鍵切換功能,左邊的數字可以用滑鼠上下拉動調整數值


















3.  利用程式觀察T-R-T轉動


















先轉動,再把整個轉動的物體做移動,可以看做成是自轉



先把整個物體做移動,再做轉動,可以看做成是公轉


(2) 用GLUT了解T-R-T轉動

1. 使用codeblocks開啟GLUT專案,開始方式可以參照前幾周













2.  將左上角的球移動到畫面正中央,至於為什麼是(0,0,-6)是因為camera設定的關係,
     所以要移動到-6才能看到圖形













3. 將畫面正中央的球向Z軸轉動,再向X軸轉動60度,接著把整個轉動的球移動到畫面
    左上方,並且將其他的圖形變成沒有顏色,這種轉動屬於自轉
















4. 將球做T-R轉動,先將球移動到左上角,再讓球做轉動,但是軸心不變,
 可以看到球繞著中心點做轉動,這種轉動屬於公轉
















5. 使用茶壺做T-R-T轉動

首先去FB社團複製老師打好的程式碼,也就是我們之前做過的轉動茶壺,
但是複製上去的程式碼很雜亂,因此我們需要排版,點擊codeblocks畫面右鍵
選取 Format use AStyle 












code :
#include <GL/glut.h>
float angle=0;///Now: 讓茶壼自動轉動的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///Now:備份矩陣
    glRotatef(angle, 0,0,1);///Now:轉動
    glutSolidTeapot(0.3);
    glPopMatrix();///Now:還原矩陣
    glutSwapBuffers();
}
void motion(int x, int y)
{
    angle=x;///Now: 改變角度
    glutPostRedisplay();///Now: 請 重畫畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week05 TRT");

    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutMainLoop();
}


將茶壺的把手移動到畫面正中央,並且可以做轉動,如下圖所示
















6. 茶壺T-R-T轉動
    
畫兩個茶壺,一個紅色一個橘色,紅色的保持原地不動,將橘色茶壺的把手移動到畫面中央,再接著做轉動,最後把整個橘色茶壺掛到紅色茶壺的前端上

(注意 : 看T-R-T轉動的程式碼的時候,由下往上看)

code :

#include <GL/glut.h>
float angle=0;///Now: 讓茶壼自動轉動的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///Now:備份矩陣

    glColor3ub(255,0,0);///中間紅色的茶壺
    glutSolidTeapot(0.3);

    glTranslatef(0.45,0.15,0);///4.掛在紅色茶壺的前端
    glRotatef(angle, 0,0,1);///3.轉動橘色茶壺
    glTranslatef(0.45,-0.10,0);///2.把橘色茶壺的把手放到畫面中央
    glColor3ub(255,127,39);///2.幫上橘色
    glutSolidTeapot(0.3);///1.一個茶壺


    glPopMatrix();///Now:還原矩陣
    glutSwapBuffers();
}
void motion(int x, int y)
{
    angle=x;///Now: 改變角度
    glutPostRedisplay();///Now: 請 重畫畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week05 TRT");

    glutDisplayFunc(display);
    glutMotionFunc(motion);///Now:
    glutMainLoop();
}

沒有留言:

張貼留言