顯示具有 02160393_簡上棋 標籤的文章。 顯示所有文章
顯示具有 02160393_簡上棋 標籤的文章。 顯示所有文章

2015年6月11日 星期四

week16_簡上棋

(1) 移動旋轉縮放
(2) TRT及關節結構
(3) 存檔.讀檔.播放
(4) 內插.動作.translate
(5) 期末作品

#include <GL/glut.h>
#include <stdio.h>
FILE * fout = NULL;
FILE * fin =NULL;
float  oldX=0, oldY=0;
float angle[10];
int angleID=1,playing=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[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;
    if(key=='p') playing=1;
}
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("%.1f \n",angle[i]);
        fprintf(fout,"%.1f \n",angle[i]);
    }



}
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);
    if(playing==1)
    {
        if(fin==NULL) fin=fopen("a.txt","r");
        for(int i=0;i<10;i++)
            fscanf(fin,"%f",&angle[i]);
    }
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("T-R-T test");
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}


內插法!!!
案'S'存單一畫面
用內插法 補完過程!!

#include <GL/glut.h>
#include <stdio.h>
FILE * fout = NULL;
FILE * fin =NULL;
float  oldX=0, oldY=0;
float angle[10];
int angleID=1,playing=0;
float angleOld[10],angleNew[10];
int now;

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

}
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  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;
    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\t",angle[i]);
            printf("%.1f\t",angle[i]);
        }
        fprintf(fout,"\n");
            printf("\n");
    }
}
void motion(int x, int y)
{   angle[angleID] -= y - oldY;
    oldY=y; oldX=x;
    glutPostRedisplay();
}
void mouse(int button, int state, int x, int y){
    if(state==GLUT_DOWN) { oldX=x; oldY=y; }
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("T-R-T test");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

2015年6月4日 星期四

week15_簡上棋

電腦圖學:

(1) 複習上週TRT
(2) 期末作品
(3) 建出全身關節
(4) 鍵盤滑鼠控制
(5) 存檔 play播放

用滑鼠控制關節

#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>
float angle1=0,angle2=0,angle3=0,angle4=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(angle1, 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(angle2, 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(angle3, 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(angle4, 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') angle1++;
    if(key=='2') angle2++;
    if(key=='3') angle3++;
    if(key=='4') angle4++;


}

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



用鍵盤 控制動的關節 用滑鼠控制移動的大小
#include <GL/glut.h>
float  oldX=0, oldY=0;
float angle[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 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;
}
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);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}





儲存轉動資料

#include <GL/glut.h>
#include <stdio.h>
FILE * fout = NULL;
float  oldX=0, oldY=0;
float angle[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 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==NULL) fout=fopen("a.txt","w+");
    printf("%f \n",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);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}


播放轉動資料~~

#include <GL/glut.h>
#include <stdio.h>
FILE * fout = NULL;
FILE * fin =NULL;
float  oldX=0, oldY=0;
float angle[10];
int angleID=1,playing=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[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;
    if(key=='p') playing=1;
}
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("%.1f \n",angle[i]);
        fprintf(fout,"%.1f \n",angle[i]);
    }



}
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);
    if(playing==1)
    {
        if(fin==NULL) fin=fopen("a.txt","r");
        for(int i=0;i<10;i++)
            fscanf(fin,"%f",&angle[i]);
    }
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("T-R-T test");
    glutDisplayFunc(display);
    glutTimerFunc(20, timer, 0);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}


2015年5月28日 星期四

week14_簡上棋

1. 期末作品
2. 會跳舞的機器人
3. T-R-T 對關節轉
4. 小考
5. 作業問題


會自動轉的茶壺
#include "GL/glut.h"

float angle=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);
        glTranslatef(0.5,0,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glFlush();

}

void timer(int t)
{
    glutTimerFunc(20,timer,0);
    angle++;
    glutPostRedisplay();
}

int main(int argc, char**argv)
{   glutInit(&argc, argv);
    glutCreateWindow("TRT 02160393");
    glutDisplayFunc(display);
    glutTimerFunc(20,timer,0);
    glutMainLoop();
}

由滑鼠控制轉動的茶壺

#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);
        glTranslatef(0.5,0,0);
        glutSolidTeapot(0.3);
    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 02160393");
    glutDisplayFunc(display);
    glutTimerFunc(20,timer,0);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

關節旋轉
#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();
        glTranslatef(-0.42,0.085,0);//移到要旋轉的地方
        glRotatef(angle,0,0,1);
        glTranslatef(-0.5,-0.125,0); //把旋轉點改到中心
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSolidTeapot(0.3);
    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 02160393");
    glutDisplayFunc(display);
    glutTimerFunc(20,timer,0);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

虛擬人物手臂

#include "GL/glut.h"

