2023年3月16日 星期四

晚安 week05

 複習上周的「移動-旋轉」與「旋轉-移動」

1. 下載範例網頁中的data, win32


2. 將windows解壓縮, data.zip/data丟進解壓縮後的windows資料夾

 3. 執行Transformation.exe

旋轉函式glRotatef()和移動函式glTranslatef()在程式碼中的順序會影響執行的結果
在以下的程式碼中:  
綠色和紅色茶壺的運動分別將移動與旋轉調換 其運動方式也不同
```
#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);
        glTranslatef(0.8, 0, 0);///移動到0.8
        glutSolidTeapot(0.3);
    glPopMatrix();
    ///紅色茶壺會以中心點為圓心  0.8為半徑公轉

    glColor3f(0,1,0);///綠
    glPushMatrix();
        glTranslatef(0.8, 0, 0);///移動到0.8
        glRotatef(angle*1.5,0,0,1);
        glutSolidTeapot(0.3);
    glPopMatrix();
    ///綠色茶壺會移動到0.8後自轉

    glutSwapBuffers();
    angle++;
}

int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week_02");

    glutDisplayFunc(display);
    glutMainLoop();
}
```






「移動-旋轉-移動」(TRT)
使用老師的Opengl TRT demo程式:
按下ToDraw開始繪圖,拖動程式碼可以移動它的位置
先繪製出大致的人型與一條手臂
TRT原理:
先將關節移動到原點glTranslatef(-0.18,-0.41,0),加上轉動軸後glRotatef(angle,0,0,1),再將轉動圓心放回指定點glTranslatef(0.18,0.41,0)


以glut程式實作:
```
#include <GL/glut.h>

float angle = 0;
void myCube()
{
    glPopMatrix();
        glScalef(0.5,0.2,0.2);///調大小
        glutSolidCube(1); ///正方形
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);

    glColor3f(1,1,1);
    glutSolidCube(1);

    glPushMatrix();
        glTranslatef(-0.25, 0, 0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.25, 0, 0);
        glColor3f(0,1,0);
        myCube();
    glPopMatrix();

    glutSwapBuffers();
    angle++;
}

int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week_05");

    glutDisplayFunc(display);
    glutMainLoop();
}
```





沒有留言:

張貼留言