2024年4月25日 星期四

week10電腦圖學

 Week10

week10-1_glutWireCube_myBody_myArm


0. 安裝 freeglut 再把 lib\libfreeglut.a 複製成 libglut32.a

1. File-New-Project , GLUT專案 week10-1_glutWireCube_myBody_myArm

2. 貼上上週的 week09-3_glutWireTeapot_glutWireCube_glutWireSphere


3. 要把 void display( ) 改寫一下, 呼叫 myBody( ) myArm( )


///week10-1_glutWireCube_myBody_myArm
#include <GL/glut.h>
void myBody()
{
    glPushMatrix(); ///備份矩陣
        glColor3f(1, 0, 0); ///紅色的
        glutWireCube(0.6); ///myBody()
    glPopMatrix(); ///還原矩陣
}
void myArm()
{
    glPushMatrix();
        glColor3f(0, 1, 0); ///綠色的
        glScalef(1, 0.4, 0.4); ///myArm();
        glutWireCube(0.3);
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    myBody(); ///我的身體
    myArm(); ///我的手臂

    glutSwapBuffers();
}
int main(int argc, char*argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 Microsoft Visual Studio");
    glutDisplayFunc(display);
    glutMainLoop();
}


week10-2_rotate_myArm


1. File-New-Project , GLUT專案 week10-2_rotate_myArm

2. 貼上 week10-1 的程式

3. float angle = 0; ///旋轉的角度

4. 在 main( ) 加上 glutIdleFunc(display) //有空就旋轉

5. 在 display( ) 裡, myArm( ) 的前後, 要加上 glPushMatrix() glPopMatrix() 和 glRotatef(angle++, 0,      0, 1);

///week10-2_rotate_myArm
#include <GL/glut.h>
void myBody()
{
    glPushMatrix(); ///備份矩陣
        glColor3f(1, 0, 0); ///紅色的
        glutWireCube(0.6); ///myBody()
    glPopMatrix(); ///還原矩陣
}
void myArm()
{
    glPushMatrix();
        glColor3f(0, 1, 0); ///綠色的
        glScalef(1, 0.4, 0.4); ///myArm();
        glutWireCube(0.3);
    glPopMatrix();
}
float angle = 0; ///旋轉的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    myBody(); ///我的身體
    glPushMatrix();
        glRotatef(angle++, 0, 0, 1); ///旋轉的角度
        myArm(); ///我的手臂
    glPopMatrix();

    glutSwapBuffers();
}
int main(int argc, char*argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 Microsoft Visual Studio");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();
}


week10-3_rotate_translate_myArm


1. File-New-Project , GLUT專案 week10-3_rotate_translate_myArm

2. 貼上 week10-2 的程式

3. 加上glTranslatef(0.15, 0, 0)


///week10-3_rotate_translate_myArm
#include <GL/glut.h>
void myBody()
{
    glPushMatrix(); ///備份矩陣
        glColor3f(1, 0, 0); ///紅色的
        glutWireCube(0.6); ///myBody()
    glPopMatrix(); ///還原矩陣
}
void myArm()
{
    glPushMatrix();
        glColor3f(0, 1, 0); ///綠色的
        glScalef(1, 0.4, 0.4); ///myArm();
        glutWireCube(0.3);
    glPopMatrix();
}
float angle = 0; ///旋轉的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    myBody(); ///我的身體
    glPushMatrix();
        glRotatef(angle++, 0, 0, 1); ///旋轉的角度
        glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
        myArm(); ///我的手臂
    glPopMatrix();

    glutSwapBuffers();
}
int main(int argc, char*argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week10-3 Microsoft Visual Studio");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop();
}

week10-4_translate_rotate_translate_myArm


1. File-New-Project , GLUT專案 week10-4_translate_rotate_translate_myArm

2. 貼上 week10-3的程式

3. 加上最後一行 glTranslatef(0.3, 0.3, 0); 放最後面 推上去


///week10-4_translate_rotate_translate_myArm
#include <GL/glut.h>
void myBody()
{
    glPushMatrix(); ///備份矩陣
        glColor3f(1, 0, 0); ///紅色的
        glutWireCube(0.6); ///myBody()
    glPopMatrix(); ///還原矩陣
}
void myArm()
{
    glPushMatrix();
        glColor3f(0, 1, 0); ///綠色的
        glScalef(1, 0.4, 0.4); ///myArm();
        glutWireCube(0.3);
    glPopMatrix();
}
float angle = 0; ///旋轉的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    myBody(); ///我的身體
    glPushMatrix();
        glTranslatef(0.3, 0.3, 0);
        glRotatef(angle++, 0, 0, 1); ///旋轉的角度
        glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
        myArm(); ///我的手臂
    glPopMatrix();

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

week10-5_TRT_TRT_myArm


1. File-New-Project , GLUT專案 week10-5_TRT_TRT_myArm

2. 貼上 week10-4 的程式

