2019年5月16日 星期四

我要成為電腦圖學大師

電腦圖學 2019-05-16 week13
1.主題:檔案
2.主題:開箱 擺動作
3.主題:複習
4.作業:機器人擺動動作
------------------------------------------------------------------
使用Console application PROJECT
使用<FILE  *> 使用讀檔寫檔並打出自己想輸出的文字內容
執行後小黑窗並不會有文字 因為文字直接存到資料夾
而打開後就看到我們剛剛輸入的文字輸出了
而在設定寫檔案fopen後面的"w"是寫檔案 並且原資料夾不需有這個檔案他可自己創見出來
老師則是寫"w+"差異在老師所寫的可以進行更新 而我寫的則不行
-----------------------------------------------------------------------
#include <stdio.h>
FILE *fout=NULL;
int main(){
    fout=fopen("fliename.txt","w");
    for(int i=0;i<=20;i++){
        fprintf(fout,"Hello Word\n");
    }
}
-------------------------------------------------------------------------
我們要換成輸出檔案
而差異跟剛剛都是一樣的模式
然後我沒有設定附檔名 所以不能直接用文字檔打開 要用 notepeed++開

------------------------------------------------------------------------
下面這張圖片是改成存在特定資料夾 就可以存在自己想要的地方了

-----------------------------------------------------------
#include <GL/glut.h>
float angle[20];///NOW2
int joinID=1;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1, 1, 1);///主體顏色
        glutSolidTeapot( 0.3 );///主體
        glPushMatrix();
            glTranslatef(0.2, 0, 0);///掛在主體的位置
            glRotatef(angle[1], 0,0,1);///旋轉
            glTranslatef(0.15, 0, 0);///旋轉中心
            glColor3f(1, 0, 0);///顏色
            glutSolidTeapot( 0.2 );///right arm
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int oldX=0;///NOW2
void mouse(int button, int state, int x, int y)///NOW2
{///NOW2
    oldX = x;///NOW2
}



void motion(int x, int y)///NOW2
{///NOW2
    angle[1] += x-oldX;///NOW2
    oldX = x;///NOW2
    display();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);///可以開大一點的window
    glutCreateWindow("06160565 week13");
    glutMouseFunc(mouse);///NOW2
    glutMotionFunc(motion);///NOW2
    glutDisplayFunc(display);

    glutMainLoop();
}
------------------------------------------------------------------
上面程式碼就是之前交的使單一關節移動
-------------------------------------------------------------------
    if(key=='r'){
        if(fin==NULL) fin = fopen("motion.txt", "r");
        for(int i=0;i<20; i++){
            fscanf(fin, "%f", &angle[i]);
            printf(" %.2f ", angle[i]);
    }
這是新+上的FILE讀檔 假使我們可以預先移動關節 並存下檔案後
我們就可以讀取檔案 他就會照著我們先前移動的關節移動
感覺就有點像動畫一樣 他會自己動
-------------------------------------------------------------------
#include <GL/glut.h>
#include <stdio.h>///NOW_FILE (0)
float angle[20];///NOW2
int angleID=1;///NOW3
FILE * fout = NULL;///NOW_FILE (1)
FILE * fin = NULL;///NOW_FILE_READ (1)
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1, 1, 1);///white
        glutSolidTeapot( 0.3 );///body

        glPushMatrix();///右邊
            glTranslatef(0.2, 0, 0);///NOW2 (3)掛上去
            glRotatef(angle[1], 0,0,1);///NOW2 ///(2)旋轉
            glTranslatef(0.15, 0, 0);///NOW2 (1)旋轉中心
            glColor3f(1, 0, 0);///red
            glutSolidTeapot( 0.2 );///right arm
            glPushMatrix();
                glTranslatef(0.2, 0, 0);///NOW2 (3)掛上去
                glRotatef(angle[2], 0,0,1);///NOW2 ///(2)旋轉
                glTranslatef(0.15, 0, 0);///NOW2 (1)旋轉中心
                glColor3f(1, 0, 0);///red
                glutSolidTeapot( 0.2 );///right lower arm
            glPopMatrix();
        glPopMatrix();

        glPushMatrix();///左邊
            glTranslatef(-0.2, 0, 0);///NOW2 (3)掛上去
            glRotatef(angle[3], 0,0,1);///NOW2 ///(2)旋轉
            glTranslatef(-0.15, 0, 0);///NOW2 (1)旋轉中心
            glColor3f(1, 0, 0);///red
            glutSolidTeapot( 0.2 );///right arm
            glPushMatrix();
                glTranslatef(-0.2, 0, 0);///NOW2 (3)掛上去
                glRotatef(angle[4], 0,0,1);///NOW2 ///(2)旋轉
                glTranslatef(-0.15, 0, 0);///NOW2 (1)旋轉中心
                glColor3f(1, 0, 0);///red
                glutSolidTeapot( 0.2 );///right lower arm
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int oldX=0;///NOW2
void mouse(int button, int state, int x, int y)///NOW2
{///NOW2
    oldX = x;///NOW2
}

void motion(int x, int y)///NOW2
{///NOW2
    angle[angleID] += x-oldX;///NOW3
    oldX = x;///NOW2
    if(fout == NULL) fout = fopen("motion.txt", "w+");///NOW_FILE (2)
    for(int i=0;i<20;i++){///NOW3
        printf(" %.2f ", angle[i]);///NOW3
        fprintf(fout, " %.2f ", angle[i]);///NOW_FILE
    }
    printf("\n");///NOW3
    fprintf(fout, "\n");///NOW_FILE
    display();///NOW2
}
void keyboard(unsigned char key, int x, int y)///NOW3
{///NOW3
    if(key=='1') angleID=1;///NOW3
    if(key=='2') angleID=2;///NOW3
    if(key=='3') angleID=3;///NOW3
    if(key=='4') angleID=4;///NOW3
    if(key=='w'){///NOW_FILE
        fout = fopen("motion.txt", "w+");///NOW_FILE (2)
    }
    if(key=='r'){
        if(fin==NULL) fin = fopen("motion.txt", "r");///NOW_FILE_READ (2)
        ///scanf("%d", &n);
        for(int i=0;i<20; i++){///NOW_FILE_READ
            fscanf(fin, "%f", &angle[i]);///NOW_FILE_READ
            printf(" %.2f ", angle[i]);///順便印出來看數字對不對
        }
    }
    glutPostRedisplay();///NOW_FILE_READ 和 display()很像
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    ///glutInitWindowSize(600,600);///可以開大一點的window
    glutCreateWindow("Week 13 angle motion file");
    glutKeyboardFunc(keyboard);///NOW3
    glutMouseFunc(mouse);///NOW2
    glutMotionFunc(motion);///NOW2
    glutDisplayFunc(display);

    glutMainLoop();
}
-----------------------------------------------------------------------------
完整的程式碼 記在blogger比較不會忘記^^

1 則留言: