2024年4月25日 星期四

week10 電腦圖學

 week10-1_glutWireCube_myBody_myArm畫出身體和手臂
1.安裝freeglut,把 lib\libglut.a 複製成 libglut32.a
2.新增GLUT專案=> week10-1_glutWireCube_myBody_myArm
3.貼上上週 week09-3 的程式碼
4.把 void display() 改寫一下,呼叫 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("week10-1 myBody myArm");
glutDisplayFunc(display);
glutMainLoop();
}

執行結果(兩個框框):


 week10-2_rotate_myArm
1.新增GLUT專案=> week10-2_rotate_myArm
2.貼上 week10-1 的程式
3.外面加上 float angle=0; //旋轉的角度
4.在 main() 加上 glutIdleFunc(display);///有空就旋轉
5.在 display() 前加上 float angle=0;  在display裡加上 glPushMatrix();、glRotatef(angle++, 0, 0, 1);、glPopMatrix(); 在 main 裡加上 glutIdleFunc(display);

執行結果:(手臂在肚子裡旋轉)

week10-3_rotate_translate_myArm
1.新增GLUT專案=>week10-3_rotate_translate_myArm
2.貼上week10-2的程式
3.加上一行程式 =>glTranslatef(0.15, 0, 0);

程式碼:
#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");
glutDisplayFunc(display);
glutIdleFunc(display);///有空有旋轉
glutMainLoop();
}

執行結果:(手臂朝肚子正中心旋轉)

week10-4_translate_rotate_translate_myArm
1.新增GLUT專案=> week10-4_translate_rotate_translate_myArm
2.貼上 week10-3 的程式
3.加上最後一行  glTranslatef(0.3, 0.3, 0); //放最上面掛到肩膀上

執行結果:(旋轉中的手臂)


week10-5_TRT_TRT_myArm
1.新增GLUT專案=> week10-5_TRT_TRT_myArm
2.貼上 week10-4 的程式
3.把整套glPushMatrix();~glPopMatrix(); 複製貼上改數值

程式碼:
#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);///(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();
}

執行結果:(旋轉中的兩段式手臂)


week10-6_left_right_myArm
1.新增GLUT專案=> week10-6_left_right_myArm
2.貼上 week10-5 的程式
3.加上左半邊手=>複製右半邊=>改數值 

執行結果:(太極拳手臂)


week10-7_mouse_motion_angle_myArm
1.新增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) 函式

程式碼:
#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);///(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)///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.新增GLUT專案=> week10-8_mouse_motion_angle_2_myArm
2.貼上 week10-7 的程式
3.把 display() 裡面的 左邊的 angle 改成 -angle (讓左右兩邊的角度,正負相反)


week10-9_PlaySound
1.新增GLUT專案=> week10-9_PlaySound
2.貼上 week10-8 的程式
3.在 #include 的地方,加上 #include <mmsystem.h>
4.在 main() 的第1行,加入 PlaySound("C:/horse.wav", NULL, SND_ASYNC);
5.把 horse.wav 放在 C: 根目錄裡


執行結果:(有馬跑步聲)

沒有留言:

張貼留言