2024年4月25日 星期四

Bai's-電腦圖學-Week10

 #Week10


0.freeglut 

week10-1_glutWireCube_myBody_myArm

貼上week09-3 的程式
改寫 void display()改寫一下 呼叫myBody() myArm()

留下wireCube

綠色手臂 紅色是身體
-----------------------------------------------------------------------------------------------------------------------------
#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");
glutDisplayFunc(display);
glutMainLoop();
}
-----------------------------------------------------------------------------------------------------------------------------

week10-2_rotate_myArm

加上float angle = 0; #旋轉的角度
-----------------------------------------------------------------------------------------------------------------------------
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_translate_myArm

貼上week10-2程式
-----------------------------------------------------------------------------------------------------------------------------
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_translate_rotate_translate_myArm

貼上week10-3程式
加上一行glTranslatef(0.3, 0.3, 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(); ///我的手臂/// week10-3_rotate_translate_myArm
    glPopMatrix();

    glutSwapBuffers();
}
-----------------------------------------------------------------------------------------------------------------------------


week10-5_TRT_TRT_myArm








week10-6_left_right_myArm

貼上10-5的程式...

week10-7_mouse_motion_angle_myArm

用滑鼠控制手臂
在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);///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(); ///我的右上手臂/// week10-3_rotate_translate_myArm
        glPushMatrix();
            glTranslatef(0.15, 0, 0);   ///(3) 掛到手肘上
            glRotatef(angle, 0, 0, 1);///(2) 旋轉
            glTranslatef(0.15, 0, 0);   ///(1) 把旋轉中心, 放在畫面的正中心
            myArm(); ///我的右下手臂/// week10-3_rotate_translate_myArm
        glPopMatrix();
    glPopMatrix();

    glPushMatrix(); ///左半邊
        glTranslatef(-0.3, 0.3, 0);  ///(3) 掛到肩上
        glRotatef(-angle, 0, 0, 1);///(2) 旋轉
        glTranslatef(-0.15, 0, 0);   ///(1) 把旋轉中心, 放在畫面的正中心
        myArm(); ///我的左上手臂/// week10-3_rotate_translate_myArm
        glPushMatrix();
            glTranslatef(-0.15, 0, 0);   ///(3) 掛到手肘上
            glRotatef(-angle, 0, 0, 1);///(2) 旋轉
            glTranslatef(-0.15, 0, 0);   ///(1) 把旋轉中心, 放在畫面的正中心
            myArm(); ///我的左下手臂/// week10-3_rotate_translate_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

貼上week10-7 程式
將display()的angle 改成-angle (左右角度正負相反)


week10-9_PlaySound

貼上week10-8的程式
在include的地方,加上#include<windows.h> 或#include<mmsystem.h>
在main函式第一行加入
    PlaySound("C:/wav檔案wav", NULL, SND_ASYNC);  ///播放聲音, 檔案放在C:根目錄

沒有留言:

張貼留言