2023年3月16日 星期四

熱血的小葉老師 慢慢教圖學 每週教一個主題 Week05 T-R-T特定軸轉動

 Week05


step01-1

# step01-1_把上課的教材 jsyeh.org 的 3dcg10 裡的 data 及 windows.zip 下載、執行Transformation.exe 要先複習上週的「移動-旋轉」與「旋轉-移動」


「移動-旋轉」

```cpp

glTranslatef(0.8, 0, 0); //移動到右邊

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

glScalef(1, 2, 1);//長高的

glBegin(...);// 藍色車子

...

```


與「旋轉-移動」

```cpp

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

glTranslatef(0.8, 0, 0); //移動到右邊

glScalef(1, 2, 1);//長高的

glBegin(...);// 藍色車子

...

```
































step01-2

## step01-2_新開GLUT專案,week05-1_TRT_translate_rotate 看兩種不同的轉動的差別。先把week04-1的程式複製過來, 再把 display()裡, 改成 紅色茶壼、綠色茶壼, 裡面的轉動、移動的順序不同。


```cpp

///Week05-1_TRT_translate_rotate 把上週的 week04-1 拿來用

///旋轉軸改成 0,0,1 z軸, 再複製成 紅色、綠色

#include <GL/glut.h>

float angle = 0;

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    glColor3f(1, 0, 0);///紅色

    glPushMatrix();

        glRotatef(angle, 0, 0, 1); ///step02-1 改成 0,0,1 z軸

        glTranslatef(0.8, 0, 0);///移到右邊

        glutSolidTeapot( 0.3 );

    glPopMatrix();


    glColor3f(0, 1, 0);///綠色

    glPushMatrix();

        glTranslatef(0.8, 0, 0);///移到右邊

        glRotatef(angle*1.5, 0, 0, 1); ///step02-1 改成 0,0,1 z軸

        glutSolidTeapot( 0.3 );

    glPopMatrix();


    glutSwapBuffers();

    angle++;

}

int main(int argc, char* argv[] )

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week05");


    glutDisplayFunc(display);

    glutIdleFunc(display);

    glutMainLoop();

}

```






















step02-1

step02-1_要用老師的 opengl_TRT_demo 的互動程式 跑起來。按 ToDraw 可以畫身體、畫頭、畫手。可按住程式碼,移動它的位置。先只放一個旋轉(在手的前面,只影響手)會對正中心轉, 有點怪怪的。改成移動, 讓手臂的關節移到正中心。再來,把轉動加上去, 手臂會在肚臍上轉動, 有點變態。最後, 把移動加上去, 讓旋轉中的手臂「掛」到肩膀上。


```cpp

myDrawObject(0); //畫身體

glPushMatrix();

  glTranslatef(0.17, 0.38, 0);  //(3) 最後,把手臂掛到肩上

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

  glTranslatef(-0.17, -0.38, 0);//(1)把關節放正中心

  myDrawObject(1); //畫手臂

glPopMatrix();

```




















step02-2

step02-2_接下來講解下週的考試題目, 以奇異博士手上拿著寶石為例, drawHand()可以畫手,但它的旋轉中心沒有放在正中心, 怎麼辦 (1) 先把關節移到正中心。(2)上面再加上轉動,小心轉動軸不要寫錯、角度的正負號也不能寫錯。(3)最後, 最上面,就簡單的把會轉動的手「掛到」手肘上面去。


```cpp

glPushMatrix();

  glTranslatef(-0.5, -0.9, 0); //20分, (3) 最後,把它掛在肩上

  glRotatef(-45, 0,0,1);       //20分, (2) 轉動,小心正負號

  glTranslatef(-0.8, 0.9, 0);  //20分, (1) 把關節移到正中心

  drawHand(); 

glPopMatrix();

```
























step03-1

## step03-1_開新GLUT專案, week05-2_TRT_robot 要做出TRT關節轉動。先把 week05-1的程式拿來改。用 glutSolidCube(1)可畫出寬度1的方塊, 發明myCube()函式,可以用glScalef(0.5, 0.2, 0.2) 把方塊調成細長狀, 再把矩陣保護起來。再來用小考的T-R-T觀念, 慢慢把方塊變成正確轉動的手臂 (1) 調中心, (2)轉動, (3)掛到對的位置。


```cpp

///Week05-2_TRT_robot 貼上 week05-1_TRT_translate_rotate 的程式

///Week05-1_TRT_translate_rotate 把上週的 week04-1 拿來用

///旋轉軸改成 0,0,1 z軸, 再複製成 紅色、綠色

#include <GL/glut.h>

float angle = 0;

void myCube()///step2 改函式

{

    glPushMatrix();///step1

        glScalef(0.5, 0.2, 0.2);///step1 調大小

        glutSolidCube(1); ///step1 正方塊

    glPopMatrix();///step1

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    glColor3f(1,1,1);///step4 白色的

    glutSolidCube(1); ///step4 身體


    glPushMatrix();///step2

        glTranslatef(0.5, 0.5, 0);///step5 掛到右上角去

        glRotatef(angle, 0, 0, 1);///step2 轉它

        glTranslatef(0.25, 0, 0);///step3 往右移動 0.25 讓關節在正中心

        glColor3f(0,1,0);///step4 綠色的

        myCube(); ///step2 改函式

    glPopMatrix();///step2


    glPushMatrix();///step2

        glTranslatef(-0.5, 0.5, 0);///step5 掛到右上角去

        glRotatef(angle, 0, 0, 1);///step2 轉它

        glTranslatef(0.25, 0, 0);///step3 往右移動 0.25 讓關節在正中心

        glColor3f(0,1,0);///step4 綠色的

        myCube(); ///step2 改函式

    glPopMatrix();///step2


    glutSwapBuffers();

    angle++;

}

int main(int argc, char* argv[] )

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week05");


    glutDisplayFunc(display);

    glutIdleFunc(display);

    glutMainLoop();

}

```


























step03-2

## step03-2_了解 Matrix在做什麼事。其實就是改變座標, 程式碼倒著看, 是因為最下面畫點的時候, 結合的順序是慢慢往上理解。因此理解時,就從下往上看。電腦運算時, 從上往下改變矩陣。









step03-3

## step03-3_用Git指令, 上傳今天的2個程式到GitHub


- 0. 安裝 Git 開啟 Git Bash

- 1. 進入桌面 cd desktop 雲端複製下來 git clone 網址, 再進入 cd 2023graphicsb

- 2. 開啟檔案總管 start . 整理今天的程式

- 3. 加入帳冊 git add .

- 4. 確認修改 git commit -m week05 

- 4.0 要先 git config --global user.email jsyeh@mail.mcu.edu.tw

- 4.0 要先 git config --global user.name jsyeh

- 4.1 git commit -m week05

- 5. git push 推上雲端


如果想要偽造時間, 可用 git commit -m week05 --date="2023-03-16 15:00:00" 

這樣在 GitHub 裡看你的打卡時間, 就會用右邊的時間。








沒有留言:

張貼留言