2018年3月30日 星期五

Week 05 宋侑恩

Week 05 - Part 1 - 使用Transformation來觀察自轉和公轉的差別

打開上周已經使用過的 Transformation.exe

Week 05 - Part 1 - 1 - 自轉

由下圖彩虹方框可以來了解,此程式碼該怎麼看
此程式碼依照綠色→黃色→橘色→紅色(由下往上)來讀取
1. glBegin(....); ///畫出一台車子
2. glScalef(x,y,z); ///一台縮大/縮小的車子
3. glRotatef(angle,x,y,z); ///轉動一台(放大/縮小)的車子
4. glTranslatef(x,y,z); ///移動一台[旋轉過後且(放大/縮小)]的車子


由上個步驟來觀察,我們可以得知
當glTranslatef(x,y,z)在glRotatef(angle,x,y,z)上,則物件做自轉的動作

Week 05 - Part 1 - 2 - 公轉

由下圖彩虹方框可以來了解,此程式碼該怎麼看
此程式碼依照綠色→黃色→橘色→紅色(由下往上)來讀取
1. glBegin(....); ///畫出一台車子
2. glScalef(x,y,z); ///一台縮大/縮小的車子
3. glTranslatef(x,y,z); ///移動一台(放大/縮小)
4. glRotatef(angle,x,y,z); ///轉動一台[移動過後且(放大/縮小)的車子]


由上個步驟來觀察,我們可以得知
當glRotatef(angle,x,y,z)在glTranslatef(x,y,z)上,則物件做公轉的動作

Week 05 - Part 2 - 使用GLUT progect原本的程式碼來做修改

glPushMatrix();
    glRotated(a,0,0,1);///轉動(位置移到左上角)的物件
    glTranslated(-2.4,1.2,-6);///物件位置移到左上角
    glutSolidSphere(1,slices,stacks);
glPopMatrix();

由下圖可見,原本在左上角做自轉的物件,現在變成公轉了

Week 05 - Part 3  - 1 - 轉動的茶壺

將原本GLUT專案的程式碼刪除,到Facebook社團中複製老師已經幫我們打好的程式碼,
到codeblocks中貼上,但會發現程式碼的排版不好


在程式碼旁邊空白之處,按下右鍵,點選 Format use AStyle 

Format use AStyle 點選後,系統會自動幫我們編排程式碼的排版(如下圖)


將茶壺把手的位置放到中間

#include <GL/glut.h>
float angle=0;///讓茶壼自動轉動的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///備份矩陣
        glTranslatef(0.45,-0.10,0);///把茶壺把手放到中間,方便等一下做轉動的動作
        glutSolidTeapot(0.3);
    glPopMatrix();///還原矩陣
    glutSwapBuffers();
}
void motion(int x, int y)
{
    angle=x;///改變角度
    glutPostRedisplay();///重畫畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week05 TRT");
    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutMainLoop();
}

下圖紅色方框內可看見茶壺把手的位置已被移動過

加上讓茶壺把手能夠轉動的程式碼

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///備份矩陣
        glRotatef(angle, 0,0,1);///3.轉動把手被放到中間的茶壺
        glTranslatef(0.45,-0.10,0);///2.把茶壺把手放到中間
        glutSolidTeapot(0.3);///1.畫出一個茶壺
    glPopMatrix();///還原矩陣
    glutSwapBuffers();
}

下圖紅色方框可見茶壺把手在中間且可以轉動了


Week 05 - Part 3  - 2 - 多個茶壺的轉動

將程式碼做稍為的修改,增加一個茶壺,並且讓橘色茶壺掛在紅色茶壺上

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3ub(255,0,0);///中間紅色的茶壺
        glutSolidTeapot(0.3);

        glTranslatef(0.4,0.13,0);///4.掛上去
        glRotatef(angle, 0,0,1);///3.轉動一個把手在中間的橘色茶壺
        glTranslatef(0.45,-0.10,0);///2.把橘色茶壺把手放到中間
        glColor3ub(255,127,39);
        glutSolidTeapot(0.3);///1.一個橘色的茶壺
    glPopMatrix();
    glutSwapBuffers();
}


再加一個黃色茶壺

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3ub(255,0,0);///中間紅色的茶壺
        glutSolidTeapot(0.3);
        glPushMatrix();
            glTranslatef(0.4,0.13,0);///4.掛上去
            glRotatef(angle, 0,0,1);///3.轉動一個把手在中間的橘色茶壺
            glTranslatef(0.45,-0.10,0);///2.把橘色茶壺把手放到中間
            glColor3ub(255,127,39);
            glutSolidTeapot(0.3);///1.一個橘色的茶壺
        glPushMatrix();
            glTranslatef(0.4,0.13,0);///4.掛上去
            glRotatef(angle, 0,0,1);///3.轉動一個把手在中間的黃色茶壺
            glTranslatef(0.45,-0.10,0);///2.把黃色茶壺把手放到中間
            glColor3ub(255,255,0);
            glutSolidTeapot(0.3);///1.一個黃色的茶壺
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}











Week 05 - Part 3  - 3 -茶壺手臂

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3ub(255,255,0);///中間黃色的茶壺
        glutSolidTeapot(0.3);
        glPushMatrix();///右手臂(綠色)
            glTranslatef(0.4,0.13,0);
            glRotatef(angle, 0,0,1);
            glTranslatef(0.45,-0.10,0);
            glColor3ub(0,255,0);
            glutSolidTeapot(0.3);

            glPushMatrix();///右手肘(藍色)
                glTranslatef(0.4,0.13,0);
                glRotatef(angle, 0,0,1);
                glTranslatef(0.45,-0.10,0);
                glColor3ub(0,0,255);
                glutSolidTeapot(0.3);
            glPopMatrix();
        glPopMatrix();

        glPushMatrix();///左手臂(橘色)
            glTranslatef(-0.4,0.13,0);
            glRotatef(-angle, 0,0,1);
            glTranslatef(-0.45,-0.10,0);
            glColor3ub(255,127,39);
            glutSolidTeapot(0.3);

            glPushMatrix();///左手肘(紅色)
                glTranslatef(-0.4,0.13,0);
                glRotatef(-angle, 0,0,1);
                glTranslatef(-0.45,-0.10,0);
                glColor3ub(255,0,0);
                glutSolidTeapot(0.3);
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}

沒有留言:

張貼留言