顯示具有 08160661_蔡承竹 標籤的文章。 顯示所有文章
顯示具有 08160661_蔡承竹 標籤的文章。 顯示所有文章

2021年6月18日 星期五

week17

     -glutInitWindowSize(400,400);//視窗大小

    -glutInitWindowPosition(0,0);//視窗位置

 

加入打光的程式碼

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

在mainloop();前面加入:

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);


    -控制滑鼠glutMouseFunc(mouse);
                       glutMotionFunc(motion);
利用x和x的舊座標

-float angle[20]={};

int angleID=0;

-鍵盤按鍵void keyboard(unsigned char key, int x, int y )

{

    if(key=='0') angleID=0;

    if(key=='1') angleID=1;

    if(key=='2') angleID=2;

    if(key=='3') angleID=3;

    if(key=='4') angleID=4;

     if(key=='5') angleID=5;

     if(key=='6') angleID=6;

}

要記得在main函式裡面加glutKeyboardFunc(keyboard);才會有動作

-存檔、讀檔

fprintf(fout, "%.2f", angle[i]);

fscanf(fin, "%f",&angle[i]);

注意fscanf後面要加&angle[i]

-timer

void timer(int t)

{

    glutTimerFunc(30,timer,t+1);

    if(t%30==0){///每幾個frame,讀一筆新資料,如果要讓動畫更順要把t%多少提高

        for(int i=0;i<20;i++) angleOld[i]=angleNew[i];

        if(fin==NULL) fin=fopen("angle.txt", "r");

        for(int i=0;i<20;i++) fscanf(fin, "%f", &angleNew[i]);

        ///讀新資料前先備份

    }

    float alpha=(t%30)/30.0;///alpha內插

    for(int i=0;i<20;i++){

        angle[i]= alpha*angleNew[i]+(1-alpha)*angleOld[i];

    }

    glutPostRedisplay();///重畫畫面

}

最終程式碼:

#include <stdio.h>

#include <GL/glut.h>

float angle[20]={}, diff=2;

float angleOld[20]={}, angleNew[20]={};

int angleID=0;

int oldx=0;

FILE * fout = NULL;

FILE * fin = NULL;///播放動畫

void timer(int t)

{

    glutTimerFunc(30,timer,t+1);

    if(t%30==0){///每10個frame,讀一筆新資料

        for(int i=0;i<20;i++) angleOld[i]=angleNew[i];

        if(fin==NULL) fin=fopen("angle.txt", "r");

        for(int i=0;i<20;i++) fscanf(fin, "%f", &angleNew[i]);

        ///讀新資料前先備份

    }

    float alpha=(t%30)/30.0;

    for(int i=0;i<20;i++){

        angle[i]= alpha*angleNew[i]+(1-alpha)*angleOld[i];

    }

    glutPostRedisplay();///重畫畫面

}

void mouse(int button, int state,int x, int y){

    oldx=x;

}

void motion(int x, int y)

{

    angle[angleID]+= x-oldx;

    oldx=x;

    glutPostRedisplay();


    if(fout==NULL) fout=fopen("angle.txt", "w+");

    for(int i=0; i<20;i++) fprintf(fout, "%.1f", angle[i]);

    fprintf(fout, "\n");

    for(int i=0;i<20;i++) printf("%.1f", angle[i]);

    printf("\n");


}

void keyboard(unsigned char key, int x, int y )

{

    if(key=='0') angleID=0;

    if(key=='1') angleID=1;

    if(key=='2') angleID=2;

    if(key=='3') angleID=3;

    if(key=='s'){///save

        if(fout==NULL) fout=fopen("angle.txt", "w+");

        for(int i=0; i<20;i++) fprintf(fout, "%.1f", angle[i]);

        fprintf(fout, "\n");

        for(int i=0;i<20;i++) printf("%.1f", angle[i]);

        printf("\n");


    }

    if(key=='r'){///read

        if(fin==NULL) fin=fopen("angle.txt", "r");

        for(int i=0;i<20;i++) fscanf(fin, "%f",&angle[i]);

        glutPostRedisplay();///重畫畫面

    }

    if(key=='p'){///play利用timer播放{

        glutTimerFunc(0, timer, 0);

    }

}

void display()

{

    glClearColor(1,0,0,0);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glColor3f(1,1,0);

        glutSolidTeapot(0.3);

        glPushMatrix();///左

            glTranslatef(-0.3,0,0);

            glRotated(angle[0],0,0,1);

            glTranslatef(-0.3,0,0);

            glutSolidTeapot(0.3);

            glPushMatrix();

                glTranslatef(-0.3,0,0);

                glRotated(angle[0],0,0,1);

                glTranslatef(-0.3,0,0);

                glutSolidTeapot(0.3);

            glPopMatrix();

        glPopMatrix();

        glPushMatrix();///右

        glTranslatef(+0.3,0,0);

        glRotatef(-angle[2],0,0,1);

        glTranslatef(+0.3,0,0);

        glutSolidTeapot(0.3);

            glPushMatrix();

                glTranslatef(+0.3,0,0);

                glRotatef(-angle[2],0,0,1);

                glTranslatef(+0.3,0,0);

                glutSolidTeapot(0.3);

            glPopMatrix();

        glPopMatrix();

    glPopMatrix();


    glutSwapBuffers();

}

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 )

{

    glutInit( &argc, argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutInitWindowSize(400,400);

    glutInitWindowPosition(0,0);

    glutCreateWindow("08160661");

    glutKeyboardFunc(keyboard);

    glutMouseFunc(mouse);

    glutMotionFunc(motion);

    glutTimerFunc(0,timer,0);

    glutDisplayFunc(display);


    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();

}



2021年6月9日 星期三

week16

 

-利用上禮拜的程式碼
新增void mouse(); void motion();
設x,oldx
動畫按0123並配合滑鼠移動能讓關節移動 
-再motion裡面新增程式碼:


    if(fout==NULL) fout=fopen("angle.txt", "w+");
    for(int i=0; i<20;i++) fprintf(fout, "%.1f", angle[i]);
    fprintf(fout, "\n");
    for(int i=0;i<20;i++) printf("%.1f", angle[i]);
    printf("\n");

可以看到關節移動的角度
-播放動畫 FILE * fin = NULL;

再timer裡面新增動畫指令 
-再keyboard()裡面新增save,read,play
利用key==' '; 用鍵盤上的s可以存檔 
儲存位置後再讀檔,並利用鍵盤上的r讀檔
讀檔後就能撥放了


-再timer新增內插 讓動畫更順
設float angleOld[20]={}, angleNew[20]={};
更新angle, 利用alpha 0~1中間進行angle[i]= alpha*angleNew[i]+(1-alpha)*angleOld[i];

程式碼:

#include <stdio.h>

#include <GL/glut.h>
float angle[20]={}, diff=2;
float angleOld[20]={}, angleNew[20]={};
int angleID=0;
int oldx=0;
FILE * fout = NULL;
FILE * fin = NULL;///播放動畫
void timer(int t)
{
    glutTimerFunc(30,timer,t+1);
    if(t%30==0){///每10個frame,讀一筆新資料
        for(int i=0;i<20;i++) angleOld[i]=angleNew[i];
        if(fin==NULL) fin=fopen("angle.txt", "r");
        for(int i=0;i<20;i++) fscanf(fin, "%f", &angleNew[i]);
        ///讀新資料前先備份
    }
    float alpha=(t%30)/30.0;
    for(int i=0;i<20;i++){
        angle[i]= alpha*angleNew[i]+(1-alpha)*angleOld[i];
    }
    glutPostRedisplay();
}
void mouse(int button, int state,int x, int y){
    oldx=x;
}
void motion(int x, int y)
{
    angle[angleID]+= x-oldx;
    oldx=x;
    glutPostRedisplay();

//    if(fout==NULL) fout=fopen("angle.txt", "w+");
//    for(int i=0; i<20;i++) fprintf(fout, "%.1f", angle[i]);
//    fprintf(fout, "\n");
//    for(int i=0;i<20;i++) printf("%.1f", angle[i]);
//    printf("\n");

}
void keyboard(unsigned char key, int x, int y )
{
    if(key=='0') angleID=0;
    if(key=='1') angleID=1;
    if(key=='2') angleID=2;
    if(key=='3') angleID=3;
    if(key=='s'){///save
        if(fout==NULL) fout=fopen("angle.txt", "w+");
        for(int i=0; i<20;i++) fprintf(fout, "%.1f", angle[i]);
        fprintf(fout, "\n");
        for(int i=0;i<20;i++) printf("%.1f", angle[i]);
        printf("\n");

    }
    if(key=='r'){///read
        if(fin==NULL) fin=fopen("angle.txt", "r");
        for(int i=0;i<20;i++) fscanf(fin, "%f",&angle[i]);
        glutPostRedisplay();///重畫畫面
    }
    if(key=='p'){///play利用timer播放

    }
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot(0.3);
        glPushMatrix();///左
            glTranslatef(-0.3,0,0);
            glRotated(angle[0],0,0,1);
            glTranslatef(-0.3,0,0);
            glutSolidTeapot(0.3);
            glPushMatrix();
                glTranslatef(-0.3,0,0);
                glRotated(angle[0],0,0,1);
                glTranslatef(-0.3,0,0);
                glutSolidTeapot(0.3);
            glPopMatrix();
        glPopMatrix();
        glPushMatrix();///右
        glTranslatef(+0.3,0,0);
        glRotatef(-angle[2],0,0,1);
        glTranslatef(+0.3,0,0);
        glutSolidTeapot(0.3);
            glPushMatrix();
                glTranslatef(+0.3,0,0);
                glRotatef(-angle[2],0,0,1);
                glTranslatef(+0.3,0,0);
                glutSolidTeapot(0.3);
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();

    glutSwapBuffers();
}
int main( int argc, char ** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160661");
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutTimerFunc(0,timer,0);
    glutDisplayFunc(display);
    glutMainLoop();
}



2021年5月26日 星期三

timer

 -備份glut的程式碼(用notepad++)


glutSolidSphere(0.3,30,30);//實心
glutWireSphere(0.3,30,30);//線框
把timer函式加進來
void timer{}裡面坐要做的事情
這裡打的是把背景清成紅色
display();是重畫畫面
glutTimerFunc(要等的時間,timer,0);
float angle++;
設定角度,並加入程式碼
可以讓方塊旋轉,背景變色
int diff
這讓方塊能左右轉動

加一個手臂,讓手臂能再時間到的時候開始轉動
把手臂移到中心點
時間到了之後開始轉動
    glPushMatrix();
        glColor3f(1,1,1);
        glutSolidCube(0.4);
        glPushMatrix();
            glTranslatef( -0.2,0.2,0 );//掛到肩膀
            glRotatef(angle,0,0,1);//轉動
            glTranslatef(-0.1,0,0);//把手臂關節放到中心點
            drawArm1();
        glPopMatrix();
    glPopMatrix();



程式碼:
#include <GL/glut.h>
float angle=0;
void drawArm1()
{
    glPushMatrix();
        glScalef(1,0.5,0.5);
        glColor3f(0,0,1);
        glutSolidCube(0.2);
    glPopMatrix();
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1,1,1);
        glutSolidCube(0.4);
        glPushMatrix();
            glTranslatef( -0.2,0.2,0 );
            glRotatef(angle,0,0,1);
            glTranslatef(-0.1,0,0);
            drawArm1();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int diff=2;
void timer(int t)
{
    glutTimerFunc(30,timer,t+1);
    glClearColor(1,0,0,0);
    if(angle>90) diff=-2;
    if(angle<0) diff=+2;
    angle+=diff;
    display();
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("08160661");
    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);
    glutMainLoop();

}












