顯示具有 05161056_洪佳伶 標籤的文章。 顯示所有文章
顯示具有 05161056_洪佳伶 標籤的文章。 顯示所有文章

2018年6月4日 星期一

Week15_+0筆記

內容回顧

glutSolidSphere(1,slices,stacks);
SolidSphere實心圓
(1,slices,stacks) : (半徑,切,切)

glutSolidCone(1,1,slices,stacks); 錐體
glutSolidTorus(0.2,0.8,slices,stacks);甜甜圈形

glutWireSphere(1,slices,stacks);空心圓
1:建立 OpenGL project、GLET project

2:點線面、顏色


3:移動、旋轉、縮放.
移動、旋轉、縮放
跑Transformation.ex
4:矩陣

5: T-R-T特定軸
6. glm.h 3D模型
# include "glm.h"
GLM*pmodel =NULL;

畫圖: if(pmodel==NULL){
glmReadOBJ("...")

}
glmDraw(pmdel);
7:讀OBJ檔、設定compiler.
小心CodeBlocks專案&Setting-Compiler要設對 ,glm.cpp要在才行Compiler

8:打光、陣列(安裝OpenCv, 設目錄link, 秀圖)
10:貼圖 、OpenCV

11:聲音、音效 Keyboard 配 PlaySound() 變鋼琴鍵盤

CMP3_MCI.h 可攜MP3

12:計時器

13:讀寫檔案

14:攝影機、投影矩陣



貼圖



音樂播放
void mouse (int button,int state, int x,int y);
{
     if(state==GLUT_DOWN) PlaySound("Shot.wav",NULL, SND_ASYNC);
}
//按滑鼠就會播聲音

音樂檔要放入 freeglut的bin裡面
moodle下載 CMP3_MCI.h 放在自己建立的coldblock檔裡就可以播MP3

myMP3.Load("123.mp3");
myMP3.play(); 

2018年5月28日 星期一

Week14_+0筆記

主題:攝影機、投影矩陣.


改攝影機角度

透視投影



改變投影的設定值

glutReshapeFunc(resize);.

了解攝影機

改攝影機角度 視窗拉大圖不會變大

#include <GL/glut.h>
#include <stdio.h>
FILE * fout=NULL;     ///(0)宣告檔案的指標,一開始是空的
float angle=60, angle2=90, angle3=60;      ///準備3個角度的值
void keyboard(unsigned char key, int x, int y)
{
    if(key=='s' || key=='S' || key=='w' || key=='W'){
        if(fout==NULL) fout=fopen("output.txt", "w+");
        ///上面這行,只有第一次按s鍵,才會還沒有值,才fopen
        ///因為第二次按s鍵,fout名花有主,不會再重覆開檔案
        printf("%.3f %.3f %.3f\n", angle,angle2,angle3);
        fprintf(fout, "%.3f %.3f %.3f\n", angle,angle2,angle3);
    }///3個角度的值,印到檔案去
}
///打光的陣列之前全部刪掉, 陣列不要刪
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 };

/* Program entry point */
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///Now: 要畫東西
    glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
        glutSolidTeapot(0.3);///Now:身體

        glPushMatrix();  ///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
            glTranslatef(0.4, 0, 0);  ///Now:(3) 掛在右邊
            glRotatef(angle, 0,0,1);  ///Now:(2) angle的轉動角度,對Z軸
            glTranslatef(0.4, 0, 0);  ///Now:(1) 往右移,讓手把在中間
            glutSolidTeapot(0.3);  ///Now:右手臂
        glPopMatrix();  ///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
    glPopMatrix();  ///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
    glutSwapBuffers();
}
void motion(int x, int y)///Now:
{///Now:
    angle = x;///Now: 角度會隨mouse motion而改值
    glutPostRedisplay();///Now:
}///Now:

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;///aspect rotio 長寬比

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
    gluLookAt(0,3,1,  0,0,0,  0,1,0);
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutMotionFunc(motion);///Now: 加上motion事件

    glutKeyboardFunc(keyboard);
    ///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;
}

作業四講解


#include <GL/glut.h>
#include <stdio.h>///要檔案
FILE * fout=NULL;///(0)宣告檔案的指標,一開始是空的
//float angle=60, angle2=90, angle3=60;///準備3個角度的值
float angle[20]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

