2021年6月18日 星期五

week17

     -glutInitWindowSize(400,400);//視窗大小

    -glutInitWindowPosition(0,0);//視窗位置

 

加入打光的程式碼

- 在main函式前面加入:

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

在mainloop();前面加入:

glEnable(GL_DEPTH_TEST);//深度測試

    glDepthFunc(GL_LESS);


    glEnable(GL_LIGHT0);

    glEnable(GL_NORMALIZE);

    glEnable(GL_COLOR_MATERIAL);

    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);

    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);

    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);

    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);

    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);

    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);


    -控制滑鼠glutMouseFunc(mouse);
                       glutMotionFunc(motion);
利用x和x的舊座標

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

}

要記得在main函式裡面加glutKeyboardFunc(keyboard);才會有動作

-存檔、讀檔

fprintf(fout, "%.2f", angle[i]);

fscanf(fin, "%f",&angle[i]);

注意fscanf後面要加&angle[i]

-timer

void timer(int t)

{

    glutTimerFunc(30,timer,t+1);

    if(t%30==0){///每幾個frame,讀一筆新資料,如果要讓動畫更順要把t%多少提高

        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%30)/30.0;///alpha內插

    for(int i=0;i<20;i++){

        angle[i]= alpha*angleNew[i]+(1-alpha)*angleOld[i];

    }

    glutPostRedisplay();///重畫畫面

}

最終程式碼:

#include <stdio.h>

#include <GL/glut.h>

float angle[20]={}, diff=2;

float angleOld[20]={}, angleNew[20]={};

int angleID=0;

int oldx=0;

FILE * fout = NULL;

FILE * fin = NULL;///播放動畫

void timer(int t)

{

    glutTimerFunc(30,timer,t+1);

    if(t%30==0){///每10個frame,讀一筆新資料

        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%30)/30.0;

    for(int i=0;i<20;i++){

        angle[i]= alpha*angleNew[i]+(1-alpha)*angleOld[i];

    }

    glutPostRedisplay();///重畫畫面

}

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


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


}

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=='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");


    }

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

    }

    if(key=='p'){///play利用timer播放{

        glutTimerFunc(0, timer, 0);

    }

}

void display()

{

    glClearColor(1,0,0,0);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glColor3f(1,1,0);

        glutSolidTeapot(0.3);

        glPushMatrix();///左

            glTranslatef(-0.3,0,0);

            glRotated(angle[0],0,0,1);

            glTranslatef(-0.3,0,0);

            glutSolidTeapot(0.3);

            glPushMatrix();

                glTranslatef(-0.3,0,0);

                glRotated(angle[0],0,0,1);

                glTranslatef(-0.3,0,0);

                glutSolidTeapot(0.3);

            glPopMatrix();

        glPopMatrix();

        glPushMatrix();///右

        glTranslatef(+0.3,0,0);

        glRotatef(-angle[2],0,0,1);

        glTranslatef(+0.3,0,0);

        glutSolidTeapot(0.3);

            glPushMatrix();

                glTranslatef(+0.3,0,0);

                glRotatef(-angle[2],0,0,1);

                glTranslatef(+0.3,0,0);

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

    glutInitWindowSize(400,400);

    glutInitWindowPosition(0,0);

    glutCreateWindow("08160661");

    glutKeyboardFunc(keyboard);

    glutMouseFunc(mouse);

    glutMotionFunc(motion);

    glutTimerFunc(0,timer,0);

    glutDisplayFunc(display);


    glEnable(GL_DEPTH_TEST);

    glDepthFunc(GL_LESS);


    glEnable(GL_LIGHT0);

    glEnable(GL_NORMALIZE);

    glEnable(GL_COLOR_MATERIAL);

    glEnable(GL_LIGHTING);


    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);

    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);

    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

    glLightfv(GL_LIGHT0, GL_POSITION, light_position);


    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);

    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);

    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);

    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);


    glutMainLoop();

}



沒有留言:

張貼留言

距地表面160 Week11

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