2021年5月24日 星期一

鋼彈模型

 -安裝opencv、GLUT

-把老師的bg.jpg、Diffuse.jpg下載並放在glut的bin裡面

-設定好codeblocks的compiler

利用老師網頁裡的範例 把diffuse的圖檔打開

-把剛剛放在glut/bin裡的jpg跟dll檔放到專案目錄裡 

-利用notepad++把檔案位置改成"."

-glm.c改檔名(cpp)>是

-gundam還沒切開.zip Diffuse.jpg,Gundam.obj,Gundam.mtl複製到專案目錄

-codeblocks重開,打開cbp檔,再add file(glm.cpp)

-右鍵transformation.c ,notepad++

-複製程式碼 

-編輯Diffuse.jpg (垂直翻轉)
-利用float angle喬角度
程式碼:

#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel * pmodel = NULL;
GLMmodel * arm1 = NULL;
GLMmodel * arm2 = NULL;
GLMmodel * hand = NULL;

void
drawmodel(void)
{
    if (!pmodel) {
pmodel = glmReadOBJ("Gundam.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
    }

    glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE);
}

GLuint id1, id2;
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename);
    cvCvtColor(img,img, CV_BGR2RGB);
    glEnable(GL_TEXTURE_2D);
    GLuint id;
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
}
float angle=180;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBindTexture(GL_TEXTURE_2D, id1);
    glPushMatrix();
        glRotatef(angle,0,1,0);
        drawmodel();
    glPopMatrix();
    glBindTexture(GL_TEXTURE_2D, id2);
    glBegin(GL_POLYGON);
        glTexCoord2f( 0, 0 ); glVertex2f( -1, -1 );
        glTexCoord2f( 0, 1 ); glVertex2f( -1, +1 );
        glTexCoord2f( 1, 1 ); glVertex2f( +1, +1 );
        glTexCoord2f( 1, 0 ); glVertex2f( +1, -1 );
    glEnd();
    glutSwapBuffers();
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week08 ");
    glutDisplayFunc(display);

    id1 = myTexture("Diffuse.jpg");
    id2 = myTexture("bg.jpg");
    glEnable(GL_DEPTH_TEST);
    glutMainLoop();
}







