2023年3月8日 星期三

Code Talker week04 旋轉

STEP01-1

1.去https://jsyeh.org.3dcg10下載data,window

2.data.zip裡的data丟進windows

3.解壓縮執行Transformation.exe

STEP01-2

1.試著旋轉Z軸

用右手了解座標系統,大拇指朝向自己定義Z軸,4拇指朝右邊定義X軸,4拇指朝上定義Y軸,於是決定旋轉軸後再調整欲旋轉之角度
2.試著旋轉Y軸

3.試著旋轉X軸

STEP01-3

1.試著同時旋轉XY軸,結果:

模型向右下方向轉動,得旋轉軸:


STEP02-1

1.依照之前步驟打開codeblock開新專案,命名"week04-1_rotate"

2.拿出上周的程式碼,改造一下,獲得茶壺一個

3.宣告一個角度amgle,加上glRotatef(angle,0,1,0);第一個是宣告的角度,後面對應XYZ軸

4.另外加上angle++,使其數值得以變動

5.加上glutIdleFunc(display)意即有空idel時,就重畫面

6.程式碼狀態:
#include <GL/glut.h>
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[])//main()主函式 進階版
 {
    glutInit(&argc,argv);//把參數送給glutInit初始化
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);//雙緩衝區+3D深度功能
    glutCreateWindow("week04");//開GLUT視窗

    glutDisplayFunc(display);//顯示用的函式
    glutIdleFunc(display);

    glutMainLoop();
 }



STEP02-2
白白的轉稍顯無聊,加上打光

1.從開啟專案時預設的程式碼幹走約20行的程式碼,得到結果:
#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[])//main()主函式 進階版
 {
    glutInit(&argc,argv);//把參數送給glutInit初始化
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);//雙緩衝區+3D深度功能
    glutCreateWindow("week04-2");//開GLUT視窗

    glutDisplayFunc(display);//顯示用的函式
    glutIdleFunc(display);

    myLight();
    glutMainLoop();
 }

2.補上述,宣告myLight,最後拿出來用



STEP02-3 加上顏色,並清掉背景,以黃色為例

1.


2.在畫茶壺的程式碼前加上glColor3f(1,1,0);使其成為黃色

3.在清背景的程式碼前加上glClearColor(1,1,1,1);

現在程式碼狀態:
#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()
 {
     glClearColor(1,1,1,1); //清背景的顏色:RGBA,其中A沒用到
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle,0,1,0);
        glColor3f(1,1,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
    angle++;
 }
 int main(int argc, char *argv[])//main()主函式 進階版
 {
    glutInit(&argc,argv);//把參數送給glutInit初始化
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);//雙緩衝區+3D深度功能
    glutCreateWindow("week04-3");//開GLUT視窗

    glutDisplayFunc(display);//顯示用的函式
    glutIdleFunc(display);

    myLight();
    glutMainLoop();
 }

STEP03-1

1.在Transformation.exe中的移動旋轉兩行按右鍵做位置交換

2.我們發現一個是自轉,一個是繞著正中心轉(公轉),轉的中心點不一樣

STEP03-2

1.寫出兩個茶壺,並改變其中一個移動旋轉位置做對照,可以加上顏色,以利觀察,如附圖:


2.口訣:左耳靠左肩,讓程式碼從下往上讀


沒有留言:

張貼留言