顯示具有 09163104_褚崇信 標籤的文章。 顯示所有文章
顯示具有 09163104_褚崇信 標籤的文章。 顯示所有文章

2022年6月14日 星期二

瘋狂無敵圖學死亡筆記 Week17

 0.複習

1.貼圖

#include <opencv/highgui.h>

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

#include <opencv/cv.h>

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;

}

2.讀模型

void myread(){

    if(pmodel == NULL){

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

        glmUnitize(pmodel);

        //glmScale(pmodel,1/26.0);

        glmFacetNormals(pmodel);

        glmVertexNormals(pmodel,90);

    }

}

3.打光8

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 myLight(){ ///打光函式配合上面打光

    glEnable(GL_DEPTH_TEST); ///3D測試功能

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

}

4.運鏡

void reshape(int v, int h){

    float ar = (float)v/(float)h;

    glViewport(0,0,v,h);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    gluPerspective(60,ar,0.1,100.0);


    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

    gluLookAt(0,0,2, 0,0,0, 0,1,0);

}

2022年6月7日 星期二

瘋狂無敵圖學死亡筆記 Week16

 0. alpha內插公式 alpha: 0.0~1.1

angle =alpha*新+(1-alpha)*舊

1.動畫(灰色為不自動以註解掉)

2.gluLookAt照相機

eye相機放哪

center相機固定頭動上下左右

up相機橫拍直拍斜拍..

3. aspect 長寬比例

4.滑鼠左右運鏡



2022年5月31日 星期二

瘋狂無敵圖學死亡筆記 Week15

 0. PLaySound()    wav檔案

兩個函式庫#include <mmsystem.h>&#inlcude <windows.h>

//PlaySound("檔名.wav", NULL, SND_ASYNC); //上週,不等待,不同步

PlaySound("檔名.wav", NULL, SND_SYNC); //本週,等待,同步

***問題 Setting-Compiler Setting ,    Linker 加入 winmm

再來是把wav檔案放工作目錄

SND_SYNC&&SND_ASYNC差別

等待會等播完才結束

不等待可互動

1.  MP3(小/有壓縮加密)會亂碼.wav(大/原始) 內容不一樣
CMP3_MCI.h 這個檔可以在 #include "CMP3_MCI.h" 後, 解鎖 mp3.Play()功能
原本是邊做邊存動作(然後按r讀)
修改為按s才存檔

3.機器人擺動做

3-1.    3Dodel(glm.h glm.cpp)

3-2.    模型切塊分別讀入

3-3.    TRT,轉動

3-4.    keyboard()切換關節, mouse() motion()轉動那一個關節

步驟:改工作目錄到自己資料夾裡(函freeglut.dll) .cbp裡working_dir="."

glm.h    glm.cpp及gundam的data目錄也放入

並且如圖





2022年5月24日 星期二

瘋狂無敵圖學死亡筆記 Week14

 0.  寫檔、讀檔

0-1. 寫檔 

fopen()開啟

fprintf()寫入

fclose()關閉檔案

0-2. 讀檔

fopen()開啟

fscanf()讀取

fclose()關閉檔案

1. 利用week13加入檔案功能

2.動畫將移動資料存進file.txt然後讀檔做同樣動作


3.原來工作目錄在freeglut\bin裡面想必file.txt也在那,但我們想改工作目錄在專案裡如下:

3-0. 因為GLUT專案要用freeglut.dll所以工作目錄(working_dir)自動被設置到freeglut\bin裡面

3-1. 在.cbp 專案檔裡 有工作目錄的設定用notepad++改.cbp的working_dir為專案下"."



3-2. 改完工作目錄位置再來因為GLUT專案要用freeglut.dll所以要將freeglut裡的freeglut.dll複製過來


4. 按r因為每個人鍵盤設不同,有快有慢
glutTimeFunc() 計時器

4-1. void timer(int t) 寫timer函式
4-2. glutTimeFunc(等多久,timer,參數t)

4-3. 設計一個5秒開始之後都1秒繼續(無窮)


5. 播放聲音 PlaySound() 
5-1. 首先要#include <mmsystem.h>
5-2. 也要有.wav音檔,以下用do.wav為例

2022年5月17日 星期二

瘋狂無敵圖學死亡筆記 Week13

 0.    新函式新招

