顯示具有 08161115_吳玟萱 標籤的文章。 顯示所有文章
顯示具有 08161115_吳玟萱 標籤的文章。 顯示所有文章

2021年6月16日 星期三

本人發言不代表本人立場 week17

 主題:攝影機、總複習

1. 複習打光

  • 畫兩個茶壺


  • 打光加上深度
#include <stdio.h>
#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(0,1,0);
    glutSolidTeapot(0.3);
    glColor3f(1,0,0);
    glutSolidTeapot(0.1);///畫茶壺
    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("week17");
    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();
}




2. 複習TRT

  • 畫左手臂
float angle=45;
void display()
{
    glClearColor(1,1,0,0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(0,1,0);
        glutSolidTeapot(0.3);///身體(先註解掉)
        glPushMatrix();
            glTranslatef(-0.3,0,0);///3.轉動的關節掛到肩上
            glRotatef(angle,0,0,1);///2.轉動(之後可能會很多行)
            glTranslatef(-0.3,0.1,0);///1.旋轉的關節移到畫面中心
            glutSolidTeapot(0.3);///左手
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}




3. void mouse() void motion()

  • 加上mouse motion 讓他轉動
float angle=45,oldx,oldy;
void mouse(int button,int state,int x,int y){
    oldx=x;
}
void motion(int x,int y){
    angle+=x-oldx;
    oldx=x;
    glutPostRedisplay();
}
        
        main函式加上

        glutMouseFunc(mouse);
        glutMotionFunc(motion); 



4. void keyboard()

  • 做出兩條手臂
  • 加上鍵盤控制
#include <stdio.h>
#include <GL/glut.h>
float oldx,oldy;
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;
    printf("angleID:%d\n",angleID);
}
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();
}
void display()
{
    glClearColor(1,1,0,0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///左手臂
        glColor3f(0,1,0);
        glutSolidTeapot(0.3);///身體(先註解掉)
        glPushMatrix();///3.轉動的關節掛到肩上
            glTranslatef(-0.3,0,0);
            glRotatef(angle[0],0,0,1);///2.轉動(之後可能會很多行)
            glTranslatef(-0.3,0.1,0);///1.旋轉的關節移到畫面中心
            glutSolidTeapot(0.3);///左手
            glPushMatrix();///3.轉動的關節掛到肩上
                glTranslatef(-0.3,0,0);
                glRotatef(angle[1],0,0,1);///2.轉動(之後可能會很多行)
                glTranslatef(-0.3,0.1,0);///1.旋轉的關節移到畫面中心
                glutSolidTeapot(0.3);
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glPushMatrix();///右手臂
        glColor3f(0,1,0);
        glutSolidTeapot(0.3);///身體(先註解掉)
        glPushMatrix();///3.轉動的關節掛到肩上
            glTranslatef(0.3,0,0);
            glRotatef(angle[2],0,0,1);///2.轉動(之後可能會很多行)
            glTranslatef(0.3,0.1,0);///1.旋轉的關節移到畫面中心
            glutSolidTeapot(0.3);///左手
            glPushMatrix();///3.轉動的關節掛到肩上
                glTranslatef(0.3,0,0);
                glRotatef(angle[3],0,0,1);///2.轉動(之後可能會很多行)
                glTranslatef(0.3,0.1,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 );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week17");

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);

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



5. 存讀檔

  • 先加上指標
    • FILE * fout =NULL;
    • FILE * fin =NULL;
    if(key=='s'){///save
        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 one line\n");
    }///程式要關掉(or fclose(fout))檔案才會更新到硬碟

    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();///重畫畫面
    }


6. Timer

  • 加上timer播動畫
void timer(int t){
    glutTimerFunc(500,timer,t+1);
    if(fin==NULL)fin=fopen("angle.txt","r");
    for(int i=0;i<20;i++) fscanf(fin,"%f",&angle[i]);

    glutPostRedisplay();///重畫畫面
}
 
keyboard加上 
if(key=='p') glutTimerFunc(0,timer,0);

 




  • 讓動畫更順
    • 利用內插法