2021年5月12日 星期三

鋼彈

 


一開始用3DEXPLOR打開老師給的鋼彈模型程式碼
然後另存cpp檔,放桌面

打開codeblocks的open GL專案
把裡面原本的main.cpp, remove之後
把剛剛另存的鋼彈模型程式碼跟圖檔放到codeblocks的檔案裡
open GL,add file把鋼彈模型打開
加入    #define GL_BGR_EXT 0x80E0 
    #define GL_BGRA_EXT 0x80E1
這兩行,並把palette兩行註解掉
把原本會自動放大縮小的程式改成只對y軸旋轉
將原本的glRotatef和glScalef註解
加入 glRotatef(nAngle,0,1,0);
    glScalef(3,3,3);
利用maya把模型切割
先把要切割的模型匯入
壓滑鼠右鍵選擇face面,把要切割的面選取
之後export selection選擇obj檔匯出
將原本的open GL專案關掉
把GLUT打開 
打光的程式碼留著
將cbp檔案用notepad++打開
把資料放到"."裡面 
可以讓資料跑到現在的位置
再把glut裡面的freeglut.dll拉到codeblocks的資料夾裡面
這樣就能成功了
程式碼:
#include <GL/glut.h>
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSolidTeapot( 0.3 );
    glutSwapBuffers();
}

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 )
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE |GLUT_DEPTH);
    glutCreateWindow("week12 hw4");

    glutDisplayFunc(display);

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







2021年5月5日 星期三

模型打光

 

一開始先下載data,windows,sources.zip
並把要加進去的檔案加入
把設定都設定好
可以打開老師的transformation視窗
之後把main裡面的程式碼全部刪除
copy其中的一部分程式碼並加入幾行新的程式碼
使用#include "glm.h"(要用雙引號)開外掛
程式碼:

#include "glm.h"
GLMmodel * pmodel=NULL;
void drawmodel(void)
{
    if(!pmodel){
        pmodel = glmReadOBJ("data/porsche.obj");
        if (!pmodel) exit(0);
        glmUnitize(pmodel);
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel,90.0);
    }
    glmDraw(pmodel,GLM_SMOOTH|GLM_MATERIAL);
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    drawmodel();
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160661");
    glutDisplayFunc(display);
    glutMainLoop();
}

反面
正面

    glPushMatrix();
        glRotatef(180,0,1,0);//對y軸旋轉180度
        drawmodel();
    glPopMatrix();