int ID=0;
float oldAngle[20]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
float newAngle[20]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void timer (int t)
{
    printf("%d\n",t);
    glutTimerFunc(30,timer,t+1);

    if(t%100==0)
    {
        if(fin==NULL) fin =fopen("output.txt","r");
        for(int i=0; i<20; i++)
        {
            oldAngle[i]= newAngle[i];
            fscanf(fin,"%f",&newAngle[i]);
        }
    }
    float alpha =(t%100)/100.0;
    for(int i=0; i<20; i++)
    {
        angle[i]=newAngle[i]*alpha+oldAngle[i]*(1-alpha);
    }
}
void keyboard(unsigned char key, int x, int y)
{
    if(key=='1') ID=1;
    if(key=='1') ID=2;
    if(key=='1') ID=3;
    if(key=='1') ID=4;
    if(key=='1') ID=5;
    if(key=='1') ID=6;
    if(key=='1') ID=7;
    if(key=='1') ID=8;
    if(key=='1') ID=9;
    if(key=='1') ID=0;
    if(key=='s' || key=='S' || key=='w' || key=='W')
    {
        if(fout==NULL) fout=fopen("output.txt", "w+");
        ///上面這行,只有第一次按s鍵,才會還沒有值,才fopen
        ///因為第二次按s鍵,fout名花有主,不會再重覆開檔案
        //printf("%.3f %.3f %.3f\n", angle,angle2,angle3);
        //fprintf(fout, "%.3f %.3f %.3f\n", angle,angle2,angle3);
        for(int i=0; i<20; i++)
        {
            printf("%.3f",angle[i]);
            fprintf(fout,"%.3f",angle[i]);
        }
        fprintf(fout,"\n");
    }///3個角度的值,印到檔案去
    if(key=='r')
    {
        if(fin==NULL) fin=fopen("output.txt","r");
        for(int i=0; i<20; i++)
        {
            fscanf(fin,"%f",&angle[i]);
            printf("%.3f",angle[i]);
        }
    }
    if(key=='p')
    {
        glutTimerFunc(0,timer,0);
    }
}
///打光的陣列之前全部刪掉, 陣列不要刪
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 };

/* Program entry point */
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///Now: 要畫東西
    glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
    glutSolidTeapot(0.3);///Now:身體

    glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
    glTranslatef(0.4, 0, 0);///Now:(3) 掛在右邊
    glRotatef(angle, 0,0,1);///Now:(2) angle的轉動角度,對Z軸
    glTranslatef(0.4, 0, 0);///Now:(1) 往右移,讓手把在中間
    glutSolidTeapot(0.3); ///Now:右手臂
    glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
    glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
    glutSwapBuffers();
}
void motion(int x, int y)///Now:
{
    ///Now:
    angle = x;///Now: 角度會隨mouse motion而改值
    glutPostRedisplay();///Now:
}///Now:

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;///aspect rotio 長寬比

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
    gluLookAt(0,3,1,  0,0,0,  0,1,0);
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutMotionFunc(motion);///Now: 加上motion事件

    glutKeyboardFunc(keyboard);
    ///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;
}

2018年5月21日 星期一

Week13_+0筆記

主題:
  1.寫檔案、讀檔
  2.控制關節
  3.動作內插


讀檔案



#include <stdio.h>
int main()
{
    FILE * fout=fopen("output.txt", "w+");
    printf("Hello word\n");
    fprintf(fout,"Hello word\n");
}



角度

增加三個浮點數
float angle=0, angle2=10, angle3=90;
fprintf(fout,"%.3f %.3f %.3f\n", angle, angle2, angle3);
要宣告float 角度
有幾個%.3f 後面就要有幾個變數,%.3f

#include <GL/glut.h>
#include <stdio.h>
FILE * fout=NULL;
float angle=0;
int oldX=0;
void mouse(int button, int state, int x, int y)
{
    oldX=x;
}
void motion(int x, int y)
{
    angle += x-oldX;
    oldX=x;
    if(fout==NULL)
    {
        fout = fopen("output.txt", "w+");
    }
    fprintf(fout, "%.3f\n", angle);
    printf("%.3f\n", angle);
    glutPostRedisplay();
}

void display()///以下是老師提供的
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot(0.3);///正中間,當成身體的茶壼
        glPushMatrix();
            glTranslatef(0.4, 0,0);///掛上去
            glRotatef(angle, 0,0,1);///
            glTranslatef(0.4, 0,0);///把柄放中間
            glutSolidTeapot(0.3);///右邊,當成手臂的茶壼
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
///上面是我們增加的程式碼
///打光的部分留著 (陣列,main() ) 其他都刪掉
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 };