float oldx,oldy;
float angle[20]={},angleOld[20],angleNew[20];
int angleID=0;
FILE * fout =NULL;
FILE * fin =NULL;
void timer(int t){
    glutTimerFunc(50,timer,t+1);
    if(t%10==0){
        for(int i=0;i<20;i++) angleOld[i]=angleNew[i];///備份資料
        if(fin==NULL)fin=fopen("angle.txt","r");///read
        for(int i=0;i<20;i++) fscanf(fin,"%f",&angleNew[i]);///讀到angleNew
    }
    float alpha=(t%10)/10.0;
    for(int i=0;i<20;i++) angle[i]=alpha*angleNew[i]+(1-alpha)*angleOld[i];
    glutPostRedisplay();///重畫畫面
}
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=='p') glutTimerFunc(0,timer,0);
    if(key=='s'){///save
        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 one line\n");
    }///程式要關掉(or fclose(fout))檔案才會更新到硬碟
    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();///重畫畫面
    }
}



7. 複習 openCV 貼圖

GLuint id1, id2; //增加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;
}
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_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week08 ");
    glutDisplayFunc(display);

    id1 = myTexture("one.png");
    id2 = myTexture("Grey.jpg");
    glEnable(GL_DEPTH_TEST);//開啟深度測試讓他可以變成3D
    glutMainLoop();


2021年6月9日 星期三

本人發言不代表本人立場 week16

今日主題:動畫、存讀檔

1. 改程式碼

  • 把上週程式拿來這週用
  • 把timer的程式拿掉改用mouse motion
int oldx=0;
void mouse(int botton,int x,int y){
    oldx=x;
}
void motion(int x,int y){
    angle[angleID]+= x-oldx;
    oldx=x;
    glutPostRedisplay();
}  

配合main函式的glutMotionFunc(motion);

執行結果: 


















2. 動畫、存檔

  • 加上指標 FILE * fout = NULL;
  • 在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");

執行結果:







  • 加上timer
  • 先加上指標 FILE * fin = NULL

glutTimerFunc(30,timer,t+1);
if(fin==NULL) fin=fopen("angle.txt","r");
for(int i=0;i<20;i++) fscanf(fin,"%f",&angle[i]);
glutPostResisplay();

  • 先註解timer跟存檔的程式碼
  • 加上 's' 'r' 'p' key 代表 'save' 'read' 'play'
  • 把 fout 的程式碼貼在 key[s]

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

  • 把 fopen 的程式碼貼在 key[r]

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


3. 內插

  • 改timer
float angleold[20]={},anglenew[20]={};
void timer( int t ){
    glutTimerFunc(30,timer,t+1);
    if(t%10==0){///10frame 讀新資料
        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%10)/10.0;
    for(int i=0;i<20;i++){
        angle[i]=alpha*anglenew[i]+(1-alpha)*angleold[i];
    }
    glutPostRedisplay();
}

就會跑出動畫了(原理 to be continue)

2021年6月2日 星期三

本人發言不代表本人立場 week15

主題:機器人2.0 (關節轉動、存讀檔)

1. fout 、fscanf

  • 用fout時,file指標fout配合模式w+
 #include <stdio.h>
int main(int argc, char**argv)
{
    FILE*fout=NULL;///檔案的指標
    fout=fopen("new.txt","w+");///用w+模式開檔
    printf("Hello World\n");
    fprintf(fout,"Hello World\n");
}

 

  • txt檔在bin目錄 => 複製freeglut.dll到專案目錄 =>更改執行目錄(前幾周內容)


  • 用fscanf時,file指標fin配合模式r

    FILE * fin = NULL;
    fin = fopen("new1.txt","r");
    char line[100];
    fscanf(fin,"%s",line);
    printf("what you read: %s\n",line);
    fscanf(fin,"%s",line);
    printf("what you read: %s\n ",line);


2. 關節

  • 先複製老師給的程式碼,用display畫出三個茶壺(手臂)
  • 接著利用timer改變角度
