2019年5月9日 星期四

06160123_Week12電腦圖學

🔺電腦圖學2019-05-09 Week12


(1)主題:鍵盤

(2)主題:聲音、音樂

(3)複習:階層 T-R-T 骨架

(4)作業:能操控的機器人

到Google搜尋wav下載> download音樂()


下載後要將檔名更改成英文(Breez.wav),否則在CodeBlock裡會無法執行


開啟CodeBlocks > New > Project > Console application




修改一下程式碼
使程式可以播放出聲音

#include <windows.h>///(3)因為一些基礎Windows型別
#include <mmsystem.h>///(1)Multimedia System裡面有聲音的函式

int main()
{

    PlaySoundA("C:\\Users\\user\\Downloads\\breez.wav",NULL, SND_SYNC);
    PlaySoundA("C:\\Users\\user\\Downloads\\breez.wav",NULL, SND_SYNC);
    PlaySoundA("C:\\Users\\user\\Downloads\\breez.wav",NULL, SND_SYNC);
    ///(2)播放聲音Play Sound ASCII英文的檔名
}

最後在執行時,專案的設定,要在link時,加入一個 winmm 的library
project > Build options > Linker setting > Add > Add library





執行結果:



我們會發現,聽得見聲音,但小黑窗無法顯示撥放的過程
所以我們增加一些程式,用printf配合音樂,讓音樂播放的過程更容易被識別



程式碼如下:

#include <windows.h>///(3)因為一些基礎Windows型別
#include <mmsystem.h>///(1)Multimedia System裡面有聲音的函式
#include <stdio.h>///配合printf
//using namespace std;

int main()
{

    printf("播放第一次\n");///配合printf讓音樂播放的過程更容易被識別
    PlaySoundA("C:\\Users\\user\\Downloads\\breez.wav",NULL, SND_SYNC);
    printf("播放第二次\n");///配合printf讓音樂播放的過程更容易被識別
    PlaySoundA("C:\\Users\\user\\Downloads\\breez.wav",NULL, SND_SYNC);
    printf("播放第三次\n");///配合printf讓音樂播放的過程更容易被識別
    PlaySoundA("C:\\Users\\user\\Downloads\\breez.wav",NULL, SND_SYNC);

    ///(2)播放聲音Play Sound ASCII英文的檔名
}

-
現在改用3D Project 來撰寫聲音的程式碼

#開啟GLUT

1、Download Freeglut package

2、將檔案解壓縮後複製一個libfreeglut.a檔並重新命名為libglut32.a

3、開啟Code Blocks>新增一個新的專案>點選Glut project

4、命名專案>選擇資料存放區(C:\Users\user\Downloads\freeglut\lib)>Finish

5、於左側project開啟程式碼>執行









加入兩列程式碼:

#include <mmsystem.h>
    PlaySoundA("C:\\Users\\user\\Downloads\\breez.wav",NULL, SND_SYNC);


全部程式碼如下:



#ifdef __APPLE__
#else
#include <GL/glut.h>
#endif

#include <stdlib.h>

static int slices = 16;
static int stacks = 16;

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

static void display(void)
{
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);

    glPushMatrix();
        glTranslated(-2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(-2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glutSwapBuffers();
}


static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;

        case '+':
            slices++;
            stacks++;
            break;

        case '-':
            if (slices>3 && stacks>3)
            {
                slices--;
                stacks--;
            }
            break;
    }

    glutPostRedisplay();
}

static void idle(void)
{
    glutPostRedisplay();
}

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

#include <mmsystem.h>

int main(int argc, char *argv[])
{
    PlaySoundA("C:\\Users\\user\\Downloads\\breez.wav",NULL, SND_SYNC);
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

    return EXIT_SUCCESS;
}

程式運行方式:

跳出黑窗時先撥放Breez音檔
音檔播放完畢即跳出3D動圖



-

現在加入新的音檔(do/re/mi/fa/so)
配合鍵盤彈出音階 do=1/re=2/mi=3/fa=4/so=5

加入程式碼:

