2022年5月9日 星期一

⚝ YI-ZHEN的筆記 week12

 

  • 範例
1. https://jsyeh.org/3dcg10/ 下載[data][win32]並解壓縮
2. 開啟Transformation檔案
3. 其中,按右鍵(或按S)可選擇 Swap translate 及 rotate
4.
glTranslatef(0.5, 0.0, 0.0);
glRotatef(angle, 0, 1, 0);
藍色的車子向右移動並旋轉,看起來像陀螺一樣(隨中心點自轉)
藍色車車先旋轉以後(綠色框框),再將其移動到右邊(紅色)

5.
交換了以後
glRotatef(angle, 0, 1, 0);
glTranslatef(0815, 0.0, 0.0);
藍色的車子向右移動並旋轉,看起來像圍著中心點走(隨中心點公轉)
藍色車車先移動到右邊以後(綠色框框),再整個轉動(紅色)

  • 老師程式碼範例
1. https://120.125.80.50/GL/ 裡面有期中考題及課堂小考
    2-1 ToDraw先畫一個圖
    2-2 將Object拖曳到Rotate下方才可使其轉動
    2-3 點右上方angle並按空白鍵,讓物件開始轉動
    2-4 點Translate在選物件即可移動位置



3.  畫一個身體再畫一隻手
4. 將手拉至下面
    4-1 其中綠色框框先將手移至中心點
    4-2 藍色框框則是旋轉綠色框框
    4-3 紅色框框則是再將至於中心點正在轉動的手(藍色框框)移回原位
    4-4 如此一來就變成只對特定軸轉動了
  • 程式碼實作 TRT
1. 先建立一個新專案
2. 將基本的十行程式先複製貼上
    #include <GL/glut.h>
     void display()
     {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glutSolidTeapot(0.3);
        glutSwapBuffers();
     }
    int main(int argc,char**argv)
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
        glutCreateWindow("Week12 TRT");

        glutDisplayFunc(display);

        glutMainLoop();
    }

3. 茶壺上面 加translate將其把手移置中心(向右下移動)
4. 之後疊上一個旋轉,讓茶壺以把手為中心進行旋轉(旋轉移動後的茶壺(藍框框))

#include <GL/glut.h>
float angle=0;
 void display()
 {
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glPushMatrix();
         glRotatef(angle,0,0,1);///旋轉
         glTranslatef(0.4,-0.07,0);///往右下移動(把手把移到中心)
         glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
    angle+=0.01;
 }
int main(int argc,char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week12 TRT");
    glutIdleFunc(display);
    glutDisplayFunc(display);

    glutMainLoop();
}


  • 程式碼實作 TRT_TRT
1. 白色大茶壺不會移動,因為沒有在Rotate裡。
    然後紅色小茶壺先向右移動(把把手移到旋轉中心)再進行旋轉。
    最後再把茶壺掛到白茶壺的壺嘴為至當作手臂

#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,0,0);///把下面旋轉中的東西 掛在某處
        glRotatef(angle,0,0,1);///旋轉
        glTranslatef(0.4,-0.07,0);///向右移動(把手移置中心)
        glColor3f(1,0,0);///紅色的
        glutSolidTeapot(0.3);///小茶壺
    glPopMatrix();
    glutSwapBuffers();
    angle+=0.01;
 }
int main(int argc,char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week12 TRT_TRT");
    glutIdleFunc(display);
    glutDisplayFunc(display);

    glutMainLoop();
}
2. 再增加一個紅色小茶壺作為手肘。
    向右移動(把把手移到旋轉中心)再進行旋轉
    最後再把茶壺掛到紅茶壺的壺嘴為至當作手肘
#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.3, 0, 0);///將下面旋轉中的東西 掛在某處
        glRotatef(angle, 0, 0, 1);///旋轉
        glTranslatef(0.2, 0, 0);///向右移動(把手移置中心)
        glColor3f(1, 0, 0);///紅色的
        glutSolidTeapot(0.2);///小茶壺
        glPushMatrix();
            glTranslatef(0.2, 0, 0);///將下面旋轉中的東西 掛在某處
            glRotatef(angle, 0, 0, 1);///旋轉
            glTranslatef(0.2, 0, 0);///向右移動(把手移置中心)
            glColor3f(1, 0, 0);///紅色的
            glutSolidTeapot(0.2);///小茶壺
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
    angle+=0.01;
}
int main(int argc,char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week12 TRT_TRT");
    glutIdleFunc(display);
    glutDisplayFunc(display);

    glutMainLoop();
}


沒有留言:

張貼留言