加入week08的打光程式碼,讓模型上色
*要記得加上glEnable(GL_DEPTH_TEST);3D偵測
不然會破圖
程式碼:
#include "glm.h"
GLMmodel * pmodel=NULL;
void drawmodel(void)
{
    if(!pmodel){
        pmodel = glmReadOBJ("data/porsche.obj");
        if (!pmodel) exit(0);
        glmUnitize(pmodel);
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel,90.0);
    }
    glmDraw(pmodel,GLM_SMOOTH|GLM_MATERIAL);
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(180,0,1,0);
        drawmodel();
    glPopMatrix();
    glutSwapBuffers();
}
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)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160661");
    glutDisplayFunc(display);
    glEnable(GL_DEPTH_TEST);

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











2021年4月28日 星期三

播放音效

 


今天上課教如何撥放音效
下載下來的音樂要放到執行目錄
(freeglut\bin裡面)
程式碼:

#include <windows.h>
#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void keyboard(unsigned char key, int x,int y)
{
    if(key=='1') PlaySound("do.wav", NULL, SND_ASYNC);
    if(key=='2') PlaySound("re.wav", NULL, SND_ASYNC);
    if(key=='3') PlaySound("mi.wav", NULL, SND_ASYNC);
}
int main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week10");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
}




播放mp3檔要先下載MP3_MCI檔案
並放在專案目錄裡面,下載mp3檔
程式碼:
#include <windows.h>
#include <GL/glut.h>
#include "CMP3_MCI.h"
CMP3_MCI mp3;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void keyboard(unsigned char key, int x,int y)
{
    if(key=='1') PlaySound("do.wav", NULL, SND_ASYNC);
    if(key=='2') PlaySound("re.wav", NULL, SND_ASYNC);
    if(key=='3') PlaySound("mi.wav", NULL, SND_ASYNC);
}
int main(int argc, char**argv)
{
    mp3.Load("music.mp3");
    mp3.Play();
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week10");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
}
再增加一個按滑鼠也有音效的程式碼:
#include <windows.h>
#include <GL/glut.h>
#include "CMP3_MCI.h"
CMP3_MCI mp3;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void keyboard(unsigned char key, int x,int y)
{
    if(key=='1') PlaySound("do.wav", NULL, SND_ASYNC);
    if(key=='2') PlaySound("re.wav", NULL, SND_ASYNC);
    if(key=='3') PlaySound("mi.wav", NULL, SND_ASYNC);
}
void mouse(int buttom, int state, int x, int y)
{
    if(state==GLUT_DOWN) PlaySound("shot.wav", NULL, SND_ASYNC);
}
int main(int argc, char**argv)
{
    mp3.Load("music.mp3");
    mp3.Play();
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week10");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMainLoop();
}



這個程式碼可以讓滑鼠左中右鍵分別有不同音效

#include <windows.h>
#include <GL/glut.h>
#include "CMP3_MCI.h"
CMP3_MCI mp3;
CMP3_MCI shot1,shot2,shot3;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void keyboard(unsigned char key, int x,int y)
{
    if(key=='1') PlaySound("do.wav", NULL, SND_ASYNC);
    if(key=='2') PlaySound("re.wav", NULL, SND_ASYNC);
    if(key=='3') PlaySound("mi.wav", NULL, SND_ASYNC);
}
void mouse(int button, int state, int x, int y)
{
    if(state==GLUT_DOWN&&button==GLUT_LEFT_BUTTON) shot1.Play();
    if(state==GLUT_DOWN&&button==GLUT_MIDDLE_BUTTON) shot2.Play();
    if(state==GLUT_DOWN&&button==GLUT_RIGHT_BUTTON) shot3.Play();
}
int main(int argc, char**argv)
{
    shot1.Load("1.wav"); shot2.Load("2.mav"); shot3.Load("3.wav");
    mp3.Load("music.mp3");
    mp3.Play();
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week10");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMainLoop();
}


2021年4月14日 星期三

opencv

 

一開始上課老師在複習之前教過的用opencv開啟圖檔。