3. 把整套 glPushMatrix( ); glTranslatef( ) glRotatef( ) glTranslatef( ) myArm( ) glPopMatrix( ) 要插在中間


///week10-5_TRT_TRT_myArm
#include <GL/glut.h>
void myBody()
{
    glPushMatrix(); ///備份矩陣
        glColor3f(1, 0, 0); ///紅色的
        glutWireCube(0.6); ///myBody()
    glPopMatrix(); ///還原矩陣
}
void myArm()
{
    glPushMatrix();
        glColor3f(0, 1, 0); ///綠色的
        glScalef(1, 0.4, 0.4); ///myArm();
        glutWireCube(0.3);
    glPopMatrix();
}
float angle = 0; ///旋轉的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    myBody(); ///我的身體
    glPushMatrix();
        glTranslatef(0.3, 0.3, 0);
        glRotatef(angle++, 0, 0, 1); ///旋轉的角度
        glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
        myArm(); ///我的手臂
        glPushMatrix();
            glTranslatef(0.15, 0, 0);
            glRotatef(angle++, 0, 0, 1); ///旋轉的角度
            glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
            myArm(); ///我的手臂
        glPopMatrix();
    glPopMatrix();

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

week10-6_left_right_myArm


1. File-New-Project , GLUT專案 week10-6_left_right_myArm

2. 貼上 week10-5的程式


