顯示具有 08160910_張家瑜 標籤的文章。 顯示所有文章
顯示具有 08160910_張家瑜 標籤的文章。 顯示所有文章

2021年6月16日 星期三

chjyuʕ •ᴥ•ʔ week17 總複習

 1.總複習

https://hackmd.io/@jsyeh/opengl

(1)開啟打光3D

執行結果:












程式碼:

#include <GL/glut.h>

void display(){

    glClearColor( 1,0,0,0);///用來Clear的Color 用紅色

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glColor3f( 1,1,0 );

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

    glutInitWindowSize(300,300);

    glutInitWindowPosition(700,200);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week17 review");


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

}

(2)TRT

執行結果:


程式碼:

#include <GL/glut.h>

float angle=90;

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

    glutPostRedisplay();///重畫畫面

}

void display(){

    glClearColor( 1,0,0,0);///用來Clear的Color 用紅色

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glColor3f( 1,1,0 );

        glutSolidTeapot( 0.3 );///身體先註解掉身體,只看手臂

        glPushMatrix();

            glTranslatef(-.3, 0, 0);///(3)再把轉動中的手臂,掛到肩上

            glRotatef(angle, 0,0,1);///(2)再轉動它

            glTranslatef(-.3, .1, 0);///(1)移動旋轉中心,放正中心

            glutSolidTeapot(0.3);///左手臂

        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();

}

    glutMouseFunc(mouse);

    glutMotionFunc(motion);(加在視窗名稱下)


(3)keyboard() 可切換關節 & 存檔讀檔

#include <GL/glut.h>
#include <stdio.h>
FILE * fout = NULL;
FILE * fin = NULL;
float angle[20]={};///先都設成0
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;
    if(key=='s'){///存檔
        if( fout==NULL ) fout = fopen("angle.txt", "w+");
        for(int i=0; i<20; i++) fprintf(fout, "%.2f ", angle[i]);
        fprintf(fout, "\n");
        printf("save angle.txt\n");
    }else if(key=='r'){///讀檔 (不能和存檔同時做,因angle.txt不能開2次)
        if( fin==NULL ) fin = fopen("angle.txt", "r");
        for(int i=0; i<20; i++) fscanf(fin, "%f", &angle[i]);
        glutPostRedisplay();///重畫畫面
        printf("read angle.txt\n");
    }
}///如果關節很多, 可能要用迴圈來讓程式只要2行 for(int i=0; i<10; i++)
///可能也要用到英文字母
float oldX=0;
void mouse(int button, int state, int x, int y){
    oldX = x;
}
void motion( int x, int y ){
    angle[angleID] += x-oldX;///0: angle[0], 1: angle[1]..
    oldX = x;
    glutPostRedisplay();///重畫畫面
}
void display(){
    glClearColor( 1,0,0,0);///用來Clear的Color 用紅色
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f( 1,1,0 );
        glutSolidTeapot( 0.3 );///身體先註解掉身體,只看手臂
        glPushMatrix();///左半邊
            glTranslatef(-.3, 0, 0);///(3)再把轉動中的手臂,掛到肩上
            glRotatef(angle[0], 0,0,1);///(2)再轉動它
            glTranslatef(-.3, .1, 0);///(1)移動旋轉中心,放正中心
            glutSolidTeapot(0.3);///左手臂
            glPushMatrix();
                glTranslatef(-.3, 0, 0);///(3)再把轉動中的手臂,掛到肩上
                glRotatef(angle[1], 0,0,1);///(2)再轉動它
                glTranslatef(-.3, 0, 0);///(1)移動旋轉中心,放正中心
                glutSolidTeapot(0.3);///左手肘
            glPopMatrix();
        glPopMatrix();
        glPushMatrix();///右半邊
            glTranslatef(+.3, 0, 0);///(3)再把轉動中的手臂,掛到肩上
            glRotatef(angle[2], 0,0,1);///(2)再轉動它
            glTranslatef(+.3, .1, 0);///(1)移動旋轉中心,放正中心
            glutSolidTeapot(0.3);///右手臂
            glPushMatrix();
                glTranslatef(+.3, 0, 0);///(3)再把轉動中的手臂,掛到肩上
                glRotatef(angle[3], 0,0,1);///(2)再轉動它
                glTranslatef(+.3, 0, 0);///(1)移動旋轉中心,放正中心
                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);
    glutInitWindowSize(300,300);
    glutInitWindowPosition(700,200);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week17 review");

    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    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();
}

