2024年4月25日 星期四

電腦圖學week10

##小考預告T-R-T轉動

glPushMatrix();

        glTranslatef(0.3,0.3,0);///移動後的位置

        glRotatef(angle++,0,0,1);///(2)旋轉的角度

        glTranslatef(0.15,0,0);///(1)原本的位置正負相反

        drawHand();

    glPopMatrix();


##week10-1_glutWireCube_myBody_myArm

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

2.貼上上周的week09-3_glutWireTeapot_guldWireCube_glutWireSphere

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

```cpp

#include <GL/glut.h>

void display()

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


glPushMatrix();///備份矩陣

        ///glTranslatef(+0.0,+0.3,0);

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

        glutWireCube(0.6);///myBody()

    glPopMatrix();///還原矩陣


    glPushMatrix();

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

        glScalef(1,0.4,0.4);///myArm();

        glutWireCube(0.3);


    glPopMatrix();


glutSwapBuffers();

}

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

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

glutCreateWindow("week09 Microsoft Visual Studio");

glutDisplayFunc(display);

glutMainLoop();

}






```cpp

#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()  和

glRotated(anfle++,0,0,1);

```cpp

#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("week10");

glutDisplayFunc(display);

glutIdleFunc(display);///有空就旋轉

glutMainLoop();

}




##week10-3_rotate_translatef_myArm

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

2.貼上week10-2的程式

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

```cpp

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();

}


##week10-4_translatef_rotatef_translatef_myArm

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

2.貼上week10-3的程式

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

```cpp

void display()

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    myBody();///我的身體

    glPushMatrix();

        glTranslatef(0.3,0.3,0);///(3)掛到肩上

        glRotatef(angle++,0,0,1);///(2)旋轉的角度

        glTranslatef(0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

        myArm();///我的手臂

    glPopMatrix();

glutSwapBuffers();

}




##week10-5_TRT_TRT_myArm

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

2.貼上week10-4的程式

3.要把整套glPushMatrix();加進去

```cpp

float angle=0;

void display()

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    myBody();///我的身體

    glPushMatrix();

        glTranslatef(0.3,0.3,0);///(3)掛到肩上

        glRotatef(angle++,0,0,1);///(2)旋轉的角度

        glTranslatef(0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

        myArm();///我的手臂

        glPushMatrix();

            glTranslatef(0.15,0,0);///(3)掛到肩上

            glRotatef(angle++,0,0,1);///(2)旋轉的角度

            glTranslatef(0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

            myArm();///我的手臂

            glPopMatrix();

    glPopMatrix();

glutSwapBuffers();

}



##week10-6_left_right_myArm

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

2.貼上week10-5的程式

3.改成負的

```cpp

glPushMatrix();///右半邊

        glTranslatef(0.3,0.3,0);///(3)掛到肩上

        glRotatef(angle++,0,0,1);///(2)旋轉的角度

        glTranslatef(0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

        myArm();///我的右上手臂

        glPushMatrix();

            glTranslatef(0.15,0,0);///(3)掛到手肘上

            glRotatef(angle++,0,0,1);///(2)旋轉的角度

            glTranslatef(0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

            myArm();///我的右下手臂

            glPopMatrix();

    glPopMatrix();


    glPushMatrix();///左半邊

        glTranslatef(-0.3,0.3,0);///(3)掛到肩上

        glRotatef(angle++,0,0,1);///(2)旋轉的角度

        glTranslatef(-0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

        myArm();///我的左上手臂

        glPushMatrix();

            glTranslatef(-0.15,0,0);///(3)掛到手肘上

            glRotatef(angle++,0,0,1);///(2)旋轉的角度

            glTranslatef(-0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

            myArm();///我的左下手臂

            glPopMatrix();

    glPopMatrix();

glutSwapBuffers();



##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)函式

```cpp(刪掉angle++的++)

glPushMatrix();///右半邊

        glTranslatef(0.3,0.3,0);///(3)掛到肩上

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

        glTranslatef(0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

        myArm();///我的右上手臂

        glPushMatrix();

            glTranslatef(0.15,0,0);///(3)掛到手肘上

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

            glTranslatef(0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

            myArm();///我的右下手臂

            glPopMatrix();

    glPopMatrix();


    glPushMatrix();///左半邊

        glTranslatef(-0.3,0.3,0);///(3)掛到肩上

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

        glTranslatef(-0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

        myArm();///我的右上手臂

        glPushMatrix();

            glTranslatef(-0.15,0,0);///(3)掛到手肘上

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

            glTranslatef(-0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

            myArm();///我的右下手臂

            glPopMatrix();

    glPopMatrix();

```(新增)

void motion(int x,int y){///week10-7加上mouse motion

    angle=x;///week10-7加上mouse motion

    glutPostRedisplay();///告訴GLUT,貼上便利貼,請GLUT有空時,就要重畫畫面

}

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

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

glutCreateWindow("week10");

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

(讓左右的角度,正負相反)

```cpp

glPushMatrix();///右半邊

        glTranslatef(0.3,0.3,0);///(3)掛到肩上

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

        glTranslatef(0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

        myArm();///我的右上手臂

        glPushMatrix();

            glTranslatef(0.15,0,0);///(3)掛到手肘上

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

            glTranslatef(0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

            myArm();///我的右下手臂

            glPopMatrix();

    glPopMatrix();


    glPushMatrix();///左半邊

        glTranslatef(-0.3,0.3,0);///(3)掛到肩上

        glRotatef(-angle,0,0,1);///(2)旋轉的角度

        glTranslatef(-0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

        myArm();///我的右上手臂

        glPushMatrix();

            glTranslatef(-0.15,0,0);///(3)掛到手肘上

            glRotatef(-angle,0,0,1);///(2)旋轉的角度

            glTranslatef(-0.15,0,0);///(1)把旋轉的中心,放在畫面正中心

            myArm();///我的右下手臂

            glPopMatrix();

    glPopMatrix();


##week10-9_PlaySound

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

2.貼上week10-8的程式

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

4.在main()的第一行,加上PlaySound("C:/horse.wav",NULL,SND_ASYNC)

5.把老師給你的horse.wav放在C:根目錄裡

```cpp

#include <GL/glut.h>

#include <mmsystem.h>

```

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

{

    PlaySound("C:/horse.wav",NULL,SND_ASYNC);

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

glutCreateWindow("week10");

glutDisplayFunc(display);

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

glutIdleFunc(display);///有空就旋轉

glutMainLoop();

}





沒有留言:

張貼留言