glutInitWindowSize(600,600);///小視窗大小

長方形glRectf(0.3,0.5,-0.3,-0.5);

#include <GL/glut.h>

void display(void)

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glRectf(0.3,0.5,-0.3,-0.5);///兩個座標(x1,x2)

    glutSwapBuffers();

}

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

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutInitWindowSize(600,600);

    glutCreateWindow("week13 rect TRT");


    glutDisplayFunc(display);

    glutMainLoop();

}

1.    正方形當身體、手(手旋轉)加上mouse mation
3.    兩手(用keyboard選擇要動哪個關節)






2022年5月10日 星期二

瘋狂無敵圖學死亡筆記 Week12

0. 交換位置

移動的旋轉物品(自轉)
glTranslatef()後 
glRotatef()先
Obj1
Obj2
    v.s.
繞著中間轉彎(公轉)
Obj1    ///不會動
glRotatef()後
glTranslatef()先
Obj


0-1.  T-R-T
將部位先找軸T移動到(0,0,0)
在旋轉R
在講部位移動到身體T

1. 茶壺當手身體(讓手轉)

2.T-R-T裡也有T-R-T








2022年5月3日 星期二

瘋狂無敵圖學死亡筆記 Week11

0.做鋼彈 

0-1. 把鋼彈資料夾裡的data放在工作目錄裡,即可用鋼彈貼圖



0-1. 讀完圖試把圖貼在茶壺上


1. glm模型練型:把模型讀進來,畫出來
1-1. source.zip的一些檔案傳入專案

1-2. 把glm.c改成.cpp


1-3. 讀鋼彈模型與鋼彈貼圖並套用
#include <opencv/highgui.h>
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>///這是電腦裡要設定include
#include "glm.h"///這是導入專案目錄裡的
GLMmodel * pmodel =NULL;
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 );
    if(pmodel == NULL){///如果是空指標,表示模型沒有準備好
        pmodel=glmReadOBJ("data/Gundam.obj");///就讀模型
        glmUnitize(pmodel);///換算成Unit單位大小 -1........1
        glmFacetNormals(pmodel);///重新計算面的法向量
        glmVertexNormals(pmodel,90);///重新計算的頂點的法向量
    }
    glmDraw(pmodel, GLM_TEXTURE);///有模型後,畫面,要記得畫貼圖
    glutSwapBuffers();
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("第11週的程式哦!");

    glutDisplayFunc(display);
    myTexture("data/Diffuse.jpg");
    glutMainLoop();
}
1-4. 上圖鋼彈模型有點前後壓扁
1.便3d
2.轉動它
#include <opencv/highgui.h>
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>///這是電腦裡要設定include
#include "glm.h"///這是導入專案目錄裡的
GLMmodel * pmodel =NULL;
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=0;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    if(pmodel == NULL){///如果是空指標,表示模型沒有準備好
        pmodel=glmReadOBJ("data/Gundam.obj");///就讀模型
        glmUnitize(pmodel);///換算成Unit單位大小 -1........1
        glmFacetNormals(pmodel);///重新計算面的法向量
        glmVertexNormals(pmodel,90);///重新計算的頂點的法向量
    }

    glPushMatrix();
        glRotatef(angle,0,1,0);///全身一起轉
        glmDraw(pmodel, GLM_TEXTURE);///有模型後,畫面,要記得畫貼圖
    glPushMatrix();

    glutSwapBuffers();
    angle+=0.00001;
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("第11週的程式哦!");

    glutIdleFunc(display);///有空呼叫display
    glutDisplayFunc(display);
    myTexture("data/Diffuse.jpg");
    glEnable(GL_DEPTH_TEST);///3D

    glutMainLoop();
}
2.可用maya切模型讓個別部位做旋轉
2-1.把各部位接起來
2-2 茶壺當手腳,並讓手轉動
#include <GL/glut.h> ///使用GLUT外掛,簡化程式
void hand(){
    glColor3f(0,1,0);
    glutSolidTeapot(0.2);
}
void body(){
    glColor3f(1,1,0);
    glutSolidTeapot(0.3);
}
float angle=0;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///畫圖前, 先清畫面
    body();
    glPushMatrix();
        glTranslatef(0.5,0.2,0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.3,0,0);
        hand();
    glPopMatrix();
    glutSwapBuffers();///畫好後,交換出來
    angle+=0.05;
}