(4)做動畫、內插









2021年5月26日 星期三

chjyuʕ •ᴥ•ʔ week14 Timer

 1.Timer

  • step1

程式碼:

#include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSolidSphere(0.3, 30, 30);///實心圓

                            ///半徑         ///橫切

    ///glutWireSphere(0.3, 30, 30);///切線圓

    glutSwapBuffers();

}

int main( int argc, char**argv)

{

    glutInit( &argc, argv );

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow(" Week14 timer ");

    glutDisplayFunc(display);

    glutMainLoop();

}

執行結果:










  • step2

程式碼:

#include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    ///glutSolidSphere(0.3, 30, 30);

    glutWireSphere(0.3, 30, 30);

    glutSwapBuffers();

}

void timer(int t){

    glClearColor( 1, 0, 0, 0);

    display();

}

int main( int argc, char**argv)

{

    glutInit( &argc, argv );

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow(" Week14 timer ");

    glutDisplayFunc(display);

    glutTimerFunc(3000, timer, 0);

    glutMainLoop();

}

執行結果:

解釋timer函式:









  • step3

程式碼:

#include <GL/glut.h>

float angle=0;

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glRotatef(angle, 0,0,1);

        glutSolidCube(0.3);

    glPopMatrix();

    glutSwapBuffers();

}

(1)void timer(int t){

    glutTimerFunc(30, timer, t+1);///起床,先設定新鬧鐘

////設太小沒用

    glClearColor(1, 0, 0, 0);

    angle++;

    display();

}///再睡著

int main( int argc, char**argv)

{

    glutInit( &argc, argv );

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow(" Week14 timer ");

    glutDisplayFunc(display);

    glutTimerFunc(3000, timer, 0);

    glutMainLoop();

}

執行結果:


step4 左右旋轉
程式碼:
int diff=2;
(1)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();
}
執行結果:

step5 TRT
程式碼:
#include <GL/glut.h>
float angle=0;
void drawArml(){
    glPushMatrix();
        glScalef(1, 0.5, 0.5);
        glColor3f(1, 0, 0);
        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);
            drawArml();
        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(" Week14 timer ");
    glutDisplayFunc(display);
    glutTimerFunc(3000, timer, 0);
    glutMainLoop();
}
執行結果:













2021年5月19日 星期三

chjyuʕ •ᴥ•ʔ week13 3D模型-2

 1.貼模型

  • week08貼圖程式先貼上

程式碼:

#include <opencv/highgui.h>

#include <opencv/cv.h>

#include <GL/glut.h>

GLuint id1, id2; ///TODO:增加2個 貼圖ID

int myTexture(char * filename)

{

    IplImage * img = cvLoadImage(filename);

    cvCvtColor(img,img, CV_BGR2RGB);

    glEnable(GL_TEXTURE_2D);

    GLuint id;

    glGenTextures(1, &id); /// 產生Generate 貼圖ID

    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖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);//切換貼圖1

    glutSolidTeapot(0.3);

   glBindTexture(GL_TEXTURE_2D, id2);//切換貼圖2

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

    glutSwapBuffers();

}

int main(int argc, char** argv)

{

    glutInit( &argc, argv );

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow(" Week08 ");

    glutDisplayFunc(display);

    id1 = myTexture("diffuse.jpg");///改成模型.jpg

    id2 = myTexture("bg.jpg");

    glEnable(GL_DEPTH_TEST);

    glutMainLoop();

}

執行結果:













2.步驟

  • 更改工作目錄cbp




















  • 增加檔案置專案夾
  • 檔名更改glm.c ----> glm.cpp




















  • 增加程式碼:
  • 更改為GLM_TEXTURE











程式碼:
#include "glm.h"
GLMmodel* pmodel = 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);///有改
}


  • 利用小畫家把圖片垂直翻轉


















  • 整體旋轉












