2023年3月22日 星期三

達yo - 電腦圖學_階層轉動 - week06

今天要教的是階層轉動

複習上禮拜TRT轉動

1.打開CodeBlocks,開啟新的GLUT Project
2.去github複製week05_TRT_robot的程式碼
3.更改幾行程式碼

glutSolidSphere(0.02,30,30);
    glPushMatrix();
        
        glRotatef(angle,0,0,1);
        glTranslatef(0.46,-0.05,0);///轉動的中心點
        glutSolidTeapot(0.3);
glPopMatrix();


 階層轉動Hierarchy
(簡單說就是多個T-R-T)

開啟新專案,把程式碼稍微修改

1.增加新的茶壺(右手臂),使它在中心點上

2.移動另一個茶壺(身體)的位置(手把接到中心茶壺的壺口)

3.成功在壺口轉動

*轉動的茶壺不必更動中心點*

glutSolidSphere(0.02,30,30);///正中心的圓球

    glutSolidTeapot(0.3);///身體

    glPushMatrix();///右手臂

        ///先註解掉glTranslatef(-0.5,0.5,0);

         glTranslatef(0.49,0.13,0);///新的

        glRotatef(angle,0,0,1);///可轉動

        glTranslatef(0.46,-0.05,0);///把轉動的中心,放中心

        glutSolidTeapot(0.3);

    glPopMatrix();


再新增一個茶壺當作是右手肘,接在右手臂上
淺藍色框起來是右手臂,紅色框框是右手肘


開新的專案出來,並複製上週week05_TRT_robot的程式碼,畫出身體、手臂,做出左右手在身體上的轉動。
利用drawHand()函式精簡化TRT,讓程式不要看起來太亂。

程式碼
float angle = 0;
void drawHand()
{
    glPushMatrix();
        glScalef( 1 , 0.3 , 0.3 );
        glutSolidCube(0.5);
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///(3)掛上去
        glRotatef(angle , 0 , 0 , 1);///(2)轉動
        glTranslatef(0.25 , 0 , 0 );///(1)把中心放在政中心
        drawHand();
    glPopMatrix();
    glutSwapBuffers();
    angle++;///角度增加
}



增加右下手肘,並跑看看結果
右下手肘在右上手臂的中心轉動
再做一些改良,把淺藍色圈起來右下手肘的中心點移到右邊


這樣右下手肘就會在右上臂的右邊轉動
最後
把右上手臂的程式碼註解弄掉(讓它跟著一起轉動)

接著複製右上手臂跟右下手肘的程式碼(做出左手臂跟左下手肘)

做出左右手臂一起轉動





沒有留言:

張貼留言