今天教怎麼做背景,用id1、id2讓程式可以讀到兩張圖片。
程式碼:
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.h>
GLuint id1, id2;
int myTexture(char*filename)
{
    IplImage * img = cvLoadImage(filename);
    cvCvtColor(img,img, CV_BGR2RGB);
    glEnable(GL_TEXTURE_2D);
    GLuint id;
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
    }
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBindTexture(GL_TEXTURE_2D, id1);
    glutSolidTeapot(0.3);
    glBindTexture(GL_TEXTURE_2D,id2);
    glBegin(GL_POLYGON);
        glTexCoord2f( 0, 0 ); glVertex2f( -1, -1 );
        glTexCoord2f( 0, 1 ); glVertex2f( -1, +1 );
        glTexCoord2f( 1, 1 ); glVertex2f( +1, +1 );
        glTexCoord2f( 1, 0 ); glVertex2f( +1, -1 );
    glEnd();
    glutSwapBuffers();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160661");
    glutDisplayFunc(display);
    id1=myTexture("star.jpg");
    id2=myTexture("bg.jpg");
    glEnable(GL_DEPTH_TEST);
    glutMainLoop();
}

最後一節課教打光,新增了幾行有關光的程式碼,
在const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };改變z的光源。
   glEnable(GL_DEPTH_TEST);這行程式碼是打開深度偵測,可以讓茶壺變立體。
最終程式碼:
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.h>
GLuint id1, id2;
int myTexture(char*filename)
{
    IplImage * img = cvLoadImage(filename);
    cvCvtColor(img,img, CV_BGR2RGB);
    glEnable(GL_TEXTURE_2D);
    GLuint id;
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    return id;
    }
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBindTexture(GL_TEXTURE_2D, id1);
    glutSolidTeapot(0.3);
    glBindTexture(GL_TEXTURE_2D,id2);
    glBegin(GL_POLYGON);
        glTexCoord2f( 0, 0 ); glVertex2f( -1, -1 );
        glTexCoord2f( 0, 1 ); glVertex2f( -1, +1 );
        glTexCoord2f( 1, 1 ); glVertex2f( +1, +1 );
        glTexCoord2f( 1, 0 ); glVertex2f( +1, -1 );
    glEnd();
    glutSwapBuffers();
}
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[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("08160661");
    glutDisplayFunc(display);
    id1=myTexture("star.jpg");
    id2=myTexture("bg.jpg");
    glEnable(GL_DEPTH_TEST);

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

2021年4月7日 星期三

openCV


小葉老師今天教我們用openCV

到小葉老師的網站下載windows跟data,解壓縮後把data放到windows檔案裡面

codeblocks裡面的setting點進compiler裡進行設定

Search directories裡加入

compiler: C:\OpenCV2.1\include

Linker: C:\OpenCV2.1\lib


在linker settings裡加入
cv210
cxcore210
highgui210

將glut打開,照片存在glut裡的lib檔案
程式碼:

#include <openCV/highgui.h>
int main()
{
    IplImage * img = cvLoadImage("wink.jpg");
    cvShowImage("photo", img);
    cvWaitKey(0);
}

cvWaitKey(0);讓程式可以跑很久


把圖放到茶壺上面
程式碼:
#include <opencv/highgui.h>
 ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
void init()
{
    IplImage * img = cvLoadImage("wink.jpg"); 
///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB);
 ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); 
///1. 開啟貼圖功能
    GLuint id;
 ///準備一個 unsigned int 整數, 叫 貼圖ID
    glGenTextures(1, &id);
 /// 產生Generate 貼圖ID
    glBindTexture(GL_TEXTURE_2D, id);
 ///綁定bind 貼圖ID
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
/// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
/// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 /// 貼圖參數, 放大時的內插, 用最近點
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
/// 貼圖參數, 縮小時的內插, 用最近點
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
}  
 ///最後一行最難/最重要, 所貼圖影像的資料都設定好
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}

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

最終程式碼:
#include <opencv/highgui.h> 
#include <opencv/cv.h>
#include <GL/glut.h>
void init()
{
    IplImage * img = cvLoadImage("wink.jpg");
    cvCvtColor(img,img, CV_BGR2RGB);
    glEnable(GL_TEXTURE_2D);
    GLuint id;
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_POLYGON);
        glTexCoord2f(0,1); glVertex2f(-1,-1);
        glTexCoord2f(1,1); glVertex2f(+1,-1);
        glTexCoord2f(1,0); glVertex2f(+1,+1);
        glTexCoord2f(0,0); glVertex2f(-1,+1);
    glEnd();
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}

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




距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...