int main(int argc, char** argv) ///main()主函式 進階版
{
    glutInit( &argc, argv); ///把參數,送給 glutInit 初始化
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH ); ///雙緩衡區 + 3D深度功能
    glutCreateWindow("week11 組裝頭手讓手轉動"); ///開 GLUT 視窗

    glutIdleFunc(display);
    glutDisplayFunc(display); ///用來顯示的函式

    glutMainLoop(); ///主要的程式迴圈
}



2022年4月26日 星期二

瘋狂無敵圖學死亡筆記 Week10

0.用上週改為圖在茶壺上 

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

#include <opencv/cv.h>

#include <GL/glut.h>

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;

}

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

    glutCreateWindow("week09 texture");

    glutDisplayFunc(display);

    myTexture("OIP.png");

    glutMainLoop();

}

1.背景

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

#include <opencv/cv.h>

#include <GL/glut.h>


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

    ///glutSolidTeapot( 0.3 );

    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("week09 texture");

    glutDisplayFunc(display);

    myTexture("OIP.png");

    glutMainLoop();

}





2.地球

gluSphere( sphere, 1, 30, 30 );

參數是(指標,r半徑,slices柳丁切經縣,stack堆疊緯)



#include <opencv/highgui.h> 
#include <opencv/cv.h>
#include <GL/glut.h>
GLUquadric * sphere =NULL; ///指標只到二次曲面
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);
    gluQuadricTexture(sphere, 1); ///設好貼圖
    gluSphere(sphere, 1, 30, 30); ///畫圓球
    glutSwapBuffers();

}

int main(int argc, char**argv){

    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 texture");


    glutDisplayFunc(display);
    myTexture("OIP.png"); ///地球的地圖,圖等一下準備好
    sphere=gluNewQuadric(); ///準備好二次曲面


    glutMainLoop();

}
2-1能轉動的地球

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
GLUquadric * sphere =NULL; ///指標只到二次曲面
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=0;///旋轉角度
void display(){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glRotatef(angle, 0, 0, 1);
        gluQuadricTexture(sphere, 1); ///設好貼圖
        gluSphere(sphere, 1, 30, 30); ///畫圓球
    glPopMatrix();

    glutSwapBuffers();
    angle+=0.01; ///每次執行dispaly()時angle+1(看電腦好的轉少點)
}

int main(int argc, char**argv){

    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 texture");

    glutIdleFunc(display); ///有空idle 呼叫display()
    glutDisplayFunc(display);
    myTexture("OIP.png"); ///地球的地圖,圖等一下準備好
    sphere=gluNewQuadric(); ///準備好二次曲面


    glutMainLoop();

}

#include <opencv/highgui.h> 
#include <opencv/cv.h>
#include <GL/glut.h>
GLUquadric * sphere =NULL; ///指標只到二次曲面
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=0;///旋轉角度
void display(){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glRotatef(90, 1, 0, 0);///把地球轉正,而非由上往下看
        glRotatef(angle, 0, 0, 1);
        gluQuadricTexture(sphere, 1); ///設好貼圖
        gluSphere(sphere, 1, 30, 30); ///畫圓球
    glPopMatrix();

    glutSwapBuffers();
    angle+=0.01; ///每次執行dispaly()時angle+1(看電腦好的轉少點)
}

int main(int argc, char**argv){

    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week09 texture");
   
    glEnable(GL_DEPTH_TEST);///開3D深度測試,才會有3D效果(解決破圖)
    glutIdleFunc(display); ///有空idle 呼叫display()
    glutDisplayFunc(display);
    myTexture("OIP.png"); ///地球的地圖,圖等一下準備好
    sphere=gluNewQuadric(); ///準備好二次曲面

    glutMainLoop();

}

3. 貼圖+模型(!做鋼彈咯!!!!!)
    1.下載https://jsyeh.org/3dcg10的window.zip data.zip source.zip(glm.h glm.cpp放在專案目錄)
    2.下載老師買的模型 myGundam 3D模型
    3.工作目錄在 (in C:\Users\User\Desktop\freeglut\bin)
    4.glm.h glm.cpp放在專案main.cpp旁邊
    5.利用上面地球模型改




2022年4月19日 星期二