/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    glutMouseFunc(mouse);
    glutMotionFunc(motion);

    ///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;
}


控制關節

動作內插



#include <GL/glut.h>
#include <stdio.h>
FILE * fout=NULL;///TODO:檔案一開始是空的 NULL
FILE * fin=NULL;///Now3: in檔案一開始是空的 NULL
//float angle=0, angle2, angle3, angle4, angle5, angle6;
float angle[20]={0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0};///Now4: 用陣列
int oldX=0, now=0;///angle[now]
void keyboard(unsigned char key, int x, int y)///Now3: 要記得main()註冊
{///Now3: 用keyboard來讀入動畫資料
    if(key=='1') now=1;///按1就會改變1號關節
    if(key=='2') now=2;///按2就會改變3號關節
    if(key=='3') now=3;
    if(key=='4') now=4;
    if(key=='5') now=5;
    if(key=='6') now=6;
    if(key=='7') now=7;
    if(key=='8') now=8;
    if(key=='9') now=9;
    if(key=='r' || key=='R'){///Now4: 按'r'才會讀入關節的角度,一次讀20個
        if(fin==NULL){///Now3: TODO:一開始是空指標,所以會進來if(..)
            fin=fopen("output.txt", "r");///Now4: r表示讀入read
        }
        for(int i=0;i<20;i++) fscanf(fin, "%f", &angle[i]);///Now4: 用陣列從檔案fin讀進來
    }
    if(key=='w' || key=='W' || key=='s' || key=='S'){///Now4: 按's'才會寫關節的角度,一次20個
        if(fout==NULL){///TODO:一開始是空指標,所以會進來if(..)
            fout = fopen("output.txt", "w+");///第一節教的開檔
        }///TODO:之後就不再是空指標了
        for(int i=0;i<20;i++) fprintf(fout, "%.3f\n", angle[i]);///TODO:把角度印到檔案裡
    }
//    fscanf(fin, "%f %f %f %f %f %f %f %f %f %f  %f %f %f %f %f %f %f %f %f %f",
//           &angle[0], &angle[1], &angle[2], &angle[3], &angle[4], &angle[5],
//           &angle[6], &angle[7], &angle[8], &angle[9], &angle[10], &angle[11],
//           &angle[12], &angle[13], &angle[14], &angle[15], &angle[16], &angle[17],
//           &angle[18], &angle[19]  );
    glutPostRedisplay();///Now3: 讀入資料,馬上重畫
}
void mouse(int button, int state, int x, int y)
{///TODO
    oldX=x;
}///TODO
void motion(int x, int y)///TODO: 用mouse motion來改關節angle
{///TODO:
    angle[now] += x-oldX; ///角度稍微增減, 以前教過把大象放到冰箱去的程式碼
    oldX=x;///把舊的更新成新的
    glutPostRedisplay();///TODO:重畫畫面
}
void display()///以下是老師提供的
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot(0.3);///正中間,當成身體的茶壼
        glPushMatrix();
            glTranslatef(0.4, 0,0);///掛上去
            glRotatef(angle[0], 0,0,1);///
            glTranslatef(0.4, 0,0);///把柄放中間
            glutSolidTeapot(0.3);///右邊,當成手臂的茶壼
            glPushMatrix();
                glTranslatef(0.4, 0,0);///掛上去
                glRotatef(angle[1], 0,0,1);///
                glTranslatef(0.4, 0,0);///把柄放中間
                glutSolidTeapot(0.3);///右邊,當成手臂的茶壼
            glPopMatrix();

        glPopMatrix();
        glPushMatrix();
            glTranslatef(-0.4, 0,0);///掛上去
            glRotatef(angle[2], 0,0,1);///
            glTranslatef(-0.4, 0,0);///把柄放中間
            glutSolidTeapot(0.3);///右邊,當成手臂的茶壼
            glPushMatrix();
                glTranslatef(-0.4, 0,0);///掛上去
                glRotatef(angle[3], 0,0,1);///
                glTranslatef(-0.4, 0,0);///把柄放中間
                glutSolidTeapot(0.3);///右邊,當成手臂的茶壼
            glPopMatrix();

        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
///上面是我們增加的程式碼
///打光的部分留著 (陣列,main() ) 其他都刪掉
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 };

/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    ///我們準備3個函式註冊好
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    ///我們準備3個函式註冊好

    ///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;
}