顯示具有 02160111_鄭庭峰 標籤的文章。 顯示所有文章
顯示具有 02160111_鄭庭峰 標籤的文章。 顯示所有文章

2015年6月19日 星期五

2015年6月11日 星期四

02160111_鄭庭峰_week16

(1)移動 選轉 縮放
(2)TRT 關節結構
(3)存檔 讀檔 撥放
(4)內插
(5)期末作品

內插程式 :
 #include <GL/glut.h>
#include <stdio.h>
FILE * fout=NULL;
FILE * fin=NULL;
float  oldX=0, oldY=0;
float angle[10]={0}, angleOld[10], angleNew[10];
int angleID=1;
void drawBody(){
    glPushMatrix();
    glScalef(1, 0.5, 0.5);
    glutSolidCube(1);
    glPopMatrix();
}
void drawArm(){
    glPushMatrix();
    glScalef(0.6, 0.3, 0.3);
    glutSolidCube(1);
    glPopMatrix();
}
void readNew()   ///讀檔案  讀進一筆新的資料
{
    if(fin==NULL) fin=fopen("a.txt", "r");
    for(int i=0;i<10;i++)
    {
        angleOld[i]=angleNew[i];
        fscanf(fin, "%f", &angleNew[i]);
        printf("%f ",angleNew[i]);
    }
    printf("\n");
}
void display()
{
    { ///Lighting
    glColor3ub(166,132,100);
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    //glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }
    glPushMatrix();
        glTranslatef(0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
        glRotatef(angle[1], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
        glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
        drawArm();///這是個Arm ver 1  Right Upper Arm
        glPushMatrix();
            glTranslatef(0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
            glRotatef(angle[2], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
            glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
            drawArm(); ///Right Lower Arm
        glPopMatrix();
    glPopMatrix();
    glPushMatrix();
        glTranslatef(-0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
        glRotatef(-angle[3], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
        glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
        drawArm();///這是個Arm ver 1  Left Upper Arm
        glPushMatrix();
            glTranslatef(-0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
            glRotatef(-angle[4], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
            glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
            drawArm(); ///Left Lower Arm
        glPopMatrix();
    glPopMatrix();
    drawBody();
    glFlush();
}
void motion(int x, int y)
{   angle[angleID] -= y - oldY;
    oldY=y; oldX=x;
   /// if(fout==NULL) fout=fopen("a.txt", "w+");
   /// for(int i=0;i<10;i++)
   /// {
   ///    printf("%f ",angle[i]);
   ///     fprintf(fout, "%f ",angle[i]);
   /// }
   /// printf("\n");
   /// fprintf(fout, "\n");
}
void timerPlay(int t)  ///計時器 用來做內插的
{
    glutTimerFunc(20, timerPlay, t+1);
    float a=(t%50)/50.0;
    if(t%50==0)  readNew();
    for(int i=0;i<10;i++)
    {
        angle[i]=(1-a)*angleOld[i]+(a)*angleNew[i];  ///這是內插公式
    }
    glutPostRedisplay();
}
void mouse(int button, int state, int x, int y){
    if(state==GLUT_DOWN) { oldX=x; oldY=y; }
}
void keyboard(unsigned char key, int x, int y)
{
    if(key=='1') angleID=1;
    if(key=='2') angleID=2;
    if(key=='3') angleID=3;
    if(key=='4') angleID=4;
    if(key=='p') glutTimerFunc(20, timerPlay, 0);
    if(key=='s')   ///寫檔案  寫入一筆動作
    {
        if(fout==NULL) fout=fopen("a.txt", "w+");
        for(int i=0;i<10;i++)
        {
            fprintf(fout, "%.1f ",angle[i]);
            printf("%.1f ",angle[i]);
        }
        fprintf(fout, "\n");
        printf("\n");
    }
}
void timer(int t)
{
    glutTimerFunc(20, timer, t+1);
    //angle++;
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("T-R-T test");
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
}

執行時 :   先做動作-->按S存檔-->...動作-->S存檔-->....-->都做完了 關視窗  重開按P跑動作

小葉老師詳細的註解~

2015年6月4日 星期四

02160111_鄭庭峰_week15

(1)複習T-R-T
(2)期中作品
(3)做出全身關節
(4)鍵盤滑鼠操控動作
(5)存檔 play播放


複習TRT :

#include <GL/glut.h>
float angle=0, oldX=0, oldY=0;
void drawBody(){
    glPushMatrix();
    glScalef(1, 0.5, 0.5);
    glutSolidCube(1);
    glPopMatrix();
}
void drawArm(){
    glPushMatrix();
    glScalef(0.6, 0.3, 0.3);
    glutSolidCube(1);
    glPopMatrix();
}
void display()
{
    { ///Lighting
    glColor3ub(166,132,100);
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    //glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }
    glPushMatrix();
        glTranslatef(0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
        glRotatef(angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
        glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
        drawArm();///這是個Arm ver 1  Right Upper Arm
        glPushMatrix();
            glTranslatef(0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
            glRotatef(angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
            glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
            drawArm(); ///Right Lower Arm
        glPopMatrix();
    glPopMatrix();
    glPushMatrix();
        glTranslatef(-0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
        glRotatef(-angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
        glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
        drawArm();///這是個Arm ver 1  Left Upper Arm
        glPushMatrix();
            glTranslatef(-0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
            glRotatef(-angle, 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
            glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
            drawArm(); ///Left Lower Arm
        glPopMatrix();
    glPopMatrix();
    drawBody();
    glFlush();
}
void motion(int x, int y)
{   angle -= y - oldY;
    oldY=y; oldX=x;
}
void mouse(int button, int state, int x, int y){
    if(state==GLUT_DOWN) { oldX=x; oldY=y; }
}
void timer(int t)
{
    glutTimerFunc(20, timer, t+1);
    //angle++;
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("T-R-T test");
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

全身關節 :



用鍵盤和滑鼠能控制關節 :

#include <GL/glut.h>
#include <stdio.h> ///寫檔案
FILE * fout=NULL;/// file output 寫檔案
float  oldX=0, oldY=0;
void drawBody(){
    glPushMatrix();
    glScalef(1, 0.5, 0.5);
    glutSolidCube(1);
    glPopMatrix();
}
void drawArm(){
    glPushMatrix();
    glScalef(0.6, 0.3, 0.3);
    glutSolidCube(1);
    glPopMatrix();
}
float angle[10];
int angleID=1;
void display()
{
    { ///Lighting
    glColor3ub(166,132,100);
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    //glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }
    glPushMatrix();
        glTranslatef(0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
        glRotatef(angle[1], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
        glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
        drawArm();///這是個Arm ver 1  Right Upper Arm
        glPushMatrix();
            glTranslatef(0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
            glRotatef(angle[2], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
            glTranslatef(0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
            drawArm(); ///Right Lower Arm
        glPopMatrix();
    glPopMatrix();
    glPushMatrix();
        glTranslatef(-0.5, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
        glRotatef(-angle[3], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
        glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
        drawArm();///這是個Arm ver 1  Left Upper Arm
        glPushMatrix();
            glTranslatef(-0.25, 0, 0);///最後一步, 把樓下的 "會對Arm Joint做旋轉的東西" 再移到右上 掛上去 ver 4
            glRotatef(-angle[4], 0,0,1);///把下面整團, 都對中間做旋轉 ver 3
            glTranslatef(-0.25, 0,0);///這是把它往右移, Arm Joint在中間 ver 2
            drawArm(); ///Left Lower Arm
        glPopMatrix();
    glPopMatrix();
    drawBody();
    glFlush();
}

void keyboard(unsigned char key, int x, int y)
{
    if(key=='1') angleID=1;
    if(key=='2') angleID=2;
    if(key=='3') angleID=3;
    if(key=='4') angleID=4;
}
void motion(int x, int y)
{   angle[angleID] -= y - oldY;
    oldY=y; oldX=x;

    if(fout==GLUT_DOWN) fout=fopen("a.txt","w+");///確定fout真的沒問題 有開啟 寫檔案
    printf("%f ",angle[1]);  ///大一上學過
    fprintf(fout,"%f\n",angle[1]); ///寫檔案
}
void mouse(int button, int state, int x, int y)
{
     if(state==GLUT_DOWN) { oldX=x; oldY=y; }
}
void timer(int t)
{
    glutTimerFunc(20, timer, t+1);
    //angle++;
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("T-R-T test");
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
}



播放鍵

讀檔案  按撥放鍵時 會撥剛才的動作

2015年5月28日 星期四

02160111_鄭庭峰_week14

(1)期末作品
(2)會跳舞的機器人
(3)T-R-T 對關節轉
(4)小考 : T-R-T 觀念
(5)作業問題
(6) AlwaysOnTopMaker  一個能讓視窗往上得程式


ver1: 打光茶壺


ver2 : 茶壺往右移

ver3 : 茶壺整盤自動旋轉

#include <Gl/glut.h>
float angle=0,oldX=0,oldY=0;
void display()
{
    GLfloat pos[]={0, 0, -1, 0};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle, 0, 0, 1); ///ver 3 :ratating teapot on the handle
        glTranslatef(0.5, 0, 0); ///ver 2 :teapot on the right
        glutSolidTeapot(0.3); ///ver 1 : A teapot
    glPopMatrix();
    glFlush();
}

void timer(int t)
{
    glutTimerFunc(20, timer, 0);
    ///angle++;  自動轉才要
    glutPostRedisplay();
}

void mouse(int button, int state ,int x,int y)
{
    if(state==GLUT_DOWN)
    {
        oldX=x; oldY=y;
    }
}
void motion(int x, int y)
{
    angle+=(x-oldX);
    oldX=x;
}

int main (int argc, char **argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("TRT 3D");
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}


(4)ver4: 旋轉軸心掛到想放的位置

glPushMatrix();
        glTranslatef(0.45, 0.14, 0); ///ver 4 : 把樓下的整個在轉的   往右掛在某個地方 (最終終點)
        glRotatef(angle, 0, 0, 1); ///ver 3 :ratating teapot on the handle (旋轉)
        glTranslatef(0.45, -0.1, 0); ///ver 2 :teapot on the right (從起始點移動到中點)
        glutSolidTeapot(0.3); ///ver 1 : A teapot  畫東西
glPopMatrix();


做出一個貌似運動的人





2015年5月21日 星期四

Week 13

(1) 鄭鎧尹博士演講
(2) MP3播放
(3)作業需求



音樂檔要放入freeglut 裡的 bin 裡面


執行程式時,撥放音樂

#include <iostream>
#include <Gl/glut.h>
#include "CMP3_MCI.h"
CMP3_MCI   myMP3;
using namespace std;

int main()
{
    myMP3.Load("RickyMartin.mp3");
    myMP3.Play();
    int a;
    cin>> a;
    return 0;
}




2015年5月14日 星期四

Week 12

(1)作業回顧
(2)作業需求(小遊戲)
(3)3D Model模型 glm.c
(4)Maya 轉 OBJ檔
(5)介紹助教影片資源



步驟2: 複製 transformation的3個東西
#include "glm.h"
GLMmodel* pmodel = NULL;

int main()
{
    pmodel = glmReadOBJ("data/porsche.obj");
    glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}

成功後會跑出小黑框



讓車子有打光顏色
#include "glm.h"
GLMmodel* pmodel = NULL;

void display()
{
    GLfloat pos[] = { 0.0, 0.0, -1.0, 0.0 };
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
    glFlush();
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("GLUT");
    glutDisplayFunc(display);

    pmodel = glmReadOBJ("porsche.obj");
    glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);

glutMainLoop();
}




像憤怒鳥的彈力球

#include <opencv/highgui.h> ///for cvLoadImage()
#include <opencv/cv.h> ///for cvCvtColor()
#include <GL/glut.h> ///3D glut
#include <stdio.h>
float angle=0, earthX=0, earthY=0, earthVY=0, earthVX=0; ///自動轉很帥
GLUquadric * quad;
int pikaState=0;
void timer(int t)
{   glutTimerFunc(20, timer, 0);/// 1000 msec   50fps:20msec
    if(pikaState==0){
        angle+=1;///自動轉很帥
        earthX=0.8*cos(angle*3.14/180);
        earthY=0.8*sin(angle*3.14/180);
    }else if(pikaState==2){
        earthX+=earthVX;
        earthY+=earthVY;
        earthVY-=0.0098;
    }
    glutPostRedisplay();
}
void display()
{   glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
    glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///自動轉很帥
        glTranslatef(earthX, earthY, 0);
        glRotatef(90, 1,0,0);
        glRotatef(angle, 0,0,1);///自動轉很帥
        gluQuadricTexture(quad, 1);
        gluSphere(quad, 0.1, 30, 30);///glutSolidTeapot(0.3);
    glPopMatrix();///自動轉很帥
    glFlush();
}
GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
GLuint id2; ///準備一個 unsigned int 整數, 叫 貼圖ID
void mouse(int button, int state, int x, int y)
{   if(state==GLUT_UP){
        glBindTexture(GL_TEXTURE_2D, id2);
        pikaState=2;
        //earthVX=??
        //earthVY= 0.1;
        earthVY= (y-150.0)/500;
        earthVX= (150.0-x)/500;
    }else if(state==GLUT_DOWN){
        pikaState=1;
        glBindTexture(GL_TEXTURE_2D, id);
    }
}
void motion(int x, int y){
    earthX=(x-150.0)/150.0;
    earthY=(150.0-y)/150.0;
}
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 myInit()
{   quad = gluNewQuadric();
    id = myTexture("321.jpg");
    id2 = myTexture("123.jpg");
}   ///最後一行最難/最重要, 所貼圖影像的資料都設定好
int main(int argc, char**argv)
{   glutInit(&argc, argv);
    glutCreateWindow("3D");
    glutDisplayFunc(display); ///顯示
    glutTimerFunc(0, timer, 0);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
    glutMainLoop();
}





2015年5月7日 星期四

02160111_鄭庭峰 week11

(1) Timer計時器

#include <GL/glut.h>
float angle=0;
void display()
{
    glEnable(GL_DEPTH_TEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle, 0,1,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glFlush();
    ///    angle++;
}

void timer(int t)
{
    glutTimerFunc(10,timer,0);
    angle+=1;
    glutPostRedisplay();
}
int main (int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("3D");
    glutDisplayFunc(display);
    ///glutIdleFunc(display);
    glutTimerFunc(10,timer,0);
    glutMainLoop();
}

茶壺會固定的旋轉

(2)多個貼圖

 
#include <opencv/highgui.h> ///for cvLoadImage()
#include <opencv/cv.h> ///for cvCvtColor()
#include <GL/glut.h> ///3D glut
#include <stdio.h>
float angle=0; ///自動轉很帥
GLUquadric * quad;
void timer(int t)
{
    glutTimerFunc(20, timer,0);  ///  1000 msec   50fps:20msec
    glutPostRedisplay();
}
void display()
{   glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
    glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///自動轉很帥
        glRotatef(90, 1,0,0);
        glRotatef(angle, 0,0,1);///自動轉很帥
        gluQuadricTexture(quad, 1);
        gluSphere(quad, 0.5, 30, 30);///glutSolidTeapot(0.3);
    glPopMatrix();///自動轉很帥
    glFlush();
    angle+=1;///自動轉很帥
}
GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
GLuint id2; ///準備一個 unsigned int 整數, 叫 貼圖ID
void mouse(int button, int state, int x, int y)
{
    if(state==GLUT_UP)
        glBindTexture(GL_TEXTURE_2D, id2);
    else if(state==GLUT_DOWN)
        glBindTexture(GL_TEXTURE_2D, id);
}
void myInit()
{
    quad = gluNewQuadric();
    IplImage * img = cvLoadImage("image.jpg"); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    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);

    IplImage * img2 = cvLoadImage("image2.jpg"); ///OpenCV讀圖
    cvCvtColor(img2,img2, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    glGenTextures(1, &id2); /// 產生Generate 貼圖ID
    glBindTexture(GL_TEXTURE_2D, id2); ///綁定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, img2->width, img2->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img2->imageData);
}   ///最後一行最難/最重要, 所貼圖影像的資料都設定好

int main(int argc, char**argv)
{   glutInit(&argc, argv);
    glutCreateWindow("3D");
    glutDisplayFunc(display); ///顯示
    //glutIdleFunc(display);///自動轉很帥 (閒閒沒事幹, 就重畫)
    glutTimerFunc(0, timer, 0);
    glutMouseFunc(mouse);
    myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
    glutMainLoop();
}




2015年4月30日 星期四

02160111_鄭庭峰 week10

1. 下載OpenCV 2.1
OpenCV 2.1 設定讀圖

2. preject-->build options :


先設定以上3個步驟

之後打程式 :
#include <opencv/highgui.h>

int main()
{
   IplImage *img=cvLoadImage("image.jpg");
   cvShowImage("2D",img);
   cvWaitKey(0);
}
跑出圖片

顯示地圖和物品

把這4個複製到和程式的同資料夾


設定以上3個東西

最後的圖+皮旋轉 :

#include <GL/glut.h> ///我們要使用 GLUT 3D 外掛
#include <opencv/highgui.h> ///要使用 OpenCV的 高級High圖形介面GUI
#include <opencv/cv.h> ///為了 cvCvtColor()而加上 cv.h
float angle=0; ///為了自動轉的角度angle
void display()
{
    glEnable(GL_DEPTH_TEST); ///有深度(depth)測試的功能, 才會有正確的景深/前後關係
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清畫面
    glPushMatrix(); ///備份matrix
        glRotatef(angle, 0,1,0);  ///為了自動轉的角度angle
        glutSolidTeapot(0.3); ///茶壼
    glPopMatrix(); ///還原matrix
    glFlush(); ///把馬桶沖出去
    angle+=0.1;  ///為了自動轉的角度angle
}
void init()
{   IplImage * img = cvLoadImage("image.jpg"); ///讀圖檔
    cvCvtColor(img, img, CV_BGR2RGB); /// ConVerT Color 把圖 BGR 變成 RGB
    glEnable(GL_TEXTURE_2D); ///開啟 2D貼圖功能
    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); ///參數設定 貼圖 S軸 如果超過了, 就REPEAT
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); ///參數設定 貼圖 T軸 如果超過了, 就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);
}   /// 很長的一行, 把 image的圖, 全部設成貼圖的內容
int main(int argc, char**argv) ///小心,要有 argc, argv哦
{
    glutInit(&argc, argv); ///小心有個 & 哦
    glutCreateWindow("3D"); ///建個3D視窗

    glutDisplayFunc(display); ///畫圖函式
    glutIdleFunc(display); ///閒閒沒事幹, 就重畫

    init(); ///在 MainLoop前, 去做 initial 初始設定 (2D OpenCV, 3D OpenGL Texture)

    glutMainLoop(); ///主要迴圈卡住, 才不會突然程式就結束了
}


GLUquadric * quad;
void display()
{
    glEnable(GL_DEPTH_TEST); ///有深度(depth)測試的功能, 才會有正確的景深/前後關係
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清畫面
    glPushMatrix(); ///備份matrix
        glRotatef(-90, 1,0,0);  ///為了自動轉的角度angle
        glRotatef(angle, 0,0,1);//glutSolidTeapot(0.3); ///茶壼
        gluQuadricTexture(quad, 1); ///二次曲線
        gluSphere(quad, 0.5, 30, 30);
    glPopMatrix(); ///還原matrix
    glFlush(); ///把馬桶沖出去
    angle+=0.1;  ///為了自動轉的角度angle
}
void init()
{
    quad = gluNewQuadric();
}



地球旋轉









2015年4月16日 星期四

week08,鄭庭峰

Week08_鄭庭峰

1.模擬考,期中考

2.用範例學習

3. NeHe Lesson 32 小遊戲

 #include <GL/glut.h>
#include <mmsystem.h>
#include <stdio.h>
void mouse (int button, int state, int x, int y)
{
    if(state==GLUT_DOWN)
    {
        PlaySound("Shot.wav",NULL, SND_ASYNC);
        printf("Shot!\n");
    }
}
void keyboard(unsigned char key, int x, int y)
{
    exit(0);
}
void display()
{
    glClearColor(0.5, 0.5, 1, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();
}
int main (int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("HI~");
    glutFullScreen();
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMainLoop();
}


打中有另一個聲音    ( 能判斷有沒有打中) (另外加幾行程式)

#include <math.h>
float potX=-1, potY=0;
void mouse (int button, int state, int x, int y)
{
    if(state==GLUT_DOWN)
    {
        PlaySound("Shot.wav",NULL, SND_ASYNC);
        printf("Shot!\n");
        float mouseX=2*x/1280.0 -1, mouseY=2*y/1024.0 -1;
        if( fabs(mouseX-potX)<0.1 && fabs(mouseY-potY)<0.1)
           {
                PlaySound("BOTTLE.wav",NULL, SND_ASYNC);
                printf("Your got it!\n");
           }
    }




2015年4月9日 星期四

week07_鄭庭峰

1. 製作鍵盤能打字

#include <GL/glut.h>
#include <stdio.h>

void display()
{
    glutSolidTeapot(0.3);
    glFlush();
}

void keyboard(unsigned char key, int x, int y)
{
    if(key=='a')
        printf("aaaaa\n");
    if(key=='b')
        printf("bbbbb\n");
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("hello");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();




2.能發出聲音   (WAV下載)

#include <GL/glut.h>
#include <stdio.h>
#include <mmsystem.h>  ///發出聲音的重要標頭檔

void display()
{
    glutSolidTeapot(0.3);
    glFlush();
}

void keyboard(unsigned char key, int x, int y)
{
    if(key=='a')
    {
        PlaySound("散彈槍.wav", NULL, SND_ASYNC); ///發出聲音
        printf("aaaaa\n");
    }
    if(key=='b')
        printf("bbbbb\n");
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("hello");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
}



3.音階

以上所有聲音檔都要放在bin裡面!!

void keyboard(unsigned char key, int x, int y)
{
    if(key=='a')
    {
        PlaySound("散彈槍.wav", NULL, SND_ASYNC); ///發出聲音
        printf("aaaaa\n");
    }
    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("Sol.wav", NULL, SND_ASYNC); ///發出聲音
    if(key=='6')
        PlaySound("La.wav", NULL, SND_ASYNC); ///發出聲音
    if(key=='7')
        PlaySound("Si.wav", NULL, SND_ASYNC); ///發出聲音
}




4.滑鼠控制   (全部程式碼)

#include <GL/glut.h>
#include <stdio.h>
#include <mmsystem.h>  ///發出聲音的重要標頭檔

float teaY=0, rotX=0, rotY=0, oldX=0, oldY=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    glTranslatef(0, teaY, 0);
    glRotatef(rotX, 1, 0, 0);
    glRotatef(rotY, 0, 1, 0);
    glutSolidTeapot(0.3);
    glPopMatrix();
    glFlush();
}

void keyboard(unsigned char key, int x, int y)
{
    if(key=='a')
    {
        PlaySound("散彈槍.wav", NULL, SND_ASYNC); ///發出聲音
        printf("aaaaa\n");
    }
    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("Sol.wav", NULL, SND_ASYNC); ///發出聲音
    if(key=='6')
        PlaySound("La.wav", NULL, SND_ASYNC); ///發出聲音
    if(key=='7')
        PlaySound("Si.wav", NULL, SND_ASYNC); ///發出聲音
}

void special (int key, int x, int y)
{
    if(key==GLUT_KEY_DOWN)
    {
        teaY-=0.1;
        printf("down\n");
    }
    else if(key==GLUT_KEY_UP)
    {
        teaY+=0.1;
        printf("up\n");
    }
    glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
    oldX=x;
    oldY=y;
    if(GLUT_LEFT_BUTTON==button && GLUT_DOWN==state)
        printf("now left down\n");
    if(GLUT_RIGHT_BUTTON==button && GLUT_DOWN==state)
        printf("now right down\n");
}
void motion(int x, int y)
{
    rotX+=y-oldY;
    rotY+=x-oldX;
    oldX=x; oldY=y;
    glutPostRedisplay();
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("hello");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutSpecialFunc(special);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}