2017年6月6日 星期二

Week16 王婉懿的上課筆記

  • 作業一 : 存檔 & 讀檔
               步驟一 : 增加程式,每按鍵盤快捷建,模型動作會存檔 & 讀檔。
                   程式 :
#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel = NULL;
GLMmodel* pmode2 = NULL;
GLMmodel* pmode3 = NULL;
GLMmodel* pmode4 = NULL;
GLMmodel* pmode5 = NULL;
GLMmodel* pmode6 = NULL;
GLMmodel* pmode7 = NULL;
GLMmodel* pmode8 = NULL;
GLMmodel* pmode9 = NULL;
GLMmodel* pmode10 = NULL;
float angle[20]={};
int now=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
//        angle=angle+0.05;;
//        glRotatef(angle, 0,1,0);
        if (!pmodel) {
        pmodel = glmReadOBJ("data/head.obj");
        if (!pmodel) exit(0);
        //glmUnitize(pmodel);
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel, 90.0);
        }
        //glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode2) {
        pmode2 = glmReadOBJ("data/body.obj");
        if (!pmode2) exit(0);
        //glmUnitize(pmode2);
        glmFacetNormals(pmode2);
        glmVertexNormals(pmode2, 90.0);
        }
        glmDraw(pmode2, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode3) {
        pmode3 = glmReadOBJ("data/Rarm.obj");
        if (!pmode3) exit(0);
        //glmUnitize(pmode3);
        glmFacetNormals(pmode3);
        glmVertexNormals(pmode3, 90.0);
        }
        //glmDraw(pmode3, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode4) {
        pmode4 = glmReadOBJ("data/Larm.obj");
        if (!pmode4) exit(0);
        //glmUnitize(pmode4);
        glmFacetNormals(pmode4);
        glmVertexNormals(pmode4, 90.0);
        }
        //glmDraw(pmode4, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode5) {
        pmode5 = glmReadOBJ("data/Rhand.obj");
        if (!pmode5) exit(0);
        //glmUnitize(pmode5);
        glmFacetNormals(pmode5);
        glmVertexNormals(pmode5, 90.0);
        }
        //glmDraw(pmode5, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode6) {
        pmode6 = glmReadOBJ("data/Lhand.obj");
        if (!pmode6) exit(0);
        //glmUnitize(pmode6);
        glmFacetNormals(pmode6);
        glmVertexNormals(pmode6, 90.0);
        }
        //glmDraw(pmode6, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode7) {
        pmode7 = glmReadOBJ("data/Rleg.obj");
        if (!pmode7) exit(0);
       // glmUnitize(pmode7);
        glmFacetNormals(pmode7);
        glmVertexNormals(pmode7, 90.0);
        }
        //glmDraw(pmode7, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode8) {
        pmode8 = glmReadOBJ("data/Lleg.obj");
        if (!pmode8) exit(0);
        //glmUnitize(pmode8);
        glmFacetNormals(pmode8);
        glmVertexNormals(pmode8, 90.0);
        }
        //glmDraw(pmode8, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode9) {
        pmode9 = glmReadOBJ("data/Rfoot.obj");
        if (!pmode9) exit(0);
        //glmUnitize(pmode9);
        glmFacetNormals(pmode9);
        glmVertexNormals(pmode9, 90.0);
        }
        //glmDraw(pmode9, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode10) {
        pmode10 = glmReadOBJ("data/Lfoot.obj");
        if (!pmode10) exit(0);
        //glmUnitize(pmode10);
        glmFacetNormals(pmode10);
        glmVertexNormals(pmode10, 90.0);
        }
        //glmDraw(pmode10, GLM_SMOOTH | GLM_MATERIAL);

        glPushMatrix();
            glTranslatef(0.27,0.21,0);
            glRotatef(-angle[0],0,0,1);
            glTranslatef(-0.27,-0.21,0);
            glmDraw(pmode3, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(0.53,0.2,0);
            glRotatef(-angle[1],0,0,1);
            glTranslatef(-0.53,-0.2,0);
            glmDraw(pmode5, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            //glutSolidTeapot(0.03);
            glTranslatef(-0.27,+0.21,0);
            glRotatef(-angle[2],0,0,1);
            glTranslatef(0.27,-0.21,0);
            glmDraw(pmode4, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(-0.54,0.2,0);
            glRotatef(-angle[3],0,0,1);
            glTranslatef(0.54,-0.2,0);
            glmDraw(pmode6, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(0.13,-0.18,0);
            glRotatef(-angle[4],0,0,1);
            glTranslatef(-0.13,0.18,0);
            glmDraw(pmode7, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(0.14,-0.44,0);
            glRotatef(-angle[5],0,0,1);
            glTranslatef(-0.14,0.44,0);
            glmDraw(pmode9, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(-0.12,-0.165,0);
            glRotatef(-angle[6],0,0,1);
            glTranslatef(0.12,0.165,0);
            glmDraw(pmode8, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(-0.15,-0.43,0);
            glRotatef(-angle[7],0,0,1);
            glTranslatef(0.15,0.43,0);
            glmDraw(pmode10, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(0,0.25,0);
            glRotatef(-angle[8],0,0,1);
            glTranslatef(0,-0.25,0);
            glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
        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 };

#include <stdio.h>
void timer(int t)
{
    printf("%d",t);
    glutTimerFunc(100,timer,t+1);
    printf("·stimer");
//    angle+=3;
    glutPostRedisplay();
    printf("ºÎ¤F\n");
}
int oldX=0,oldY=0;
FILE * fout=NULL;///存檔的步驟2, 宣告一個檔案的指標, (一開始是空的NULL)
void keyboard(unsigned char key,int x,int y)
{
    printf("%c\n", key);///你按了什麼鍵,印出來,方便了解老師按了什麼鍵
    if(key=='s'){///存檔的步驟3, 在按下 's' 鍵 save存檔
        if(fout == NULL){/// (一開始是空的NULL)
            fout = fopen("file.txt", "w+");///開啟檔案,檔名準備好, 並且是用 write加 模式
            printf("現在開啟一個檔案file.txt, w+模式\n");
        }
        printf("想要寫這些數值到檔案%f %f %f %f %f %f %f %f %f\n", angle[0], angle[1], angle[2], angle[3], angle[4], angle[5], angle[6], angle[7], angle[8]);
        fprintf( fout, "%f %f %f %f %f %f %f %f %f\n", angle[0], angle[1], angle[2], angle[3], angle[4], angle[5], angle[6], angle[7], angle[8]);
    }

    if(key=='0') now=0;
    if(key=='1') now=1;
    if(key=='2') now=2;
    if(key=='3') now=3;
    if(key=='4') now=4;
    if(key=='5') now=5;
    if(key=='6') now=6;
    if(key=='7') now=7;
    if(key=='8') now=8;
}
void mouse(int button,int state,int x,int y)
{
    oldX=x;  oldY=y;
    glutPostRedisplay();
}
void motion(int x,int y)
{
    angle[now]+=(x-oldX);
    oldX=x;
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
    glutCreateWindow("Yes, 3D Model Here");
    glutDisplayFunc(display);
    //glutIdleFunc(display);
    //glutTimerFunc(2000,timer,0);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
  //  glClearColor(1,1,1,1);
    //glEnable(GL_CULL_FACE);
    //glCullFace(GL_BACK);
    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();
}

               步驟二 : 讀剛剛存的動作。
                  程式 :

#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel = NULL;
GLMmodel* pmode2 = NULL;
GLMmodel* pmode3 = NULL;
GLMmodel* pmode4 = NULL;
GLMmodel* pmode5 = NULL;
GLMmodel* pmode6 = NULL;
GLMmodel* pmode7 = NULL;
GLMmodel* pmode8 = NULL;
GLMmodel* pmode9 = NULL;
GLMmodel* pmode10 = NULL;
float angle[20]={};
int now=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
//        angle=angle+0.05;;
//        glRotatef(angle, 0,1,0);
        if (!pmodel) {
        pmodel = glmReadOBJ("data/head.obj");
        if (!pmodel) exit(0);
        //glmUnitize(pmodel);
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel, 90.0);
        }
        //glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode2) {
        pmode2 = glmReadOBJ("data/body.obj");
        if (!pmode2) exit(0);
        //glmUnitize(pmode2);
        glmFacetNormals(pmode2);
        glmVertexNormals(pmode2, 90.0);
        }
        glmDraw(pmode2, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode3) {
        pmode3 = glmReadOBJ("data/Rarm.obj");
        if (!pmode3) exit(0);
        //glmUnitize(pmode3);
        glmFacetNormals(pmode3);
        glmVertexNormals(pmode3, 90.0);
        }
        //glmDraw(pmode3, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode4) {
        pmode4 = glmReadOBJ("data/Larm.obj");
        if (!pmode4) exit(0);
        //glmUnitize(pmode4);
        glmFacetNormals(pmode4);
        glmVertexNormals(pmode4, 90.0);
        }
        //glmDraw(pmode4, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode5) {
        pmode5 = glmReadOBJ("data/Rhand.obj");
        if (!pmode5) exit(0);
        //glmUnitize(pmode5);
        glmFacetNormals(pmode5);
        glmVertexNormals(pmode5, 90.0);
        }
        //glmDraw(pmode5, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode6) {
        pmode6 = glmReadOBJ("data/Lhand.obj");
        if (!pmode6) exit(0);
        //glmUnitize(pmode6);
        glmFacetNormals(pmode6);
        glmVertexNormals(pmode6, 90.0);
        }
        //glmDraw(pmode6, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode7) {
        pmode7 = glmReadOBJ("data/Rleg.obj");
        if (!pmode7) exit(0);
       // glmUnitize(pmode7);
        glmFacetNormals(pmode7);
        glmVertexNormals(pmode7, 90.0);
        }
        //glmDraw(pmode7, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode8) {
        pmode8 = glmReadOBJ("data/Lleg.obj");
        if (!pmode8) exit(0);
        //glmUnitize(pmode8);
        glmFacetNormals(pmode8);
        glmVertexNormals(pmode8, 90.0);
        }
        //glmDraw(pmode8, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode9) {
        pmode9 = glmReadOBJ("data/Rfoot.obj");
        if (!pmode9) exit(0);
        //glmUnitize(pmode9);
        glmFacetNormals(pmode9);
        glmVertexNormals(pmode9, 90.0);
        }
        //glmDraw(pmode9, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode10) {
        pmode10 = glmReadOBJ("data/Lfoot.obj");
        if (!pmode10) exit(0);
        //glmUnitize(pmode10);
        glmFacetNormals(pmode10);
        glmVertexNormals(pmode10, 90.0);
        }
        //glmDraw(pmode10, GLM_SMOOTH | GLM_MATERIAL);

        glPushMatrix();
            glTranslatef(0.27,0.21,0);
            glRotatef(-angle[0],0,0,1);
            glTranslatef(-0.27,-0.21,0);
            glmDraw(pmode3, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(0.53,0.2,0);
            glRotatef(-angle[1],0,0,1);
            glTranslatef(-0.53,-0.2,0);
            glmDraw(pmode5, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            //glutSolidTeapot(0.03);
            glTranslatef(-0.27,+0.21,0);
            glRotatef(-angle[2],0,0,1);
            glTranslatef(0.27,-0.21,0);
            glmDraw(pmode4, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(-0.54,0.2,0);
            glRotatef(-angle[3],0,0,1);
            glTranslatef(0.54,-0.2,0);
            glmDraw(pmode6, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(0.13,-0.18,0);
            glRotatef(-angle[4],0,0,1);
            glTranslatef(-0.13,0.18,0);
            glmDraw(pmode7, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(0.14,-0.44,0);
            glRotatef(-angle[5],0,0,1);
            glTranslatef(-0.14,0.44,0);
            glmDraw(pmode9, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(-0.12,-0.165,0);
            glRotatef(-angle[6],0,0,1);
            glTranslatef(0.12,0.165,0);
            glmDraw(pmode8, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(-0.15,-0.43,0);
            glRotatef(-angle[7],0,0,1);
            glTranslatef(0.15,0.43,0);
            glmDraw(pmode10, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(0,0.25,0);
            glRotatef(-angle[8],0,0,1);
            glTranslatef(0,-0.25,0);
            glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
        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 };

#include <stdio.h>
void timer(int t)
{
    printf("%d",t);
    glutTimerFunc(100,timer,t+1);
    printf("·stimer");
//    angle+=3;
    glutPostRedisplay();
    printf("ºÎ¤F\n");
}
int oldX=0,oldY=0;
FILE * fout=NULL;///存檔的步驟2, 宣告一個檔案的指標, (一開始是空的NULL)
FILE * fin=NULL;///讀檔的步驟1, 宣告一個檔案的指標, (一開始是空的NULL)
void keyboard(unsigned char key,int x,int y)
{
    printf("%c\n", key);///你按了什麼鍵,印出來,方便了解老師按了什麼鍵
    if(key=='s'){///存檔的步驟3, 在按下 's' 鍵 save存檔
        if(fout == NULL){/// (一開始是空的NULL)
            fout = fopen("file.txt", "w+");///開啟檔案,檔名準備好, 並且是用 write加 模式
            printf("Now open file.txt for write+ Mode\n");
        }
        printf("Now write angle[] %f %f %f %f %f %f %f %f %f\n", angle[0], angle[1], angle[2], angle[3], angle[4], angle[5], angle[6], angle[7], angle[8]);
        fprintf( fout, "%f %f %f %f %f %f %f %f %f\n", angle[0], angle[1], angle[2], angle[3], angle[4], angle[5], angle[6], angle[7], angle[8]);
    }
    if(key=='r'){///讀檔的步驟2, 按下 'r' 去read
        if(fin == NULL){
            fin = fopen("file.txt", "r");///讀檔的步驟3,檔名準備好, 並且是用 read 模式
            printf("Now open file.txt for read Mode\n");
        }
        fscanf(fin, "%f %f %f %f %f %f %f %f %f", &angle[0], &angle[1], &angle[2], &angle[3], &angle[4], &angle[5], &angle[6], &angle[7], &angle[8]);
        printf("Now read angle[] Pa Pa Pa\n");   ///讀檔的步驟 fscanf()讀進來
        glutPostRedisplay();
    }

    if(key=='0') now=0;
    if(key=='1') now=1;
    if(key=='2') now=2;
    if(key=='3') now=3;
    if(key=='4') now=4;
    if(key=='5') now=5;
    if(key=='6') now=6;
    if(key=='7') now=7;
    if(key=='8') now=8;
}
void mouse(int button,int state,int x,int y)
{
    oldX=x;  oldY=y;
    glutPostRedisplay();
}
void motion(int x,int y)
{
    angle[now]+=(x-oldX);
    oldX=x;
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
    glutCreateWindow("Yes, 3D Model Here");
    glutDisplayFunc(display);
    //glutIdleFunc(display);
    //glutTimerFunc(2000,timer,0);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
  //  glClearColor(1,1,1,1);
    //glEnable(GL_CULL_FACE);
    //glCullFace(GL_BACK);
    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();
}

               步驟三 : 讓動作更連貫一點。
                   程式 :
#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel = NULL;
GLMmodel* pmode2 = NULL;
GLMmodel* pmode3 = NULL;
GLMmodel* pmode4 = NULL;
GLMmodel* pmode5 = NULL;
GLMmodel* pmode6 = NULL;
GLMmodel* pmode7 = NULL;
GLMmodel* pmode8 = NULL;
GLMmodel* pmode9 = NULL;
GLMmodel* pmode10 = NULL;
float alpha=0.0;///現在要改成交叉相乘的內插方式算角度: alpha
float oldAngle[20]={};///現在要改成交叉相乘的內插方式算角度: oldAngle
float newAngle[20]={};///現在要改成交叉相乘的內插方式算角度: newAngle
float angle[20]={};///現在要改成交叉相乘的內插方式算角度: 我們要用來畫的 angle 的陣列

int now=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
//        angle=angle+0.05;;
//        glRotatef(angle, 0,1,0);
        if (!pmodel) {
        pmodel = glmReadOBJ("data/head.obj");
        if (!pmodel) exit(0);
        //glmUnitize(pmodel);
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel, 90.0);
        }
        //glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode2) {
        pmode2 = glmReadOBJ("data/body.obj");
        if (!pmode2) exit(0);
        //glmUnitize(pmode2);
        glmFacetNormals(pmode2);
        glmVertexNormals(pmode2, 90.0);
        }
        glmDraw(pmode2, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode3) {
        pmode3 = glmReadOBJ("data/Rarm.obj");
        if (!pmode3) exit(0);
        //glmUnitize(pmode3);
        glmFacetNormals(pmode3);
        glmVertexNormals(pmode3, 90.0);
        }
        //glmDraw(pmode3, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode4) {
        pmode4 = glmReadOBJ("data/Larm.obj");
        if (!pmode4) exit(0);
        //glmUnitize(pmode4);
        glmFacetNormals(pmode4);
        glmVertexNormals(pmode4, 90.0);
        }
        //glmDraw(pmode4, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode5) {
        pmode5 = glmReadOBJ("data/Rhand.obj");
        if (!pmode5) exit(0);
        //glmUnitize(pmode5);
        glmFacetNormals(pmode5);
        glmVertexNormals(pmode5, 90.0);
        }
        //glmDraw(pmode5, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode6) {
        pmode6 = glmReadOBJ("data/Lhand.obj");
        if (!pmode6) exit(0);
        //glmUnitize(pmode6);
        glmFacetNormals(pmode6);
        glmVertexNormals(pmode6, 90.0);
        }
        //glmDraw(pmode6, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode7) {
        pmode7 = glmReadOBJ("data/Rleg.obj");
        if (!pmode7) exit(0);
       // glmUnitize(pmode7);
        glmFacetNormals(pmode7);
        glmVertexNormals(pmode7, 90.0);
        }
        //glmDraw(pmode7, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode8) {
        pmode8 = glmReadOBJ("data/Lleg.obj");
        if (!pmode8) exit(0);
        //glmUnitize(pmode8);
        glmFacetNormals(pmode8);
        glmVertexNormals(pmode8, 90.0);
        }
        //glmDraw(pmode8, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode9) {
        pmode9 = glmReadOBJ("data/Rfoot.obj");
        if (!pmode9) exit(0);
        //glmUnitize(pmode9);
        glmFacetNormals(pmode9);
        glmVertexNormals(pmode9, 90.0);
        }
        //glmDraw(pmode9, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode10) {
        pmode10 = glmReadOBJ("data/Lfoot.obj");
        if (!pmode10) exit(0);
        //glmUnitize(pmode10);
        glmFacetNormals(pmode10);
        glmVertexNormals(pmode10, 90.0);
        }
        //glmDraw(pmode10, GLM_SMOOTH | GLM_MATERIAL);

        glPushMatrix();
            glTranslatef(0.27,0.21,0);
            glRotatef(-angle[0],0,0,1);
            glTranslatef(-0.27,-0.21,0);
            glmDraw(pmode3, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(0.53,0.2,0);
            glRotatef(-angle[1],0,0,1);
            glTranslatef(-0.53,-0.2,0);
            glmDraw(pmode5, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            //glutSolidTeapot(0.03);
            glTranslatef(-0.27,+0.21,0);
            glRotatef(-angle[2],0,0,1);
            glTranslatef(0.27,-0.21,0);
            glmDraw(pmode4, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(-0.54,0.2,0);
            glRotatef(-angle[3],0,0,1);
            glTranslatef(0.54,-0.2,0);
            glmDraw(pmode6, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(0.13,-0.18,0);
            glRotatef(-angle[4],0,0,1);
            glTranslatef(-0.13,0.18,0);
            glmDraw(pmode7, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(0.14,-0.44,0);
            glRotatef(-angle[5],0,0,1);
            glTranslatef(-0.14,0.44,0);
            glmDraw(pmode9, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(-0.12,-0.165,0);
            glRotatef(-angle[6],0,0,1);
            glTranslatef(0.12,0.165,0);
            glmDraw(pmode8, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(-0.15,-0.43,0);
            glRotatef(-angle[7],0,0,1);
            glTranslatef(0.15,0.43,0);
            glmDraw(pmode10, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(0,0.25,0);
            glRotatef(-angle[8],0,0,1);
            glTranslatef(0,-0.25,0);
            glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
        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 };

#include <stdio.h>
void timer(int t)
{
    printf("%d",t);
    glutTimerFunc(100,timer,t+1);
    printf("·stimer");
//    angle+=3;
    glutPostRedisplay();
    printf("ºÎ¤F\n");
}
int oldX=0,oldY=0;
FILE * fout=NULL;///存檔的步驟2, 宣告一個檔案的指標, (一開始是空的NULL)
FILE * fin=NULL;///讀檔的步驟1, 宣告一個檔案的指標, (一開始是空的NULL)
void keyboard(unsigned char key,int x,int y)
{
    printf("%c\n", key);///你按了什麼鍵,印出來,方便了解老師按了什麼鍵
    if(key=='s'){///存檔的步驟3, 在按下 's' 鍵 save存檔
        if(fout == NULL){/// (一開始是空的NULL)
            fout = fopen("file.txt", "w+");///開啟檔案,檔名準備好, 並且是用 write加 模式
            printf("Now open file.txt for write+ Mode\n");
        }
        printf("Now write angle[] %f %f %f %f %f %f %f %f %f\n", angle[0], angle[1], angle[2], angle[3], angle[4], angle[5], angle[6], angle[7], angle[8]);
        fprintf( fout, "%f %f %f %f %f %f %f %f %f\n", angle[0], angle[1], angle[2], angle[3], angle[4], angle[5], angle[6], angle[7], angle[8]);
    }
    if(key=='r'){///讀檔的步驟2, 按下 'r' 去read, ///現在要改成交叉相乘的內插方式算角度
        if(fin == NULL){
            fin = fopen("file.txt", "r");///讀檔的步驟3,檔名準備好, 並且是用 read 模式
            printf("Now open file.txt for read Mode\n");
            fscanf(fin, "%f %f %f %f %f %f %f %f %f", &newAngle[0], &newAngle[1], &newAngle[2], &newAngle[3], &newAngle[4], &newAngle[5], &newAngle[6], &newAngle[7], &newAngle[8]);
        }

        if(alpha >= 1.0){///如果讀太多,alpha超過了, 就要再讀新的angle, 而且要把原來新的,先變舊的
            /// oldAngle = newAngle
            for(int i=0;i<9;i++) oldAngle[i] = newAngle[i];
            /// read newAngle
            fscanf(fin, "%f %f %f %f %f %f %f %f %f", &newAngle[0], &newAngle[1], &newAngle[2], &newAngle[3], &newAngle[4], &newAngle[5], &newAngle[6], &newAngle[7], &newAngle[8]);
            printf("Now read angle[] Pa Pa Pa\n");   ///讀檔的步驟 fscanf()讀進來
            alpha=0.0;
        }

        ///angle = alpha * newAngle + (1-alpha)* oldAngle;
        for(int i=0;i<9;i++){///小心, 角度不見得只有9個,可能更多哦! 要調好,有更多,就要內插更多 ex. 20個
            angle[i]=alpha*newAngle[i] + (1-alpha)*oldAngle[i];///現在要改成交叉相乘的內插方式算角度
        }
        alpha += 0.1;///現在要改成交叉相乘的內插方式算角度, 每次加一點點alpha

        glutPostRedisplay();
    }

    if(key=='0') now=0;
    if(key=='1') now=1;
    if(key=='2') now=2;
    if(key=='3') now=3;
    if(key=='4') now=4;
    if(key=='5') now=5;
    if(key=='6') now=6;
    if(key=='7') now=7;
    if(key=='8') now=8;
}
void mouse(int button,int state,int x,int y)
{
    oldX=x;  oldY=y;
    glutPostRedisplay();
}
void motion(int x,int y)
{
    angle[now]+=(x-oldX);
    oldX=x;
    glutPostRedisplay();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
    glutCreateWindow("Yes, 3D Model Here");
    glutDisplayFunc(display);
    //glutIdleFunc(display);
    //glutTimerFunc(2000,timer,0);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
  //  glClearColor(1,1,1,1);
    //glEnable(GL_CULL_FACE);
    //glCullFace(GL_BACK);
    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();
}

  • 作業二 : 利用Timer自動內插
               步驟一 : 讓動作連貫。
                   程式 :
///hw4_動作存檔讀檔加內插與timer_mouse_keyboard.cpp
///目標: angle[] 存起來, file.txt
#include <stdio.h> ///存檔的步驟1: #include <stdio.h> 裡面有 printf, scanf, fprintf, fscanf
#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel = NULL;
GLMmodel* pmode2 = NULL;
GLMmodel* pmode3 = NULL;
GLMmodel* pmode4 = NULL;
GLMmodel* pmode5 = NULL;
GLMmodel* pmode6 = NULL;
GLMmodel* pmode7 = NULL;
GLMmodel* pmode8 = NULL;
GLMmodel* pmode9 = NULL;
GLMmodel* pmode10 = NULL;
float alpha=0.0;///現在要改成交叉相乘的內插方式算角度: alpha
float oldAngle[20]={};///現在要改成交叉相乘的內插方式算角度: oldAngle
float newAngle[20]={};///現在要改成交叉相乘的內插方式算角度: newAngle
float angle[20]={};///現在要改成交叉相乘的內插方式算角度: 我們要用來畫的 angle 的陣列
int now=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
//        angle=angle+0.05;;
//        glRotatef(angle, 0,1,0);
        if (!pmodel) {
        pmodel = glmReadOBJ("data/head.obj");
        if (!pmodel) exit(0);
        //glmUnitize(pmodel);
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel, 90.0);
        }
        //glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode2) {
        pmode2 = glmReadOBJ("data/body.obj");
        if (!pmode2) exit(0);
        //glmUnitize(pmode2);
        glmFacetNormals(pmode2);
        glmVertexNormals(pmode2, 90.0);
        }
        glmDraw(pmode2, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode3) {
        pmode3 = glmReadOBJ("data/Rarm.obj");
        if (!pmode3) exit(0);
        //glmUnitize(pmode3);
        glmFacetNormals(pmode3);
        glmVertexNormals(pmode3, 90.0);
        }
        //glmDraw(pmode3, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode4) {
        pmode4 = glmReadOBJ("data/Larm.obj");
        if (!pmode4) exit(0);
        //glmUnitize(pmode4);
        glmFacetNormals(pmode4);
        glmVertexNormals(pmode4, 90.0);
        }
        //glmDraw(pmode4, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode5) {
        pmode5 = glmReadOBJ("data/Rhand.obj");
        if (!pmode5) exit(0);
        //glmUnitize(pmode5);
        glmFacetNormals(pmode5);
        glmVertexNormals(pmode5, 90.0);
        }
        //glmDraw(pmode5, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode6) {
        pmode6 = glmReadOBJ("data/Lhand.obj");
        if (!pmode6) exit(0);
        //glmUnitize(pmode6);
        glmFacetNormals(pmode6);
        glmVertexNormals(pmode6, 90.0);
        }
        //glmDraw(pmode6, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode7) {
        pmode7 = glmReadOBJ("data/Rleg.obj");
        if (!pmode7) exit(0);
       // glmUnitize(pmode7);
        glmFacetNormals(pmode7);
        glmVertexNormals(pmode7, 90.0);
        }
        //glmDraw(pmode7, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode8) {
        pmode8 = glmReadOBJ("data/Lleg.obj");
        if (!pmode8) exit(0);
        //glmUnitize(pmode8);
        glmFacetNormals(pmode8);
        glmVertexNormals(pmode8, 90.0);
        }
        //glmDraw(pmode8, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode9) {
        pmode9 = glmReadOBJ("data/Rfoot.obj");
        if (!pmode9) exit(0);
        //glmUnitize(pmode9);
        glmFacetNormals(pmode9);
        glmVertexNormals(pmode9, 90.0);
        }
        //glmDraw(pmode9, GLM_SMOOTH | GLM_MATERIAL);
        if (!pmode10) {
        pmode10 = glmReadOBJ("data/Lfoot.obj");
        if (!pmode10) exit(0);
        //glmUnitize(pmode10);
        glmFacetNormals(pmode10);
        glmVertexNormals(pmode10, 90.0);
        }
        //glmDraw(pmode10, GLM_SMOOTH | GLM_MATERIAL);

        glPushMatrix();
            glTranslatef(0.27,0.21,0);
            glRotatef(-angle[0],0,0,1);
            glTranslatef(-0.27,-0.21,0);
            glmDraw(pmode3, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(0.53,0.2,0);
            glRotatef(-angle[1],0,0,1);
            glTranslatef(-0.53,-0.2,0);
            glmDraw(pmode5, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            //glutSolidTeapot(0.03);
            glTranslatef(-0.27,+0.21,0);
            glRotatef(-angle[2],0,0,1);
            glTranslatef(0.27,-0.21,0);
            glmDraw(pmode4, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(-0.54,0.2,0);
            glRotatef(-angle[3],0,0,1);
            glTranslatef(0.54,-0.2,0);
            glmDraw(pmode6, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(0.13,-0.18,0);
            glRotatef(-angle[4],0,0,1);
            glTranslatef(-0.13,0.18,0);
            glmDraw(pmode7, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(0.14,-0.44,0);
            glRotatef(-angle[5],0,0,1);
            glTranslatef(-0.14,0.44,0);
            glmDraw(pmode9, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(-0.12,-0.165,0);
            glRotatef(-angle[6],0,0,1);
            glTranslatef(0.12,0.165,0);
            glmDraw(pmode8, GLM_SMOOTH | GLM_MATERIAL);
            glTranslatef(-0.15,-0.43,0);
            glRotatef(-angle[7],0,0,1);
            glTranslatef(0.15,0.43,0);
            glmDraw(pmode10, GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(0,0.25,0);
            glRotatef(-angle[8],0,0,1);
            glTranslatef(0,-0.25,0);
            glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
        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 oldX=0,oldY=0;
FILE * fout=NULL;///存檔的步驟2, 宣告一個檔案的指標, (一開始是空的NULL)
FILE * fin=NULL;///讀檔的步驟1, 宣告一個檔案的指標, (一開始是空的NULL)
void keyboard(unsigned char key,int x,int y)
{
    printf("%c\n", key);///你按了什麼鍵,印出來,方便了解老師按了什麼鍵
    if(key=='s'){///存檔的步驟3, 在按下 's' 鍵 save存檔
        if(fout == NULL){/// (一開始是空的NULL)
            fout = fopen("file.txt", "w+");///開啟檔案,檔名準備好, 並且是用 write加 模式
            printf("Now open file.txt for write+ Mode\n");
        }
        printf("Now write angle[] %f %f %f %f %f %f %f %f %f\n", angle[0], angle[1], angle[2], angle[3], angle[4], angle[5], angle[6], angle[7], angle[8]);
        fprintf( fout, "%f %f %f %f %f %f %f %f %f\n", angle[0], angle[1], angle[2], angle[3], angle[4], angle[5], angle[6], angle[7], angle[8]);
    }
    if(key=='r'){///讀檔的步驟2, 按下 'r' 去read, ///現在要改成交叉相乘的內插方式算角度
        if(fin == NULL){
            fin = fopen("file.txt", "r");///讀檔的步驟3,檔名準備好, 並且是用 read 模式
            printf("Now open file.txt for read Mode\n");
            fscanf(fin, "%f %f %f %f %f %f %f %f %f", &newAngle[0], &newAngle[1], &newAngle[2], &newAngle[3], &newAngle[4], &newAngle[5], &newAngle[6], &newAngle[7], &newAngle[8]);
        }
        if(alpha >= 1.0){///如果讀太多,alpha超過了, 就要再讀新的angle, 而且要把原來新的,先變舊的
            /// oldAngle = newAngle
            for(int i=0;i<9;i++) oldAngle[i] = newAngle[i];
            /// read newAngle
            fscanf(fin, "%f %f %f %f %f %f %f %f %f", &newAngle[0], &newAngle[1], &newAngle[2], &newAngle[3], &newAngle[4], &newAngle[5], &newAngle[6], &newAngle[7], &newAngle[8]);
            printf("Now read angle[] Pa Pa Pa\n");   ///讀檔的步驟 fscanf()讀進來
            alpha=0.0;
        }
        ///angle = alpha * newAngle + (1-alpha)* oldAngle;
        for(int i=0;i<9;i++){///小心, 角度不見得只有9個,可能更多哦! 要調好,有更多,就要內插更多 ex. 20個
            angle[i]=alpha*newAngle[i] + (1-alpha)*oldAngle[i];///現在要改成交叉相乘的內插方式算角度
        }
        alpha += 0.1;///現在要改成交叉相乘的內插方式算角度, 每次加一點點alpha
        glutPostRedisplay();
    }
    if(key=='0') now=0;
    if(key=='1') now=1;
    if(key=='2') now=2;
    if(key=='3') now=3;
    if(key=='4') now=4;
    if(key=='5') now=5;
    if(key=='6') now=6;
    if(key=='7') now=7;
    if(key=='8') now=8;
}
void mouse(int button,int state,int x,int y)
{
    oldX=x;  oldY=y;
    glutPostRedisplay();
}
void motion(int x,int y)
{
    angle[now]+=(x-oldX);
    oldX=x;
    glutPostRedisplay();
}
void timer(int t)
{
    glutTimerFunc(10, timer, t+1);
    if(fin == NULL){
        fin = fopen("file.txt", "r");///讀檔的步驟3,檔名準備好, 並且是用 read 模式
        printf("Now open file.txt for read Mode\n");
        fscanf(fin, "%f %f %f %f %f %f %f %f %f", &newAngle[0], &newAngle[1], &newAngle[2], &newAngle[3], &newAngle[4], &newAngle[5], &newAngle[6], &newAngle[7], &newAngle[8]);
    }

    if(alpha >= 1.0){///如果讀太多,alpha超過了, 就要再讀新的angle, 而且要把原來新的,先變舊的
        /// oldAngle = newAngle
        for(int i=0;i<9;i++) oldAngle[i] = newAngle[i];
        /// read newAngle
        fscanf(fin, "%f %f %f %f %f %f %f %f %f", &newAngle[0], &newAngle[1], &newAngle[2], &newAngle[3], &newAngle[4], &newAngle[5], &newAngle[6], &newAngle[7], &newAngle[8]);
        printf("Now read angle[] Pa Pa Pa\n");   ///讀檔的步驟 fscanf()讀進來
        alpha=0.0;
    }

    ///angle = alpha * newAngle + (1-alpha)* oldAngle;
    for(int i=0;i<9;i++){///小心, 角度不見得只有9個,可能更多哦! 要調好,有更多,就要內插更多 ex. 20個
        angle[i]=alpha*newAngle[i] + (1-alpha)*oldAngle[i];///現在要改成交叉相乘的內插方式算角度
    }
    alpha += 0.01;///現在要改成交叉相乘的內插方式算角度, 每次加一點點alpha

    glutPostRedisplay();
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
    glutCreateWindow("Yes, 3D Model Here");
    glutDisplayFunc(display);
    //glutIdleFunc(display);
    glutTimerFunc(1000,timer,0);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
  //  glClearColor(1,1,1,1);
    //glEnable(GL_CULL_FACE);
    //glCullFace(GL_BACK);
    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();
}
  • 作業三 : 學期複習














沒有留言:

張貼留言