#include <mmsystem.h>

    if(key=='1')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\do.wav",NULL, SND_ASYNC);
    if(key=='2')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\re.wav",NULL, SND_ASYNC);
    if(key=='3')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\mi.wav",NULL, SND_ASYNC);
    if(key=='4')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\fa.wav",NULL, SND_ASYNC);
    if(key=='5')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\so.wav",NULL, SND_ASYNC);


全部程式碼如下:

#ifdef __APPLE__
#else
#include <GL/glut.h>
#endif

#include <stdlib.h>

static int slices = 16;
static int stacks = 16;

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

static void display(void)
{
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);

    glPushMatrix();
        glTranslated(-2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(-2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glutSwapBuffers();
}

#include <mmsystem.h>
static void key(unsigned char key, int x, int y)
{
    if(key=='1')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\do.wav",NULL, SND_ASYNC);
    if(key=='2')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\re.wav",NULL, SND_ASYNC);
    if(key=='3')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\mi.wav",NULL, SND_ASYNC);
    if(key=='4')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\fa.wav",NULL, SND_ASYNC);
    if(key=='5')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\so.wav",NULL, SND_ASYNC);
    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;

        case '+':
            slices++;
            stacks++;
            break;

        case '-':
            if (slices>3 && stacks>3)
            {
                slices--;
                stacks--;
            }
            break;
    }

    glutPostRedisplay();
}

static void idle(void)
{
    glutPostRedisplay();
}

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };


int main(int argc, char *argv[])
{
    PlaySoundA("C:\\Users\\user\\Downloads\\breez.wav",NULL, SND_SYNC);
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

    return EXIT_SUCCESS;

}



程式運行方式:

跳出黑窗時先撥放Breez音檔
音檔播放完畢即跳出3D動圖,跳出後即可配而鍵盤突出音階

到小葉的網站下載CMP3_MCI.h音檔 > 下載後放入自己的專案內




-

改寫撥MP3的程式碼

加入程式碼:
#include "CMP3_MCI.h"///(1)雙引號,先找自己現在的目錄,Class for MP3 by MCI方法
CMP3_MCI myMP3;///(2)宣告一個我們要用的物件

#include <mmsystem.h>
int main(int argc, char *argv[])
{
    myMP3.Load("C:\\Users\\user\\Downloads\\breez.wav");///(3)Load我們的MP3

    myMP3.Play();///(4)Play他就成功了


全部程式碼如下:


#ifdef __APPLE__
#else
#include <GL/glut.h>
#endif

#include <stdlib.h>

static int slices = 16;
static int stacks = 16;

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

static void display(void)
{
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);

    glPushMatrix();
        glTranslated(-2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(-2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glutSwapBuffers();
}


#include <mmsystem.h>
static void key(unsigned char key, int x, int y)
{
    if(key=='1')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\do.wav",NULL, SND_ASYNC);
    if(key=='2')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\re.wav",NULL, SND_ASYNC);
    if(key=='3')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\mi.wav",NULL, SND_ASYNC);
    if(key=='4')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\fa.wav",NULL, SND_ASYNC);
    if(key=='5')  PlaySoundA("C:\\Users\\user\\Downloads\\music\\so.wav",NULL, SND_ASYNC);
    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;

        case '+':
            slices++;
            stacks++;
            break;

        case '-':
            if (slices>3 && stacks>3)
            {
                slices--;
                stacks--;
            }
            break;
    }

    glutPostRedisplay();
}

static void idle(void)
{
    glutPostRedisplay();
}

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

#include "CMP3_MCI.h"///(1)雙引號,先找自己現在的目錄,Class for MP3 by MCI方法
CMP3_MCI myMP3;///(2)宣告一個我們要用的物件

#include <mmsystem.h>
int main(int argc, char *argv[])
{
    myMP3.Load("C:\\Users\\user\\Downloads\\breez.wav");///(3)Load我們的MP3

    myMP3.Play();///(4)Play他就成功了

    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

    return EXIT_SUCCESS;

}


程式運行方式:

跳出黑窗時會播放MP3檔
音檔播放完畢即跳出3D動圖,跳出後即可配而鍵盤突出音階

沒有留言:

張貼留言