float angle=0,oldX=0,oldY=0;
void drawArm(){
    glPushMatrix();
    glScalef(0.5,0.25,0.25);
    glutSolidCube(1);
    glPopMatrix();
}
void drawBody()
{
    glPushMatrix();
    glTranslatef(0,-0.5,0);
    glRotatef(-90,1,0,0);
    glutSolidCone(0.3,0.8,30,30);
    glPopMatrix();

}


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();
        glTranslatef(0.15,0,0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.25,0,0);
        drawArm();//Right Upper-Arm
        glPushMatrix();
        glTranslatef(0.25,0,0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.25,0,0);
        drawArm();//Right Lower-Arm
        glPopMatrix();
    glPopMatrix();

    glPushMatrix();
        glTranslatef(-0.15,0,0);
        glRotatef(-angle,0,0,1);
        glTranslatef(-0.25,0,0);
        drawArm();//Left Upper-Arm
        glPushMatrix();
        glTranslatef(-0.25,0,0);
        glRotatef(-angle,0,0,1);
        glTranslatef(-0.25,0,0);
        drawArm();//Left Lower-Arm
        glPopMatrix();
    glPopMatrix();
    drawBody();


    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 02160393");
    glutDisplayFunc(display);
    glutTimerFunc(20,timer,0);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}




2015年5月14日 星期四

week12_簡上棋

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


把要用到的檔案 複製到專案底下
然後把glm.c 改為 glm.cpp


#include "glm.h"

GLMmodel* pmodel = NULL;

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

}





把OBJ黨 放在 freeglut bin資料裡面


#include "glm.h"

GLMmodel* pmodel = NULL;

void display()
{
    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
    glFlush();
}


int main(int argc, char**argv)
{   glutInit(&argc, argv);
    glutCreateWindow("3D");


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

glutDisplayFunc(display);

    glutMainLoop();
}
                                                                                                                                                                                                                                                        

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


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

glutDisplayFunc(display);

    glutMainLoop();
}
                                                                                                                                                                                                                    

2015年5月7日 星期四

week11_簡上棋

首先複習各種設定




再來把OPENGL & FREEGL 裡面 BIN 的幾個資料複製到專案下


#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 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;
GLuint id2;
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);



}   ///最後一行最難/最重要, 所貼圖影像的資料都設定好
void timer(int t)
{/// 1000 msec   50fps:20msec
    glutTimerFunc(20, timer, 0);
    glutPostRedisplay();
}
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();
}


把裡面 重複程式 改成 函式
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    GLuint 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("image.jpg");
    id2 = myTexture("image2.jpg");

}   ///最後一行最難/最重要, 所貼圖影像的資料都設定好









2015年4月30日 星期四

week10_簡上棋

下載
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/
安裝時設定
開啟 Code Block 新專案 Console application
設定各種設定~~~





把需要的圖檔 裝到專案下
把OpenCV2.1 裡 的cv210.dll   cxcore210.dll   highgui210.dll
複製到專案下

打上各種程式
#include <opencv/highgui.h>
int main()
{
    IplImage * img = cvLoadImage("image.jpg");
    cvShowImage("2D",img);
    cvWaitKey(0);
}


再加上 3D 的 設定




打上3D程式
#include <opencv/highgui.h>
#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    glRotatef(angle,0,1,0);
    glutSolidTeapot(0.3);
    glPopMatrix();
    glFlush();
    angle+=0.1;


 main(int argc,char ** argv)
{
    IplImage * img = cvLoadImage("image.jpg");
    cvShowImage("2D",img);
    //cvWaitKey(0);

    glutInit(&argc,argv);
    glutCreateWindow("3D");

    glutDisplayFunc(display);
    glutIdleFunc(display);

    glutMainLoop();
}



加上 專業 程式

#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(); ///主要迴圈卡住, 才不會突然程式就結束了
}




2015年4月16日 星期四

week08_簡上棋

電腦圖學
2015/04/16
          week08
1.模擬考,期中考試
2.用範例學習
3.打光 → 法向量
4.貼圖 → 貼圖座標
5.NeHe Lesson 32 小遊戲


#include<GL/freeglut.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); //播放freeglut\bin底下的Shot.wav的音檔
        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("02160393_DownChess");

    glutFullScreen();//全螢幕

    glutDisplayFunc(display);//顯示
    glutKeyboardFunc(keyboard);//鍵盤
    glutMouseFunc(mouse);//聲音
    glutMainLoop();
}


#include<GL/freeglut.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); //播放freeglut\bin底下的Shot.wav的音檔
        printf("Shot!\n");
    }
}
void keyboard (unsigned char key, int x , int y)
{
    exit(0); //按下隨意鍵離開
}
float potx=-1,poty=0;
void display ()
{
    potx+=0.01;
    if(potx>1.1)potx=-1.1;
    glClearColor(0.5,0.5,1,0);
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    glTranslated(potx,poty,0);
    glutSolidTeapot(0.08);
    glPopMatrix();
    glFlush();
}

int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutCreateWindow("02160393_DownChess");

    glutFullScreen();//全螢幕

    glutDisplayFunc(display);//顯示
    glutIdleFunc(display); //重複執行程式
    glutKeyboardFunc(keyboard);//鍵盤
    glutMouseFunc(mouse);//聲音
    glutMainLoop();
}


#include<GL/freeglut.h>
#include<mmsystem.h>
#include<stdio.h>
#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("Cow.wav",NULL,SND_ASYNC);
            printf("YOU GET IT!!!\n");
        }
    }
}
void keyboard (unsigned char key, int x , int y)
{
    exit(0);
}

void display ()
{
    potx+=0.01;
    if(potx>1.1)potx=-1.1;
    glClearColor(0.5,0.5,1,0);
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    glTranslated(potx,poty,0);
    glutSolidTeapot(0.08);
    glPopMatrix();
    glFlush();
}

int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutCreateWindow("02160393_DownChess");

    glutFullScreen();
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMainLoop();
}