瘋狂無敵圖學死亡筆記 Week09

 0.貼圖座標glTexCoord2f(tx,ty)

glTexCoord2f(0.0,0.0)由左下開始(逆時針跑)

(0.0,1.0)    <---    (1.0,1.0)

                                ^

(0.0,0.0)     --->   (1.0,0.0)

1.OpenCV讀圖、秀圖 OpenCV 2.1.0 vs2008 版

安裝時注意事項

(1)選第二個 add PATH(程式執行會去找exe或dll的目錄路徑)

(2)預設目錄

***bin include lib

bin二進位執行檔

include外掛

2.存成week09_opencv.cpp

```c++

#include <opencv/highgui.h>//使用opencv外掛

int main(){

///Ipl:Intel perfromance library

    IplImage *img =cvLoadImage("檔名.png"); //讀檔

    cvShowImage("Week09", img);  //秀圖

    cvWaitKey( 0 ); //等待任意鍵繼續

}

```



2-1.設定Setting-Comiler設定 Include 目錄

2-2.設定Setting-Comiler設定 Lib 目錄

Search Directories

  (Compiler) 對應Include目錄 c:\opencv2.1\include

  (Linker) 對應Lib目錄 c:\opencv2.1\lib

2-3.設定Setting-Comiler設定 咒語 Linker Settings加入 cv210、cxcore210、highgui210



3. 結合OpenCV 和 OpenGL 把10行茶壺glut+3-5行opnecv讀圖秀圖

#include <GL/glut.h> ///使用GLUT外掛,簡化程式
#include <opencv/highgui.h>

void myTextrue(){
     Iplmage *img = cvLoadImage("檔案.png"); //讀檔

    cvShowImage("Week09", img);  //秀圖

    ///cvWaitKey( 0 ); //需要按任意見才能讓茶壺glutMainLoop(),可以不用寫,因為有glutMainLoop()
}
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///畫圖前, 先清畫面
    glutSolidTeapot(0.3); ///實心的茶壼

    glutSwapBuffers();///畫好後,交換出來
}

int main(int argc, char** argv) ///main()主函式 進階版
{
    glutInit( &argc, argv); ///把參數,送給 glutInit 初始化
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH ); ///雙緩衡區 + 3D深度功能
    glutCreateWindow("第02週的程式哦!"); ///開 GLUT 視窗

    glutDisplayFunc(display); ///用來顯示的函式
    myTexture();///執行這視窗

    glutMainLoop(); ///主要的程式迴圈
}


3-1圖檔放在 工作目錄 (in C:\Users\User\Desktop\freeglut\bin)

2022年4月12日 星期二

瘋狂無敵圖學死亡筆記 Week08

了解OBJ模型檔 (v vt vn f)、介紹glm.h glm.cpp (c)與.cbp專案 .obj物件 .mtl材質 


0.  jsyeh.org/3dcg10 下載

windows.zip => 下載\windows\Light Material.exe

data.zip    => 下載\windows\data\ 3D模型

source.zip 

執行 Light Material.exe 今天的主角(打光/模型)


0-1. freeglut Moodle下載/安裝, lib\libglut32.a

File-New-Project, GLUT專案, 偷它的程式 放 Notepad++

GLUT callback 像是 display() mouse() motion() keyboard(), 有期中考題,像是 glPushMatrix()等, 重點是打光的陣列、打光的函式.zip



#include <GL/glut.h>


GLUT callback ? 會被 GLUT 呼叫的函式

我們寫的那些display() keyboard() mouse() motion()函式



0-2. 從 GitHub 拿出上週的程式!!! week06_light 

git 下載你上週的程式

git clone 下來 或在你的專案資料夾裡 git pull

把 week06_light\main.cpp 用 Notepad++ 開起來, copy

paste 到 week08_model 的 main.cpp

執行,會看到打光的黃色茶壼



0-3. 把 source.zip 看裡面的3個程式 glm.h glm.c lightmaterial.cpp, 拿裡面的程式來用,便能讀入3D模型




0-4. 把 source.zip 看裡面的3個程式 glm.h glm.c 研究 lightmaterial.cpp, 拿裡面的程式來用,便能讀入3D模型, 要include 雙引號的 glm.h 要把 glm.c改檔名成glm.cpp 並加入專案, 再用 Notepad++研究學習lightmaterial.c的程式內容 .zip


