2023年3月9日 星期四

Week04 Zhou

Week04

Step01
延續上個禮拜到https://jsyeh.org/3dcg10/ 
下載window.zip和data.zip壓縮檔
並把兩個壓縮檔解壓縮
把data資料夾解壓縮在windows資料夾裡
然後執行transformation.exe 
這周要教的是glRotatef 旋轉


試試看X軸的旋轉 是怎麼轉的

試試看Y軸的旋轉 是怎麼轉的

試試看Z軸的旋轉 是怎麼轉的
利用大拇指去比軸的方向 再看其他四隻手指指的方向
就能知道這個軸旋轉的方向是哪裡


再來思考 如果是glRotatef(1.00 , 1.00 , 0.00);
想有一根竹子綁成這個方向在這個人身上
同理 利用大拇指也比這個方向 觀察其他四指的方向
就能知道旋轉的方向怎麼轉
Step02

開啟CodeBlocks 並開啟GLUT專案 並下載把freeglut解壓縮
且把libfreeglut.a 複製改成libglut32.a
換上之前寫過的十行程式
並把程式修改成以下
#include <GL/glut.h>
float angle = 0;        全域變數 angle 角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);  ///清畫面
    glPushMatrix();
        glRotatef(angle,0 ,1 ,0);        轉angle角度
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
    angle++;            角度++++
}


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week04");
    glutDisplayFunc(display);
    glutIdleFunc(display);        重複畫面
    glutMainLoop();
}

並且執行程式
就會出現一個會旋轉的茶壺囉

再新增一個新的GLUT黨
把剛剛的程式碼複製貼上
並修改成以下程式碼

#include <GL/glut.h>
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

void myLight()
{
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
}

float angle = 0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle,0 ,1 ,0);
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week04");

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

紅色框框的部分 從最原始的GLUT檔 
搜尋light 的部分 複製貼上到剛剛的程式碼




執行程式後 就會出現打光的旋轉茶壺囉




Step03
開啟剛剛的transformation.exe ,
可以交換 translate 和 rotate的程式
可以造出 公轉 與 自轉的差別 
讀程式利用由下往上讀的方式來看整個程式


讀程式的順序就會變這樣

glBegin 這邊代表藍色的車子

glSclef 這邊代表長胖的藍色車子 

glTranslatef    把車子移到右邊

glRotatef     轉動整個視角


當把 translate 和 rotate的程式 換回來
就會變成自轉



把week04-1的程式拿來改寫為
以下程式

#include <GL/glut.h>
float angle = 0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(0.5, 0 , 0);        移動到右邊
        glRotatef(angle,0 ,1 ,0);        旋轉中的
        glColor3f(0, 0, 1);                藍色的
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week04");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();
}


執行以上程式碼就會出現下面的畫面囉
移動到右邊的旋轉藍色茶壺



利用剛剛的程式碼再新增一些程式
讓一個黃色茶壺在上面邊旋轉邊移動

    glPushMatrix();
        glRotatef(angle,0 ,1 ,0);
        glTranslatef(0.5, 0 , 0);
        glColor3f(1, 1, 0);
        glTranslatef(0, 0.5 , 0);
        glutSolidTeapot( 0.3 );
    glPopMatrix();

就會出現以下畫面囉



























沒有留言:

張貼留言