2023年3月15日 星期三

Orangutan - 第五週 - T-R-T 特定軸轉


 =========================================================================

FIFTH

一、老師帶大家載資料,呈現車子的模型,並解釋物體的旋轉、移動、體積變化

老師的網站網址(https://jsyeh.org/3dcg10/)

1.下載二個檔案:data.zip、win32

2.將data.zip中的data拉到windows.zip並執行解壓縮Transformation.exe

3.試著改變glScalef()、glRotatef()、glTranslatef()數值,並觀察其變化,此時的轉動是自轉

4.將glRotatef()、glTranslatef()做交換,並觀察其變化,此時的轉動是公轉(繞著中心轉動)

二、特定軸轉動,對Z軸做旋轉


1.開啟GLUT專案,並且命名為Week05-1_TRT_rotate_translate
2.並測試是否能執行成功

3.綠色是自轉,紅色則是公轉

以下為上方的程式碼
#include <GL/glut.h>
float angle = 0;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glColor3f(0,1,0);///綠色
    glPushMatrix();
        glTranslatef(0.8,0,0);///Translate在Rotate上面
        glRotatef(angle, 0, 0, 1);
        glutSolidTeapot( 0.3 );
    glPopMatrix();

    glColor3f(1,0,0);///紅色
    glPushMatrix();
        glRotatef(angle, 0, 0, 1);
        glTranslatef(0.8,0,0);///Translate在Rotate下
        glutSolidTeapot( 0.3 );
    glPopMatrix();

    glutSwapBuffers();
    angle++;
}
int main(int argc, char* argv[] )
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week03");

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

3.試著執行老師給的Processing程式碼,畫出一個身體、頭、手臂,先觀察手臂錯誤的轉動

4.要先將手臂的中心點拉好最後再將glPushMatrix()下方的程式碼變成TRT(translate、rotate、translate)


三、講解考試題目,機器人手臂的轉動

1.下禮拜考試的題目(從下往上看程式碼)
    (1)把手肘中心,放到世界中心,所以要將最初座標點都加上負號
    (2)轉動要小心正負號、轉動軸
    (3)把轉動的手肘放到正確的位置

2.新開一個GLUT專案

3.專案名稱命名為Week05-2_TRT_robot

4.將Week05-1的程式碼改為
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glColor3f(0,1,0);///綠色的身體
    glPushMatrix();
        glutSolidCube( 0.5 );

        glPushMatrix();
            glTranslatef(0.5,0.5,0);
            glColor3f(1,0,0);
            glutSolidCube(0.5);
        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();
    angle++;
}

5.將紅色手臂裡加上glRotatef(angle,0,0,1);讓紅色手臂做旋轉

6.將5.的程式碼改為下方程式碼,就可以做到像手臂旋轉的效果
    glTranslatef(0.25,0.25,0);///3.把整個東西掛到右上角
    glRotatef(angle,0,0,1);   ///2.轉動
    glTranslatef(0.25,0.25,0);///1.把旋轉中心,放到中心

以下為上方的程式碼
#include <GL/glut.h>
float angle = 0;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glColor3f(0,1,0);///綠色的身體
    glPushMatrix();
        glutSolidCube( 0.5 );

        glPushMatrix();
            glTranslatef(0.25,0.25,0);///3.把整個東西掛到右上角
            glRotatef(angle,0,0,1);   ///2.轉動
            glTranslatef(0.25,0.25,0);///1.把旋轉中心,放到中心
            glColor3f(1,0,0);
            glutSolidCube(0.5);
        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();
    angle++;
}
int main(int argc, char* argv[] )
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week03");

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

沒有留言:

張貼留言