#include <stdio.h>
#include <GL/glut.h>
float angle=0,diff=2;
void timer(int t){
    glutTimerFunc(30,timer,t+1);
    angle+=diff;
    if(angle>90) diff=-2;
    if(angle<0) diff=+2;
    glutPostRedisplay();///重畫
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        ///glutSolidTeapot( 0.3 );///身體
        glPushMatrix();
            glTranslatef(-0.3,0,0);///(3)掛在正確的地方
            glRotatef(angle,0,0,1);///(2)旋轉
            glTranslatef(-0.4,0,0);///(1)把關節旋轉中心放到畫面中心
            glutSolidTeapot( 0.3 );///左手臂(重疊了)
            glPushMatrix();
                glutSolidTeapot( 0.3 );///左手肘(重疊了)
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int main( int argc, char ** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15");
    glutTimerFunc(0,timer,0);
    glutDisplayFunc(display);
    glutMainLoop();
}

執行結果:




















  • 利用TRT完成左手臂
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();
            glTranslatef(-0.3,0,0);///(3)掛在正確的地方
            glRotatef(angle,0,0,1);///(2)旋轉
            glTranslatef(-0.4,0,0);///(1)把關節旋轉中心放到畫面中心
            glutSolidTeapot( 0.3 );///左手臂(重疊了)
            glPushMatrix();
                glTranslatef(-0.3,0,0);///(3)掛在正確的地方
                glRotatef(angle,0,0,1);///(2)旋轉
                glTranslatef(-0.4,0,0);///(1)把關節旋轉中心放到畫面中心
                glutSolidTeapot( 0.3 );///左手肘(重疊了)
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
 
執行結果:

















  • 用陣列整合angle
  • 用鍵盤控制轉動
#include <stdio.h>
#include <GL/glut.h>
float angle[20]={},diff=2;///本來只有一個角度,現在有很多個,初始為0
int angleID=0;///現在要改第幾個角度
void timer(int t){
    glutTimerFunc(30,timer,t+1);
    angle[angleID]+=diff;
    if(angle[angleID]>90) diff=-2;
    if(angle[angleID]<0) diff=+2;
    glutPostRedisplay();///重畫
}
void keyboard(unsigned char key,int x,int y){
    if(key=='1') angleID=1;
    if(key=='0') angleID=0;
    if(key=='2') angleID=2;
    if(key=='3') angleID=3;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();
            glTranslatef(-0.3,0,0);///(3)掛在正確的地方
            glRotatef(angle[0],0,0,1);///(2)旋轉
            glTranslatef(-0.4,0,0);///(1)把關節旋轉中心放到畫面中心
            glutSolidTeapot( 0.3 );///左手臂(重疊了)
            glPushMatrix();
                glTranslatef(-0.3,0,0);///(3)掛在正確的地方
                glRotatef(angle[1],0,0,1);///(2)旋轉
                glTranslatef(-0.4,0,0);///(1)把關節旋轉中心放到畫面中心
                glutSolidTeapot( 0.3 );///左手肘(重疊了)
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glPushMatrix();
            glTranslatef(0.3,0,0);///(3)掛在正確的地方
            glRotatef(angle[2],0,0,1);///(2)旋轉
            glTranslatef(0.3,0,0);///(1)把關節旋轉中心放到畫面中心
            glutSolidTeapot( 0.3 );///右手臂(重疊了)
            glPushMatrix();
                glTranslatef(0.3,0,0);///(3)掛在正確的地方
                glRotatef(angle[3],0,0,1);///(2)旋轉
                glTranslatef(0.3,0,0);///(1)把關節旋轉中心放到畫面中心
                glutSolidTeapot( 0.3 );///右手肘(重疊了)
            glPopMatrix();
        glPopMatrix();
    glutSwapBuffers();
}
int main( int argc, char ** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15");
    glutKeyboardFunc(keyboard);
    glutTimerFunc(0,timer,0);
    glutDisplayFunc(display);
    glutMainLoop();
}


執行結果:

2021年5月26日 星期三

本人發言不代表本人立場 week14

主題:Timer & 動畫


0. 複習


MAYA export :

  • 有貼圖 >>> GLM_TEXTURE
  • 有material >>> GLM_MATERIAL


1. 寫程式(counter)

  • 開GLUT專案 => 備份main.cpp

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

    glutDisplayFunc(display);
    glutMainLoop();

執行結果(實心、框線) : 








 


















  • 加上timer

#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    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");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);
    glutMainLoop();
}

執行結果:


  • 畫會旋轉的方塊
#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();
}
void timer(int t)
    glutTimerFunc(30,timer,t+1);///20: 50fps, 30: 33fps, 50: 20fps ///不能設太小
    glClearColor(1,0,0,0);
    angle++;
    display();///重畫畫面
}
int main(int argc,char ** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week14");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);
    glutMainLoop();
}

執行結果:


  • 特定角度旋轉