程式碼:
glPushMatrix();
        glRotatef(angle, 0,1,0); 
        drawmodel();
    glPopMatrix();

  • 如果讓他轉動,他會跑到布幕後,所以需要改程式碼















程式碼:
         glTexCoord2f(0,1);glVertex3f(-1,-1,+0.9);///後移
        glTexCoord2f(1,1);glVertex3f(+1,-1,+0.9);
        glTexCoord2f(1,0);glVertex3f(+1,+1,+0.9);
        glTexCoord2f(0,0);glVertex3f(-1,+1,+0.9);
  • 加入支解的模型ex:GLMmodel*hand1=NULL;










程式碼:

GLMmodel*arm1=NULL;///切開的小模型

GLMmodel*arm2=NULL;

GLMmodel*hand1=NULL;

GLMmodel*hand2=NULL;






2021年5月12日 星期三

chjyuʕ •ᴥ•ʔ week12 3D模型-1

 1. 3D exploration(模型切割)

下載安裝:3D exploration(放在moodle3D設計)

*要先解壓縮gumdan.zip









1-1加入codeblocks

  • codeblocks開啟OPENGL
  • 把原本的main.c remove
  • 把桌面上的gundam.cpp&貼紙放同目錄專案裡
  • 打開codeblocks-add files

於第一行增加程式碼:

#define GL_BGRA_EXT 0x80E1

#define GL_BGR_EXT 0x80E0

//註解Palette的兩行 ///調色盤

執行結果:


1-2更變模型轉動模式與大小
  • //註解原本程式裡頭的rotate&scale
增加程式碼:
glRotatef( nAngle, 0, 1, 0);///朝y軸轉動
glScalef(3, 3, 3);///模型大小


執行結果:

2.MAYA匯出模型關節
  • 匯入為切開的gundam.obj
  • 選取面-圈選整隻左手
  • 匯出OBJ
  • 完成

2-1 glut
  • 專案檔的cpd開啟notepad++
  • 更改執行資料夾"C:\Users\Administrator\Desktop\freeglut\bin" ------> "."

  • 把C:\Users\Administrator\Desktop\freeglut\bin裡.dll ctrlC到專案檔裡


執行結果:









2021年5月5日 星期三

chjyuʕ •ᴥ•ʔ week11 3D模型

 1.基礎設定

(1)下載Moodle 3個ZIP檔







(2)windows.zip,data.zip解壓縮-data放入windows裡







(3)source.zip解壓縮-glm.c,glm.h,translation.c放入現在的執行專案

  • glm.c ---> glm.cpp
  • transformation--->Notepad++開啟,複製程式碼。貼在main.cpp裡















(4)增加新檔(3D模型一個檔,程式碼一個檔)相互連接

  • 執行:有閃退=成功!!!


(5)把data放入 freeglut/bin裡












執行結果:

成功囉!!!

2. 3D貼圖
執行結果:


