期末作品展示
yotube連結: https://youtu.be/Ibsyy3AYGoE
完整程式碼:
#include <GL/glut.h>
#include <stdio.h>///(0)外掛
#include "glm.h"
#include <mmsystem.h>
GLMmodel*pmodel=NULL;
GLMmodel*pmodel2=NULL;
GLMmodel*pmodel3=NULL;
GLMmodel*pmodel4=NULL;
GLMmodel*pmodel5=NULL;
GLMmodel*pmodel6=NULL;
GLMmodel*pmodel7=NULL;
GLMmodel*pmodel8=NULL;
GLMmodel*pmodel9=NULL;
GLMmodel*pmodel10=NULL;
GLMmodel*pmodel11=NULL;
FILE * fout=NULL;///(1)指標
FILE * fin=NULL;
float angle[20], angleNew[20], angleOld[20], oldX=0, oldY=0;
int ID=0;
void timer(int t)
{///一開始t是0, 接下來是t+1為1, 2,3, .... 9
glutTimerFunc(33, timer, t+1);
if(t%30==0){///每10frame讀下一筆資料
///要新舊去內插
for(int i=0;i<20;i++){
angleOld[i] = angleNew[i];///備份,新的就變成舊的了
fscanf(fin, "%f", &angleNew[i]);
}///前面都跟 read一樣
}
///內插,每次都要做啦
float alpha= (t%30)/30.0;///介於0.0 ... 1.0
for(int i=0;i<20;i++){
angle[i] = alpha*angleNew[i] + (1-alpha)*angleOld[i];
}
glutPostRedisplay();
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='0') ID=0;
if(key=='1') ID=1;
if(key=='2') ID=2;
if(key=='3') ID=3;
if(key=='4') ID=4;
if(key=='5') ID=5;
if(key=='s' || key=='S' || key=='w' ||key=='W'){
if(fout==NULL) fout=fopen("output.txt", "w+");
for(int i=0;i<20;i++){
fprintf(fout, "%.2f ", angle[i]);
}///空格很重要, 少了客格,一堆數字就黏起來了
fprintf(fout, "\n");
}
if(key=='r' || key=='R'){///一次讀一行/一個動作
if(fin==NULL) fin=fopen("output.txt", "r");
for(int i=0;i<20;i++){
fscanf(fin, "%f", &angle[i]);
}
}
///主角: 自動播放的內插
if(key=='p' || key=='P'){///Play, 起個頭,然後後面全自動播放
PlaySound("music.wav", NULL, SND_ASYNC);
if(fin==NULL) fin=fopen("output.txt", "r");
for(int i=0;i<20;i++){
fscanf(fin, "%f", &angleNew[i]);
}///前面都跟 read一樣
glutTimerFunc(100, timer, 0);///與眾不同的地方
}
glutPostRedisplay();
}
void motion(int x, int y)
{
angle[ID] += (x-oldX);
oldX = x;
glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
oldX=x; oldY=y;
}
void display()
{
glClearColor(1 , 0.2 , 0.8 , 0.3 );
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
if(!pmodel)
{
pmodel = glmReadOBJ("body.obj");
pmodel2 = glmReadOBJ("cloud.obj");
pmodel3 = glmReadOBJ("eyeL.obj");
pmodel4 = glmReadOBJ("eyeR.obj");
pmodel5 = glmReadOBJ("handL.obj");
pmodel6 = glmReadOBJ("handR.obj");
pmodel7 = glmReadOBJ("head.obj");
pmodel8 = glmReadOBJ("legL.obj");
pmodel9 = glmReadOBJ("legR.obj");
pmodel10 = glmReadOBJ("mouse.obj");
pmodel11 = glmReadOBJ("nose.obj");
if(!pmodel)exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel,90.0);
if(!pmodel2)exit(0);
glmUnitize(pmodel2);
glmFacetNormals(pmodel2);
glmVertexNormals(pmodel2,90.0);
if(!pmodel3)exit(0);
glmUnitize(pmodel3);
glmFacetNormals(pmodel3);
glmVertexNormals(pmodel3,90.0);
if(!pmodel4)exit(0);
glmUnitize(pmodel4);
glmFacetNormals(pmodel4);
glmVertexNormals(pmodel4,90.0);
if(!pmodel5)exit(0);
glmUnitize(pmodel5);
glmFacetNormals(pmodel5);
glmVertexNormals(pmodel5,90.0);
if(!pmodel6)exit(0);
glmUnitize(pmodel6);
glmFacetNormals(pmodel6);
glmVertexNormals(pmodel6,90.0);
if(!pmodel7)exit(0);
glmUnitize(pmodel7);
glmFacetNormals(pmodel7);
glmVertexNormals(pmodel7,90.0);
if(!pmodel8)exit(0);
glmUnitize(pmodel8);
glmFacetNormals(pmodel8);
glmVertexNormals(pmodel8,90.0);
if(!pmodel9)exit(0);
glmUnitize(pmodel9);
glmFacetNormals(pmodel9);
glmVertexNormals(pmodel9,90.0);
if(!pmodel10)exit(0);
glmUnitize(pmodel10);
glmFacetNormals(pmodel10);
glmVertexNormals(pmodel10,90.0);
if(!pmodel11)exit(0);
glmUnitize(pmodel11);
glmFacetNormals(pmodel11);
glmVertexNormals(pmodel11,90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
//glPushMatrix();
glPushMatrix();
glTranslatef(-0.15, 0.2 , -1);
glScalef(0.22,0.22,0.22);
glmDraw(pmodel3 , GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();
glTranslatef(0.15, 0.2 , -1);
glScalef(0.22,0.22,0.22);
glmDraw(pmodel4 , GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();
glTranslatef( -0.01 , 0.07 , -1);
glScalef(0.22,0.22,0.22);
glmDraw(pmodel11 , GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();
glTranslatef( -0.01 , -0.08 , -1);
glScalef(0.22,0.22,0.22);
glmDraw(pmodel10 , GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();
glRotatef( angle[0], 0 , 0 , -0.5);
glPushMatrix();
glTranslatef( -0.58 , 0 , 0.2);
glScalef(0.86,0.86,0.86);
glRotatef( 30, 0 , 1 , 0 );
glmDraw(pmodel5 , GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotatef( angle[1], 0 , 0 , 1);
glPushMatrix();
glTranslatef( 0.58 , 0 , 0.2 );
glScalef(0.86,0.86,0.86);
glRotatef(-30, 0 , 1 , 0 );
glmDraw(pmodel6 , GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef( 0 , 0.55 , 0);
glScalef(0.5,0.5,0.5);
glRotatef(-90, 1 , 0 , 0 );
glTranslatef(0 , 0 , 0 );
glRotatef( angle[4], 0 , 1 , 0);
glmDraw(pmodel7 , GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();
glRotatef( angle[2], -1 , 0 , 0);
glPushMatrix();
glTranslatef( -0.25 , -0.7 , 0 );
glScalef( 1.25, 1.25 ,1.25 );
glmDraw(pmodel8 , GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotatef( angle[3], 1 , 0 , 0);
glPushMatrix();
glTranslatef( 0.25 , -0.7 , 0 );
glScalef(1.25 , 1.25 , 1.25);
glTranslatef(0 , 0 , 0 );
glmDraw(pmodel9 , GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotatef( angle[5], 0 , 0.5 , 0);
glPushMatrix();
glTranslatef( -0.65 , 0.7 , 0 );
glScalef(0.5 , 0.5 , 0.5);
glTranslatef(0 , 0 , 0 );
glmDraw(pmodel2 , GLM_SMOOTH | GLM_MATERIAL);
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 };
/* Program entry point */
int main(int argc, char *argv[])
{
//PlaySound("music.wav", NULL, SND_ASYNC);
glutInit(&argc, argv);
glutInitWindowSize(600,600);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("final");
///glutReshapeFunc(resize);
glutDisplayFunc(display);
///glutKeyboardFunc(key);
///glutIdleFunc(idle);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
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();
return EXIT_SUCCESS;
}
沒有留言:
張貼留言