///week10-6_left_right_myArm
#include <GL/glut.h>
void myBody()
{
    glPushMatrix(); ///備份矩陣
        glColor3f(1, 0, 0); ///紅色的
        glutWireCube(0.6); ///myBody()
    glPopMatrix(); ///還原矩陣
}
void myArm()
{
    glPushMatrix();
        glColor3f(0, 1, 0); ///綠色的
        glScalef(1, 0.4, 0.4); ///myArm();
        glutWireCube(0.3);
    glPopMatrix();
}
float angle = 0; ///旋轉的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    myBody(); ///我的身體

    glPushMatrix(); ///右半邊
        glTranslatef(0.3, 0.3, 0);
        glRotatef(angle++, 0, 0, 1); ///旋轉的角度
        glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
        myArm(); ///我的右上臂
        glPushMatrix();
            glTranslatef(0.15, 0, 0);
            glRotatef(angle++, 0, 0, 1); ///旋轉的角度
            glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
            myArm(); ///我的右下臂
        glPopMatrix();
    glPopMatrix();

    glPushMatrix(); ///左半邊
        glTranslatef(-0.3, 0.3, 0);
        glRotatef(angle++, 0, 0, 1); ///旋轉的角度
        glTranslatef(-0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
        myArm(); ///我的左上臂
        glPushMatrix();
            glTranslatef(-0.15, 0, 0);
            glRotatef(angle++, 0, 0, 1); ///旋轉的角度
            glTranslatef(-0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
            myArm(); ///我的左下臂
        glPopMatrix();
    glPopMatrix();

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

week10-7_mouse_motion_angle_myArm


1. File-New-Project , GLUT專案 week10-7_mouse_motion_angle_myArm

2. 貼上 week10-6 的程式

3. 想要用 mouse motion 來操控, 所以 angle++ 都改成 angle (不要++)

4. 在 main( ) 加 glutMotionFunc(motion);

5. 加一個 void motion (int x, int y) 函式


///week10-7_mouse_motion_angle_myArm
#include <GL/glut.h>
void myBody()
{
    glPushMatrix(); ///備份矩陣
        glColor3f(1, 0, 0); ///紅色的
        glutWireCube(0.6); ///myBody()
    glPopMatrix(); ///還原矩陣
}
void myArm()
{
    glPushMatrix();
        glColor3f(0, 1, 0); ///綠色的
        glScalef(1, 0.4, 0.4); ///myArm();
        glutWireCube(0.3);
    glPopMatrix();
}
float angle = 0; ///旋轉的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    myBody(); ///我的身體

    glPushMatrix(); ///右半邊
        glTranslatef(0.3, 0.3, 0);
        glRotatef(angle, 0, 0, 1); ///旋轉的角度
        glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
        myArm(); ///我的右上臂
        glPushMatrix();
            glTranslatef(0.15, 0, 0);
            glRotatef(angle, 0, 0, 1); ///旋轉的角度
            glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
            myArm(); ///我的右下臂
        glPopMatrix();
    glPopMatrix();

    glPushMatrix(); ///左半邊
        glTranslatef(-0.3, 0.3, 0);
        glRotatef(angle, 0, 0, 1); ///旋轉的角度
        glTranslatef(-0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
        myArm(); ///我的左上臂
        glPushMatrix();
            glTranslatef(-0.15, 0, 0);
            glRotatef(angle, 0, 0, 1); ///旋轉的角度
            glTranslatef(-0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
            myArm(); ///我的左下臂
        glPopMatrix();
    glPopMatrix();

    glutSwapBuffers();
}

void motion(int x, int y)
{
    angle = x;
    glutPostRedisplay();
}

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

    glutDisplayFunc(display);
    glutMotionFunc(motion); ///week10-7 加上 mouse motion
    glutIdleFunc(display);

    glutMainLoop();
}

week10-8_mouse_motion_angle_2_myArm


1. File-New-Project , GLUT專案 week10-8_mouse_motion_angle_2_myArm

2. 貼上 week10-7 的程式

3. 把 display() 裡面的 左邊的 angle 改成 -angle (讓左右的角度, 正負相反)


///week10-8_mouse_motion_angle_2_myArm
#include <GL/glut.h>
void myBody()
{
    glPushMatrix(); ///備份矩陣
        glColor3f(1, 0, 0); ///紅色的
        glutWireCube(0.6); ///myBody()
    glPopMatrix(); ///還原矩陣
}
void myArm()
{
    glPushMatrix();
        glColor3f(0, 1, 0); ///綠色的
        glScalef(1, 0.4, 0.4); ///myArm();
        glutWireCube(0.3);
    glPopMatrix();
}
float angle = 0; ///旋轉的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    myBody(); ///我的身體

    glPushMatrix(); ///右半邊
        glTranslatef(0.3, 0.3, 0);
        glRotatef(angle, 0, 0, 1); ///旋轉的角度
        glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
        myArm(); ///我的右上臂
        glPushMatrix();
            glTranslatef(0.15, 0, 0);
            glRotatef(angle, 0, 0, 1); ///旋轉的角度
            glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
            myArm(); ///我的右下臂
        glPopMatrix();
    glPopMatrix();

    glPushMatrix(); ///左半邊
        glTranslatef(-0.3, 0.3, 0);
        glRotatef(-angle, 0, 0, 1); ///旋轉的角度
        glTranslatef(-0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
        myArm(); ///我的左上臂
        glPushMatrix();
            glTranslatef(-0.15, 0, 0);
            glRotatef(-angle, 0, 0, 1); ///旋轉的角度
            glTranslatef(-0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
            myArm(); ///我的左下臂
        glPopMatrix();
    glPopMatrix();

    glutSwapBuffers();
}

void motion(int x, int y)
{
    angle = x;
    glutPostRedisplay();
}

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

    glutDisplayFunc(display);
    glutMotionFunc(motion); ///week10-7 加上 mouse motion
    glutIdleFunc(display);

    glutMainLoop();
}

week10-9_PlaySound


1. File-New-Project , GLUT專案 week10-9_PlaySound

2. 貼上 week10-8 的程式

3. 在 #include 的地方, 加上 #include <windows.h> 或 #include <mmsystem.h>

4. 在 main( ) 的第一行, 加入 PlaySound("你的wav檔.wav", Null, SND_ASYNC);

5. 把老師傳的 horse.wav 放在 C:目錄裡


///week10-9_PlaySound
#include <GL/glut.h>
#include <mmsystem.h>
void myBody()
{
    glPushMatrix(); ///備份矩陣
        glColor3f(1, 0, 0); ///紅色的
        glutWireCube(0.6); ///myBody()
    glPopMatrix(); ///還原矩陣
}
void myArm()
{
    glPushMatrix();
        glColor3f(0, 1, 0); ///綠色的
        glScalef(1, 0.4, 0.4); ///myArm();
        glutWireCube(0.3);
    glPopMatrix();
}
float angle = 0; ///旋轉的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    myBody(); ///我的身體

    glPushMatrix(); ///右半邊
        glTranslatef(0.3, 0.3, 0);
        glRotatef(angle, 0, 0, 1); ///旋轉的角度
        glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
        myArm(); ///我的右上臂
        glPushMatrix();
            glTranslatef(0.15, 0, 0);
            glRotatef(angle, 0, 0, 1); ///旋轉的角度
            glTranslatef(0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
            myArm(); ///我的右下臂
        glPopMatrix();
    glPopMatrix();

    glPushMatrix(); ///左半邊
        glTranslatef(-0.3, 0.3, 0);
        glRotatef(-angle, 0, 0, 1); ///旋轉的角度
        glTranslatef(-0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
        myArm(); ///我的左上臂
        glPushMatrix();
            glTranslatef(-0.15, 0, 0);
            glRotatef(-angle, 0, 0, 1); ///旋轉的角度
            glTranslatef(-0.15, 0, 0); ///右移 把選轉中心, 放在畫面的正中心
            myArm(); ///我的左下臂
        glPopMatrix();
    glPopMatrix();

    glutSwapBuffers();
}

void motion(int x, int y)
{
    angle = x;
    glutPostRedisplay();
}

int main(int argc, char*argv[])
{
    PlaySound("C://horse.wav", NULL, SND_ASYNC);
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week10-9");

    glutDisplayFunc(display);
    glutMotionFunc(motion); ///week10-7 加上 mouse motion
    glutIdleFunc(display);

    glutMainLoop();
}






















































沒有留言:

張貼留言