2022年5月10日 星期二

雪⛄電腦圖學筆記12~

2022/5/3 第十二周 

主題 : T-R-T(移動-旋轉-移動)對特定軸旋轉

1.下載範例: windows、data.zip ,Transformation.exe

## 按右鍵Swap 可以交換T(移動)、R(轉動)

(1)在右邊轉動的藍色車子: 自轉

    glTranslatef( 0.9 , 0.0 , 0.0 ) ; /// 移動 到右邊

    glRotatef(角度, 0, 1 , 0); ///旋轉

    畫一台藍色車子

---->移到右邊 轉動中的 大小正常的藍色車子 (跟著車子移動軸心到右邊在轉動車子)



(2)繞著中間轉彎的藍色車子: 公轉

    glRotatef(角度, 0, 1 , 0); ///旋轉

    glTranslatef( 0.9 , 0.0 , 0.0 ) ; /// 移動 到右邊

    畫一台藍色車子

---->轉動 移到右邊的 大小正常的藍色車子 (軸心在中間,車子移動到旁邊,對著中心軸旋轉車子)



2. 用另一個程式理解

(1) https:120.125.80.50/GL/有程式 (不安全->繼續)

(2) 點 ToDraw(右下角)  可以在左邊黑色框框畫畫,Ctrl-R 可以清空

(3-1)畫個身體 : myDrawObject(0)

(3-2)畫個手臂 : myDrawObject(1)

(3-3)改程式碼的順序: 

        glPushMatrix();

            glRotatef(angle,0,0,1);

            myDrawObject(0)

            myDrawObject(1)

        glPopMatrix();

        Translatef(0,0,0);

        Translatef(0,0,0);

(3-4)按angle= 在按空白鍵 會自動改動畫,在按一次空白鍵可以暫停



###讓手臂轉動,身體不要動(公轉)

(4-1) 點一下 glRotatef() 那一行,變成紅色,便可以移動畫在右邊的手臂

(4-2) 程式順序:

        glPushMatrix();

            myDrawObject(0); ///畫身體

            glRotatef(angle,0,0,1); ///旋轉Rotate下的整個東西

            Translatef(0,0,0); ///往左下移(讓軸心 放在世界中心)

            myDrawObject(1); ///畫手臂(右上方)

        glPopMatrix();

        Translatef(0,0,0);


###讓手臂轉動,身體不要動(自轉)

(5-1) 程式順序:

            myDrawObject(0); ///畫身體

        glPushMatrix();

            Translatef(0.29, 0.31, 0); ///往右上方移動(將手臂掛到身體的右上方)....將手臂的軸心移到左下角

            glRotatef(angle,0,0,1); ///旋轉Rotate下的整個東西

            Translatef(-0.3, -0.19, 0); ///往左下移(讓軸心 放在世界中心(0,0))....

            myDrawObject(1); ///畫手臂(右上方)

        glPopMatrix();

------->移動圖的順序: 1. 先將手臂移動到(0, 0) [手臂原本畫在右上,往左下移動到中心]

                                  2. 在旋轉手臂的角度

                                  3. 再將手臂移動到想放的地方 [ex: 手臂原本的地方(右上方)]


3. 寫程式week12_TRT(剪貼今天、之前的筆記)

#include <GL/glut.h>

float angle=0;

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        

        glRotatef(angle, 0, 0, 1);


        glutSolidTeapot(0.3);

    glPopMatrix();

    glutSwapBuffers();

    angle+=1;

}

int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week12 TRT");


    glutIdleFunc(display);

    glutDisplayFunc(display);

    glutMainLoop();

}



4. 讓紅茶壺可以對任一點做旋轉
#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1, 1, 1);
    glutSolidTeapot(0.3);///白色(當身體)
    glPushMatrix();
        glTranslatef(0.2,0,0);         ///(3)放到右手邊(把整個往右邊移動)
        glRotatef(angle, 0, 0, 1);   ///(2)旋轉
        glTranslatef(0.2,0,0);        ///(1)把旋轉中心,放到世界中心
        glColor3f(1, 0, 0);
        glutSolidTeapot(0.2);///紅色(當手臂)
    glPopMatrix();
    glutSwapBuffers();
    angle+=0.1;
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week12 TRT");

    glutIdleFunc(display);
    glutDisplayFunc(display);
    glutMainLoop();
}




5.考試範例:

6.回家作業(模型可以用Maya做,至少要有上手臂下手肘)
#include <GL/glut.h>
float angle=0;
void display()
{   ///身體
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1, 1, 1);
    glutSolidTeapot(0.3);///白色(當身體)
    
    ///右手
    glPushMatrix();
        glTranslatef(0.2,0,0);         ///(3)放到右手邊(把整個往右邊移動)
        glRotatef(angle, 0, 0, 1); ///(2)旋轉(對Z軸轉動)
        glTranslatef(0.2,0,0);       ///(1)把旋轉中心,放到世界中心 (超重要!!!,如果沒有這部,手臂會跟身體分離)
        glColor3f(1, 0, 0);
        glutSolidTeapot(0.2);///紅色(當手臂)
        glPushMatrix();
            glTranslatef(0.2,0,0);         ///(3)放到右手邊(把整個往右邊移動)
            glRotatef(angle, 0, 0, 1); ///(2)旋轉
            glTranslatef(0.2,0,0);       ///(1)把旋轉中心,放到世界中心 (上手臂會跟下手肘分離)
            glColor3f(1, 0, 0);
            glutSolidTeapot(0.2);///紅色(當手臂)
        glPopMatrix();
    glPopMatrix();


     ///左手
    glPushMatrix();
        glTranslatef(-0.2,0,0);         ///(3)放到左手邊(把整個往左邊移動)
        glRotatef(-angle, 0, 0, 1); ///(2)旋轉
        glTranslatef(-0.2,0,0);       ///(1)把旋轉中心,放到世界中心 (超重要!!!,如果沒有這部,手臂會跟身體分離)
        glColor3f(1, 0, 0);
        glutSolidTeapot(0.2);///紅色(當手臂)
        glPushMatrix();
            glTranslatef(-0.2,0,0);         ///(3)放到左手邊(把整個往左邊移動)
            glRotatef(-angle, 0, 0, 1); ///(2)旋轉
            glTranslatef(-0.2,0,0);       ///(1)把旋轉中心,放到世界中心 (上手臂會跟下手肘分離)
            glColor3f(1, 0, 0);
            glutSolidTeapot(0.2);///紅色(當手臂)
        glPopMatrix();
    glPopMatrix();


    glutSwapBuffers();
    angle+=0.1;
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week12 TRT");

    glutIdleFunc(display);
    glutDisplayFunc(display);
    glutMainLoop();
}



沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...