2024年4月25日 星期四

魚鱗☆゚.*・。電腦圖學 Week10

1. week10-1_glutWireCube_myBody_myArm

(1)安裝freeglut

(2)開啟新專案:week10-1_glutWireCube_myBody_myArm

(3)把上週的week09-3_glutWireTeapot_glutWireCube_glutWireSphere程式碼貼上

#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
            glTranslatef(-0.5, +0.3, 0);
            glutSolidTeapot(0.3);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(+0.0, +0.3, 0);
            glutSolidCube(0.3);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(+0.5, +0.3, 0);
            glutSolidSphere(0.3,30,30);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(-0.5, -0.3, 0);
            glutWireTeapot(0.3);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(+0.0, -0.3, 0);
            glutWireCube(0.3);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(+0.5, -0.3, 0);
            glutWireSphere(0.3,30,30);
        glPopMatrix();

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

(4)要把void display改寫一下

#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1, 0, 0);
        glutWireCube(0.6);///myBody()
    glPopMatrix();
    glPushMatrix();
        glColor3f(0, 1, 0);
        glScalef(1, 0.4, 0.4);
        glutWireCube(0.3);///myArm()
    glPopMatrix();

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

(5)呼叫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);
        glutWireCube(0.3);///myArm()
    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("week10");
glutDisplayFunc(display);
glutMainLoop();
}

2. week10-2_rotate_myArm

(1)開啟新專案:week10-2_rotate_myArm

(2)貼上week10-1_glutWireCube_myBody_myArm的程式碼

(3)加一下旋轉的程式

#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);
        glutWireCube(0.3);///myArm()
    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();
}

3. week10-3_rotate_translate_myArm

(1)開啟新專案:week10-3_rotate_translate_myArm

(2)貼上week10-2_rotate_myArm的程式碼

(3)加上一行移動的程式碼

#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);
        glutWireCube(0.3);///myArm()
    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");
glutDisplayFunc(display);
glutIdleFunc(display);///有空就旋轉
glutMainLoop();
}

4. week10-4_translate_rotate_translate_myArm

(1)開啟新專案:week10-4_translate_rotate_translate_myArm

(2)貼上week10-3_rotate_translate_myArm的程式碼

(3)加上最後一行放最上面(掛上去)

#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);
        glutWireCube(0.3);///myArm()
    glPopMatrix();
}
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();
    glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char*argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week10");
glutDisplayFunc(display);
glutIdleFunc(display);///有空就旋轉
glutMainLoop();
}

5. week10-5_TRT_TRT_myArm

(1)開啟新專案:week10-5_TRT_TRT_myArm

(2)貼上week10-4_translate_rotate_translate_myArm的程式碼

(3)把display函數裡的手臂程式複製起來,在插入進去

#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);
        glutWireCube(0.3);///myArm()
    glPopMatrix();
}
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();
}
int main(int argc, char*argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week10");
glutDisplayFunc(display);
glutIdleFunc(display);///有空就旋轉
glutMainLoop();
}

6. week10-6_left_right_myArm

(1)開啟新專案:week10-6_left_right_myArm

(2)貼上week10-5_TRT_TRT_myArm的程式碼

(3)加上左半邊手臂的程式

#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);
        glutWireCube(0.3);///myArm()
    glPopMatrix();
}
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();

    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();
}
int main(int argc, char*argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week10");
glutDisplayFunc(display);
glutIdleFunc(display);///有空就旋轉
glutMainLoop();
}

7. week10-7_mouse_motion_angle_myArm

(1)開啟新專案:week10-7_mouse_motion_angle_myArm

(2)貼上week10-6_left_right_myArm的程式碼

(3)想要用滑鼠操控,所以angle++都改成angle(不要++);在main()加glutMotionFunc(motion),加一個void motion(int x, int y)函式

#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);
        glutWireCube(0.3);///myArm()
    glPopMatrix();
}
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();
    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();
}
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");
glutDisplayFunc(display);
glutMotionFunc(motion);
glutIdleFunc(display);///有空就旋轉
glutMainLoop();
}

8. week10-8_mouse_motion_angle_2_myArm

(1)開啟新專案:week10-8_mouse_motion_angle_2_myArm

(2)貼上week10-7_mouse_motion_angle_myArm的程式碼

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

#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);
        glutWireCube(0.3);///myArm()
    glPopMatrix();
}
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();
    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();
}
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");
glutDisplayFunc(display);
glutMotionFunc(motion);
glutIdleFunc(display);///有空就旋轉
glutMainLoop();
}

9. week10-9_PlaySound

(1)開啟新專案:week10-9_PlaySound

(2)貼上week10-8_mouse_motion_angle_2_myArm的程式碼

(3)先把音檔放在C槽,在#include的地方,加上#include <mmsystem.h>,在main()的第1行,加入PlaySound("C:/horse.wav", NULL, SND_ASYNC);

#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);
        glutWireCube(0.3);///myArm()
    glPopMatrix();
}
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();
    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();
}
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");
glutDisplayFunc(display);
glutMotionFunc(motion);
glutIdleFunc(display);///有空就旋轉
glutMainLoop();
}

執行後就有聲音了

10. 上傳Github

沒有留言:

張貼留言