1. glm.h 我們要 include 它

2. glm.c 改檔名 glm.cpp 要加入專案

3. lightmaterial.cpp 用 Notepad++ 偷


#include <GL/glut.h> //角括號,是系統的include裡 的檔案

#include "glm.h" //雙引號,同目錄裡 的檔案



GLMmodel* pmodel = NULL; //指到GLMmodel模型的指標,NULL代表還沒好



void drawmodel(void)

{

    if (!pmodel) {

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

if (!pmodel) exit(0);

glmUnitize(pmodel);

glmFacetNormals(pmodel);

glmVertexNormals(pmodel, 90.0);

    }


    glmDraw(pmodel, GLM_SMOOTH);

}///用來畫3D模型的程式碼, "學習它"



2. 畫 3D 模型檔

把 glutSolidTeapot()改成畫 drawmodel(), 要在CodeBlocks下方 藍色Build Log 找你的 working dir 工作目錄:(in C:\Users\...\Desktop\freeglut\bin\)目錄, 在裡面放 data資料夾, 以便讀取 data裡的模型, 再把glm.cpp 及 glm.h 放在 week08_model 目錄中, 再 Add files 把 glm.cpp 加到專案中



2-1. 各種模形都可以放在專案 week08_model (記得File-Save Project存檔, 放到 GitHub 裡)


2-2. 介紹3D模型相關資料

1. Wavefront OBJ 檔 https://zh.wikipedia.org/wiki/Wavefront_.obj%E6%96%87%E4%BB%B6

2. Wavefront OBJ 英文介紹較詳細https://en.wikipedia.org/wiki/Wavefront_.obj_file

3. OBJ vs. MTL 檔

4. v 是 vertex, vn 是 vertex normal, vt 是 vertex texture貼圖 coordinate, f 是 face 面


3. 期中考 OpenGL 必背10函式

  glPushMatrix(); //備份矩陣

   glTranslatef(x,y,z);//移動

    glRotatef(角度, x,y,z);//轉動

    glScalef(x,y,z);//縮放

   glBegin(GL_POLYGON);//開始畫

     glColor3f(r,g,b);//色彩

      glTexCoord2f(tx, ty);//貼圖座標

      glNormal3f( nx,ny,nz);//打光法向量

      glVertex3f(x,y,z);//頂點

  glEnd();//結束畫

glPopMatrix(); //還原矩陣

2022年3月29日 星期二

瘋狂無敵圖學死亡筆記 Week06

 0. 打光Light Material

(左上)左鍵drag可旋轉

(左上)右鍵換模型

(左下)右鍵換material

glLightfv() ***float為浮點數 vector是陣列

GLfloat light_pos[]={-2.0,2.0,2.0,1.0};陣列

glLightfv(GL_LIGHT0,GL_POSITION,陣列)

光的性質(位置,Ambient,Diffuse,Specular)

                 第幾盞燈       設定它的位置

1.

***Ctrl-F找light偷下面程式

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


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


1-1. 做有燈光茶壺

#include <GL/glut.h>
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 };
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///畫圖前, 先清畫面
        glColor3f(1,1,0); ///設定色彩
        glutSolidTeapot(0.3); ///實心的茶壼
    glutSwapBuffers();///畫好後,交換出來
}

int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week06 Light");

    glutDisplayFunc(display);


    glEnable(GL_DEPTH_TEST);///3D功能
    glDepthFunc(GL_LIGHT0);///定義第一盞燈


    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(); ///主要的程式迴圈
}


1-2. 融合上週mouse放大小

#include <GL/glut.h>
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 };

float x=150, y=150, z=0, scale=1.0;
int oldX=0, oldY=0;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///畫圖前, 先清畫面

