2023年3月22日 星期三

Code Talker week06 階層式轉動

 STEP01 複習考試內容

1.到CodeBlock建立新專案week06-1,複製上週week05-2的程式碼

2.把上週畫圖部分刪掉,畫一個大小0.3的固體茶壺

3.設定依Z軸旋轉,並將它移至正中心

4.利用glutSolidSphere(0.02,30,30);做小圓球,放正中心作為標記,第1個參數為半徑,第2個參數為橫切數,第3個參數為縱切數

結果如下:

5.最後把它掛到要放的地方,參考範例:


STEP02

1.再開啟一個新專案week06-2,把week06-1的程式碼貼過來

2.再做一個茶壺作為身體,修該要掛的位置,把轉動的茶壺掛到身體茶壺的嘴,如附圖:



3.複製上一個轉動包在上一個轉動的Push~Pop中,得到手肘,程式碼如下:

#include <GL/glut.h>

float angle = 0;

 void display()

 {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //glutSolidSphere(0.02,30,30);
    glutSolidTeapot(0.3);

    glPushMatrix();//手臂
        glTranslatef(0.45,0.15,0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.45,-0.05,0);
        glutSolidTeapot(0.3);
        glPushMatrix();//手肘
            glTranslatef(0.45,0.15,0);
            glRotatef(angle,0,0,1);
            glTranslatef(0.45,-0.05,0);
            glutSolidTeapot(0.3);
        glPopMatrix();
    glPopMatrix();

    glutSwapBuffers();

    angle++;

 }

 int main(int argc, char *argv[])//main()主函式 進階版

 {

    glutInit(&argc,argv);//把參數送給glutInit初始化

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);//雙緩衝區+3D深度功能

    glutCreateWindow("week05");//開GLUT視窗



    glutDisplayFunc(display);//顯示用的函式

    glutIdleFunc(display);



    glutMainLoop();

 }
結果如圖:


STEP03

1.再度開啟新專案week06-3,複製week05-2的程式碼貼上

2.想要發明函式幫我們做手臂,於是利用程式碼:
void drawHand()
{
    glPushMatrix();
        glScalef(1,0.3,0.3);//調整方塊大小(不影響尺寸)
        glutSolidCube(0.5);
    glPopMatrix();
}

3.之後利用呼叫函式的方式,建立一個會轉的長方形如圖:


4.複製貼上得到下手肘,同時先註解掉所謂上臂的轉動部分,方便我們掛下手肘到正確位置


5.將下手肘掛到正確的位置後,還原上面註解掉的部分(STEP03-4),讓上臂也開始轉,如圖:

6.利用複製貼上以及正負號轉換,做出左邊的手臂及手肘,如附圖:
兩條旋轉揮舞的手臂



















沒有留言:

張貼留言