程式碼:
#include "glm.h"   ///外掛
GLMmodel* pmodel = NULL;   ///空指標
void
drawmodel(void)
{
    if (!pmodel) {
pmodel = glmReadOBJ("data/porsche.obj");//改成gamdam.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(" Week11 model");

    glutDisplayFunc(display);
    glutMainLoop();
}
 
       :複製transformatiom裡程式
       :新增程式碼

(1)打光
執行結果:





程式碼:
#include "glm.h"
GLMmodel* pmodel = NULL;
void
drawmodel(void)
{
    if (!pmodel) {
pmodel = glmReadOBJ("data/flowers.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(" Week11 model");
    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);

    glutDisplayFunc(display);
    glutMainLoop();
}

       :week08打光的程式碼


3. 鋼彈模型
下載檔案





把圈起來的2個檔放在data











把jpg檔放在frrglut/bin裡面











執行結果:(這樣呈現是錯誤的











執行結果:(正確但會閃退











程式碼:

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

GLuint id1, id2; ///TODO:增加2個 貼圖ID

int myTexture(char * filename)

{

    IplImage * img = cvLoadImage(filename); ///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);

    return id;

}

#include "glm.h"

GLMmodel * pmodel = NULL;

void drawmodel(void)

{

    if (!pmodel) {

pmodel = glmReadOBJ("data/Gundam.obj");

if (!pmodel) exit(0);

glmUnitize(pmodel);

glmFacetNormals(pmodel);

glmVertexNormals(pmodel, 90.0);

    }

    glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE );///不能用metrial(把它刪掉

}

void display()

{

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glPushMatrix();

        glRotatef( 180, 0,1,0);///轉動180度

        drawmodel();///glutSolidTeapot(0.3);

    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)///全部剪貼 github blog

{

    glutInit( &argc, argv);

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow("week11 我的3D模型");


    glEnable(GL_DEPTH_TEST);///若少了 3D深度測試,就會畫錯而破圖

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

    glutDisplayFunc(display);

    id1=myTexture("Diffuse.jpg");

    glutMainLoop();

}


2021年4月28日 星期三

chjyuʕ •ᴥ•ʔ week10 播放聲音

 1.播放聲音

(1)(還沒有shot的執行目錄,所以只有"燈愣"的聲音)










程式碼:

#include<windows.h>

int main()

{                    ///執行目錄 ///空指標  ///要等同步

    PlaySound("shot.wav", NULL, SND_SYNC);

}

(2)找音源檔(一定要wav檔)



(3)讓多個音源連接著一起撥放(不用同步,要敲Enter)


程式碼:
#include<windows.h>
#include <stdio.h>
int main()
{
    while(1){
        char c = getchar();
        if(c=='1')PlaySound("do.wav", NULL, SND_ASYNC);///不同步
        if(c=='2')PlaySound("re.wav", NULL, SND_ASYNC);
        if(c=='3')PlaySound("mi.wav", NULL, SND_ASYNC);
        if(c=='4')PlaySound("fa.wav", NULL, SND_ASYNC);
        if(c=='5')PlaySound("so.wav", NULL, SND_ASYNC);

    }
}

(4)圖片後加聲音(不用敲Enter)

程式碼:
#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_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week10 playsound");

    glutDisplayFunc(display);
    glutKeyboardFunc( keyboard);
    glutMainLoop();

}

(5)用MP3放入背景/同時

程式碼:
#include <windows.h>
#include <GL/glut.h>
#include"CMP3_MCI.h" ///.h檔要放在專案目錄下
CMP3_MCI mp3;///宣告一個變數(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);
    if(key=='4') PlaySound("fa.wav", NULL, SND_ASYNC);
    if(key=='5') PlaySound("so.wav", NULL, SND_ASYNC);
}

int main(int argc, char *argv[])

{
    mp3.Load("music.mp3");///檔案放執行目錄....\freeglut\bin
    mp3.Play(); ///播放
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week10 playsound");

    glutDisplayFunc(display);
    glutKeyboardFunc( keyboard);
    glutMainLoop();

}
(6)除了背景音樂還加上了滑鼠案鍵有聲音


程式碼:
#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);
    if(key=='4') PlaySound("fa.wav", NULL, SND_ASYNC);
    if(key=='5') PlaySound("so.wav", NULL, SND_ASYNC);
}

void mouse(int button, 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_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week10 playsound");

    glutDisplayFunc(display);
    glutKeyboardFunc( keyboard);
    glutMouseFunc(mouse);
    glutMainLoop();

}
(7)讓滑鼠多個聲音共存

程式碼:
#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);
    if(key=='4') PlaySound("fa.wav", NULL, SND_ASYNC);
    if(key=='5') PlaySound("so.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_LEFT_BUTTON) shot2.Play();
    if(state==GLUT_DOWN && button == GLUT_LEFT_BUTTON) shot3.Play();
}

int main(int argc, char *argv[])

{
    shot1.Load("1.wav"); shot2.Load("2.wav"); shot3.Load("3.wav");///檔名
    mp3.Load("music.mp3");
    mp3.Play();
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week10 playsound");

    glutDisplayFunc(display);
    glutKeyboardFunc( keyboard);
    glutMouseFunc(mouse);
    glutMainLoop();

}
(8)把音樂放到同一個執行專案



























距地表面160 Week11

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