00000000
        glPushMatrix();///備份矩陣
            glTranslatef((x-150)/150.0,-(y-150)/150.0,z);
            glScalef(scale, scale, scale);///都縮放成scale倍+
            glColor3f(1,1,0);///黃色
            glutSolidTeapot(0.3);
        glPopMatrix();///還原矩陣

    glutSwapBuffers();///畫好後,交換出來
}
void mouse(int button, int state, int mouseX, int mouseY){
    ///為了解決瞬間移動的問題,改用延續拖移
    oldX=mouseX;
    oldY=mouseY;
}
void motion(int mouseX,int mouseY){
    if(mouseX-oldX>0) scale *=1.01;///縮放
    if(mouseX-oldX<0) scale *=0.99;
    /*x+=(mouseX-oldX);
    y+=(mouseY-oldY);*/
    oldX=mouseX;
    oldY=mouseY;
    display();///重畫
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week06 Light");

    glutDisplayFunc(display);


    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LIGHT0);


    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);///第二代主角
    glutMainLoop(); ///主要的程式迴圈
}

1-3. 移動、旋轉、縮放

#include <GL/glut.h>
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 };

float x=150, y=150, z=0, scale=1.0, angle=0.0;
int oldX=0, oldY=0;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///畫圖前, 先清畫面


        glPushMatrix();///備份矩陣
            glTranslatef((x-150)/150.0,-(y-150)/150.0,z);///移動
            glRotatef(angle, 0, 1, 0);///對Y軸旋轉
            glScalef(scale, scale, scale);///縮放成scale倍+
            glColor3f(1,1,0);///黃色
            glutSolidTeapot(0.3);
        glPopMatrix();///還原矩陣

    glutSwapBuffers();///畫好後,交換出來
}
void mouse(int button, int state, int mouseX, int mouseY){
    ///為了解決瞬間移動的問題,改用延續拖移
    oldX=mouseX;
    oldY=mouseY;
}
void motion(int mouseX,int mouseY){
//    if(mouseX-oldX>0) scale *=1.01;///縮放
//    if(mouseX-oldX<0) scale *=0.99;
    angle += (mouseX - oldX);///旋轉
    /*x+=(mouseX-oldX);///移動
    y+=(mouseY-oldY);*/
    oldX=mouseX;
    oldY=mouseY;
    display();///重畫
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week06 Light");

    glutDisplayFunc(display);


    glEnable(GL_DEPTH_TEST);///3D功能
    glDepthFunc(GL_LIGHT0);///定義一盞燈


    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);///第二代主角
    glutMainLoop(); ///主要的程式迴圈
}


2.all用移動mouse、keyboard、motion
用鍵盤輸入要控制移動、旋轉還是縮放

#include <GL/glut.h>
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 };

float x=150, y=150, z=0, scale=1.0, angle=0.0;
int oldX=0, oldY=0, now=1;///1.移動 2.旋轉 3.縮放
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///畫圖前, 先清畫面


        glPushMatrix();///備份矩陣
            glTranslatef((x-150)/150.0,-(y-150)/150.0,z);///移動
            glRotatef(angle, 0, 1, 0);///對Y軸旋轉
            glScalef(scale, scale, scale);///縮放成scale倍+
            glColor3f(1,1,0);///黃色
            glutSolidTeapot(0.3);
        glPopMatrix();///還原矩陣

    glutSwapBuffers();///畫好後,交換出來
}
void keyboard(unsigned char key, int mouseX, int mouseY){///輸入中文會被os擋住

    if(key=='1' || key=='w' || key=='W')now=1;///移動
    if(key=='2' || key=='e' || key=='E')now=2;///旋轉
    if(key=='3' || key=='r' || key=='R')now=3;///縮放

}
void mouse(int button, int state, int mouseX, int mouseY){
    ///為了解決瞬間移動的問題,改用延續拖移
    oldX=mouseX;
    oldY=mouseY;
}
void motion(int mouseX,int mouseY){

    if(now==1){
        x+=(mouseX-oldX);///移動
        y+=(mouseY-oldY);
    }
    else if(now==2){
        angle += (mouseX - oldX);///旋轉
    }
    else if(now==3){
        if(mouseX-oldX>0) scale *=1.01;///縮放
        if(mouseX-oldX<0) scale *=0.99;
    }

    oldX=mouseX;
    oldY=mouseY;
    display();///重畫
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week06 Light");

    glutDisplayFunc(display);


    glEnable(GL_DEPTH_TEST);///3D功能
    glDepthFunc(GL_LIGHT0);///定義一盞燈


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

    glutKeyboardFunc(keyboard);///第0代主角
    glutMouseFunc(mouse);///第一代主角
    glutMotionFunc(motion);///第二代主角
    glutMainLoop(); ///主要的程式迴圈
}


VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...