#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();
}
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");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);
    glutMainLoop();
}

執行結果:





















  • 加上TRT轉動
    • 先畫簡易圖形
#include <GL/glut.h>
float angle=0;
void drawArm1()
{
    glPushMatrix();
        glScalef(1,0.5,0.5);
        glColor3f(1,0,0);
        glutSolidCube(0.2);
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1,1,1);
        glutSolidCube(0.4);
        glPushMatrix();
            glTranslatef(-0.2,0.15,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);
    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");

    glutDisplayFunc(display);
    glutTimerFunc(3000,timer,0);
    ///glutTimerFunc()
    glutMainLoop();
}

執行結果:


2021年5月19日 星期三

本人發言不代表本人立場 week13

主題:做出有關節的機器人

0. 設好環境

1. 貼圖

  • 可以用老師的範例hackmd.io/@jsyeh/opengl或自己的
  • 開GLUT專案(備份main.cpp)
  • 貼圖範例放進main(Diffuse.jpg)
  • 圖檔放進freeglut/bin
    執行結果:

2. 設定目錄

  • freeglut.dll複製到專案目錄
  • 圖片也移到專案目錄
  • 用notpad++開今天的專案檔 => 兩個working_dir改成"." => 存檔
  • Reload

3. glm

  • 準備檔案source.zip(glm.h,glm.c改cpp,transformation.c)
  • 準備模型gundam還沒切開.zip(Gundam.obj,Gundam.mtl,Diffuse.jpg)
  • 加入程式(專案中add glm.cpp)
  • 用notepad++開transformation.c複製程式碼
    • #include "glm.h"
    • GLModel * pmodel = NULL
    • 複製drawmodel()函式
    • 改glmReadOBJ("檔名")跟改右邊的glmDraw(...| GLM_TEXTURE)
    • 在display()裡叫drawmodel()
    • 最後變成:
#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);
}

  • 把茶壺註解掉 

                                執行:

                            • 垂直旋轉disffuse.jpg
                            • 再執行一次

                            4. 旋轉

                            • 整體旋轉
                              • glPushMatrix(); glRotatef(角度,0,1,0);glPopMatrix();

                                執行結果: 


                            5. TRT

                            • 加入模型
                            • 把 GLMmodel * body = NULL 等都加上指標

                            glmReadOBJ() , glmDraw  >>>>>>>>>> To Be Continue

                            2021年5月12日 星期三

                            本人發言不代表本人立場 week12

                            主題:鋼彈模型

                            1. 3D Exploration

                            • 安裝3D Exploration -> 用它開gundam模型
                            • 存成cpp檔 (要選sample APP)


                            2. 改程式碼

                            • 開OpenGL專案
                            • remove main.c
                            • add gundam_1.cpp (要放同一個目錄)


                            • 加上:
                            #define GL_BGRA_EXT 0x80E1
                            #define GL_BGR_EXT 0x80E0

                            •  註解掉 Pallette 的兩行 -> 執行


                            • 註解原本旋轉縮放的程式碼,改成:
                            glScalef(3,3,3);
                            glRotatef(nAngle,0,1,0);

                            執行結果: 


                            • 用MAYA匯入模型 -> 選取要的face -> 匯出 Obj 檔

                            • 開GLUT -> 貼上程式碼
                            • 用notepad++修改工作目錄
                            • 把freeglut.dll複製到專案目錄

                            裝opencv
                            照前幾個禮拜的教學貼圖跟放glm.cpp

                            2021年5月8日 星期六

                            本人發言不代表本人立場 week10

                            主題:背景音樂

                             1.播放聲音

                            • 還沒有放到執行目錄,所以只有系統音效

                            #include<windows.h>
                            int main()
                            {   ///執行目錄     ///空指標  ///要等同步
                                PlaySound("shot.wav", NULL, SND_SYNC);
                            }
                             

                            • 找音源檔,一定要wav檔 
                            • 讓多個音源一起播放(輸入完數字按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);
                                }
                            }
                             
                            執行結果: 

                            • 圖片後加上聲音(不用按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();
                            }
                             
                            執行結果:


                             

                            • 用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");

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

                            }

                            •  編輯cbp檔,把資料夾路徑刪掉改成 .
                            • 把音樂檔都移到專案檔


                             

                            距地表面160 Week11

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