期末作品展示
YOUTUBE:
https://www.youtube.com/watch?v=WK3Q2XUQIzU&feature=youtu.be
程式碼:
#include <GL/glut.h>
#include "glm.h"
#include <stdio.h>
#include <mmsystem.h>
GLMmodel * pmodel0=NULL;
GLMmodel * pmodel1=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;
GLMmodel * pmodel12=NULL;
GLMmodel * pmodel13=NULL;
GLMmodel * pmodel14=NULL;
GLMmodel * pmodel15=NULL;
///float angle=0;
FILE * fout=NULL;
FILE * fin=NULL;
float angle[25],angleNew[25],angleOld[25],oldX,oldY;
int now=0;///Now5:用keyboard的數字鍵,來切換關節
GLUquadric * quad;
GLuint id;
void timer(int t)
{
glutTimerFunc(100,timer,t+1);
if(t%10==0)
{
for(int i=0;i<25;i++)
{
angleOld[i] =angleNew[i];
fscanf(fin,"%f",&angleNew[i]);
}
}
float alpha=(t%10)/10.0;
for(int i=0;i<25;i++)
{
angle[i]=alpha*angleNew[i]+(1-alpha)*angleOld[i];
}
glutPostRedisplay();
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='0') now=0;
if(key=='1') now=1;
if(key=='2') now=2;///Now5:用keyboard的數字鍵,來切換關節
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;
if(key=='9') now=9;
if(key=='a') now=10;
if(key=='b') now=11;
if(key=='c') now=12;
if(key=='d') now=13;
if(key=='e') now=14;
if(key=='f') now=15;
if(key=='g') now=16;
if(key=='h') now=17;
if(key=='i') now=18;
if(key=='j') now=19;
if(key=='k') now=20;
if(key=='l') now=21;
if(key=='m') now=22;
if(key=='s' || key=='S' || key=='w' || key=='W')
{
if(fout==NULL) fout=fopen("output.txt", "w+");
for(int i=0; i<25; i++) ///Now5: for迴圈
{
printf("%.3f ", angle[i]);///Now5: 把每一個陣列裡的角度,都寫一次
fprintf(fout, "%.3f ", angle[i]);///Now5: 把每一個陣列裡的角度,都寫一次
}///Now5: 小心,寫檔 vs. 讀檔,要完全一樣
printf("\n");///Now5: 最後要印個跳行,才不會畫面亂掉
fprintf(fout,"\n");///Now5: 最後要印個跳行,才不會畫面亂掉
}///3個角度的值,印到檔案去
if(key=='r' || key=='R') ///Now4:
{
if(fin==NULL) fin=fopen("output.txt", "r");///Now4: 第一次讀檔時,要先開檔
for(int i=0; i<25; i++) ///Now5: for迴圈
{
fscanf(fin, "%f ", &angle[i]);///Now5: 把每一個陣列裡的角度,都讀一次
printf("%f ", angle[i]);///Now5: 順便印一下
}///Now5: 小心,寫檔 vs. 讀檔,要完全一樣
printf("\n");///Now5: 最後要印個跳行,才不會畫面亂掉
}
if(key=='p'||key=='P')
{
if(fin==NULL) fin=fopen("output.txt","r");
for(int i=0;i<25;i++)
{
fscanf(fin, "%f ",&angleNew[i]);
}
glutTimerFunc(100,timer,0);
}
glutPostRedisplay();///Now4: 重畫畫面
}
void motion(int x, int y)///Now:
{
///Now:
angle[now] +=(x-oldX);
oldX =x ;
///Now: 角度會隨mouse motion而改值///Now5:用keyboard的數字鍵,來切換關節
///Now5: 下面真的都刪掉了, 臨時的啦 Now2: 這個等一下會刪掉
glutPostRedisplay();///Now:
}///Now:
void mouse(int button,int state,int x,int y)
{
oldX=x; oldY=y;
}
/*void motion(int x, int y)
{
angle=x; glutPostRedisplay();
}*/
/*void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
///Now: 要畫東西
glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glutSolidTeapot(0.3);///Now:身體
glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glTranslatef(0.4, 0, 0);///Now:(3) 掛在右邊
glRotatef(angle[1], 0,0,1);///Now:(2) angle的轉動角度,對Z軸
glTranslatef(0.4, 0, 0);///Now:(1) 往右移,讓手把在中間
glutSolidTeapot(0.3); ///Now:右手臂
glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glTranslatef(0.4, 0, 0);///Now:(3) 掛在右邊
glRotatef(angle[2], 0,0,1);///Now:(2) angle的轉動角度,對Z軸
glTranslatef(0.4, 0, 0);///Now:(1) 往右移,讓手把在中間
glutSolidTeapot(0.3); ///Now:右肘
glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glTranslatef(-0.4, 0, 0);///Now:(3) 掛在右邊
glRotatef(angle[3], 0,0,1);///Now:(2) angle的轉動角度,對Z軸
glTranslatef(-0.4, 0, 0);///Now:(1) 往右移,讓手把在中間
glutSolidTeapot(0.3); ///Now:右手臂
glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glTranslatef(-0.4, 0, 0);///Now:(3) 掛在右邊
glRotatef(angle[4], 0,0,1);///Now:(2) angle的轉動角度,對Z軸
glTranslatef(-0.4, 0, 0);///Now:(1) 往右移,讓手把在中間
glutSolidTeapot(0.3); ///Now:右肘
glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glutSwapBuffers();
}*/
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (!pmodel0)
{
pmodel0 = glmReadOBJ("data/body.obj");
if (!pmodel0) exit(0);
glmUnitize(pmodel0);
glmFacetNormals(pmodel0);
glmVertexNormals(pmodel0, 90.0);
}
if (!pmodel1)
{
pmodel1 = glmReadOBJ("data/H.obj");
if (!pmodel1) exit(0);
glmUnitize(pmodel1);
glmFacetNormals(pmodel1);
glmVertexNormals(pmodel1, 90.0);
}
if (!pmodel2)
{
pmodel2 = glmReadOBJ("data/R_arm.obj");
if (!pmodel2) exit(0);
glmUnitize(pmodel2);
glmFacetNormals(pmodel2);
glmVertexNormals(pmodel2, 90.0);
}
if (!pmodel3)
{
pmodel3 = glmReadOBJ("data/R_arm_A.obj");
if (!pmodel3) exit(0);
glmUnitize(pmodel3);
glmFacetNormals(pmodel3);
glmVertexNormals(pmodel3, 90.0);
}
if (!pmodel4)
{
pmodel4 = glmReadOBJ("data/R_head.obj");
if (!pmodel4) exit(0);
glmUnitize(pmodel4);
glmFacetNormals(pmodel4);
glmVertexNormals(pmodel4, 90.0);
}
if (!pmodel5)
{
pmodel5 = glmReadOBJ("data/L_arm.obj");
if (!pmodel5) exit(0);
glmUnitize(pmodel5);
glmFacetNormals(pmodel5);
glmVertexNormals(pmodel5, 90.0);
}
if (!pmodel6)
{
pmodel6 = glmReadOBJ("data/L_arm_A.obj");
if (!pmodel6) exit(0);
glmUnitize(pmodel6);
glmFacetNormals(pmodel6);
glmVertexNormals(pmodel6, 90.0);
}
if (!pmodel7)
{
pmodel7 = glmReadOBJ("data/L_head.obj");
if (!pmodel7) exit(0);
glmUnitize(pmodel7);
glmFacetNormals(pmodel7);
glmVertexNormals(pmodel7, 90.0);
}
if (!pmodel8)
{
pmodel8 = glmReadOBJ("data/R_Leg.obj");
if (!pmodel8) exit(0);
glmUnitize(pmodel8);
glmFacetNormals(pmodel8);
glmVertexNormals(pmodel8, 90.0);
}
if (!pmodel9)
{
pmodel9 = glmReadOBJ("data/R_Leg_L.obj");
if (!pmodel9) exit(0);
glmUnitize(pmodel9);
glmFacetNormals(pmodel9);
glmVertexNormals(pmodel9, 90.0);
}
if (!pmodel10)
{
pmodel10 = glmReadOBJ("data/R_Leg_F.obj");
if (!pmodel10) exit(0);
glmUnitize(pmodel10);
glmFacetNormals(pmodel10);
glmVertexNormals(pmodel10, 90.0);
}
if (!pmodel11)
{
pmodel11 = glmReadOBJ("data/L_Leg.obj");
if (!pmodel11) exit(0);
glmUnitize(pmodel11);
glmFacetNormals(pmodel11);
glmVertexNormals(pmodel11, 90.0);
}
if (!pmodel12)
{
pmodel12 = glmReadOBJ("data/L_Leg_L.obj");
if (!pmodel12) exit(0);
glmUnitize(pmodel12);
glmFacetNormals(pmodel12);
glmVertexNormals(pmodel12, 90.0);
}
if (!pmodel13)
{
pmodel13 = glmReadOBJ("data/L_Leg_F.obj");
if (!pmodel13) exit(0);
glmUnitize(pmodel13);
glmFacetNormals(pmodel13);
glmVertexNormals(pmodel13, 90.0);
}
if (!pmodel14)
{
pmodel14 = glmReadOBJ("data/A.obj");
if (!pmodel14) exit(0);
glmUnitize(pmodel14);
glmFacetNormals(pmodel14);
glmVertexNormals(pmodel14, 90.0);
}
if (!pmodel15)
{
pmodel15 = glmReadOBJ("data/JJ.obj");
if (!pmodel15) exit(0);
glmUnitize(pmodel15);
glmFacetNormals(pmodel15);
glmVertexNormals(pmodel15, 90.0);
}
glPushMatrix();///身體
glTranslatef(angle[1]/500,0,0);
glTranslatef(angle[2]/500,0,0);
glRotatef(angle[3],0,1,0);
glRotatef(90,0,1,0);
glScaled(0.35,0.35,0.35);
glmDraw(pmodel0, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///右臂
glTranslatef(-0.04,0,-0.8);
glRotatef(angle[6],0,0,1);
glTranslatef(0.52,0,0);
glRotatef(180,0,0,1);
glScaled(1.7,1.7,1.7);
glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///右肘
glTranslatef(-0.3,0,0.05);
glRotatef(angle[7],0,0,1);
glTranslatef(-0.27,0,0);
glScaled(1,1,1);
glmDraw(pmodel3, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///右腕
glTranslatef(-0.33,-0.01,-0.05);
glRotatef(angle[8],0,0,1);
glTranslatef(-0.06,0,0);
glRotatef(180,0,0,1);
glScaled(1,1,1);
glmDraw(pmodel4, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();///左臂
glTranslatef(0, 0, 0.83);
glRotatef(angle[9], 0,0,1);
glTranslatef(0.53, 0, 0);
glRotatef(180,0,0,1);
glScaled(1.55,1.55,1.55);
glmDraw(pmodel5, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///左肘
glTranslatef(-0.36,0,-0.05);
glRotatef(angle[10],0,0,1);
glTranslatef(-0.28,0,0);
glScaled(1.2,1.2,1.2);
glmDraw(pmodel6, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///左腕
glTranslatef(-0.31,-0.01,0.05);
glRotatef(angle[11],0,0,1);
glTranslatef(-0.06,0,0);
glRotatef(180,0,0,1);
glScaled(1,1,1);
glmDraw(pmodel7, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();///右大腿
glTranslatef(-0.2,-0.7,-0.3);
glRotatef(angle[12],0,0,1);
glTranslatef(0,-0.3,0);
glScaled(0.4,0.4,0.4);
glmDraw(pmodel8, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///右小腿
glTranslatef(0.3,-0.6,0);
glRotatef(angle[13],0,0,1);
glTranslatef(-0.3,-0.8,0);
glScaled(3,3,3);
glmDraw(pmodel9, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///右腳掌
glTranslatef(0,-0.32,0);
glRotatef(angle[14],0,0,1);
glTranslatef(0.23,0,0);
glScaled(1.5,1.5,1.5);
glmDraw(pmodel10, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();///左大腿
glTranslatef(-0.2,-0.71,0.3);
glRotatef(angle[15],0,0,1);
glTranslatef(0,-0.3,0);
glScaled(0.95,0.95,0.95);
glmDraw(pmodel11, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///左小腿
glTranslatef(-0.01,-0.15,0);
glRotatef(angle[16],0,0,1);
glTranslatef(0,-0.4,0);
glScaled(2.3,2.3,2.3);
glmDraw(pmodel12, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///左腳掌
glTranslatef(-0.04,-0.18,0);
glRotatef(angle[17],0,0,1);
glTranslatef(0.17,0,0);
glScaled(0.56,0.56,0.56);
glmDraw(pmodel13, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();///頭
glTranslated(0,0.54,0);
glRotatef(angle[5],0,1,0);
glRotatef(angle[4],1,0,0);
glScaled(1.15,1.15,1.15);
glmDraw(pmodel1, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPushMatrix();///帽子
glTranslatef(angle[18]/1000,0,0);
glTranslatef(0,angle[19]/1000,0);
glTranslatef(0.5,-0.45,0);
glScaled(1.2,1.3,1.2);
glmDraw(pmodel14, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();///拐杖
glTranslatef(angle[20]/1000,0,0);
glTranslatef(0,angle[21]/1000,0);
glTranslatef(0.73,-0.06,0);
glRotatef(angle[22],0,0,1);
glTranslatef(0,-0.3,0);
glScaled(1.4,1.5,1.4);
glmDraw(pmodel15, GLM_SMOOTH | GLM_MATERIAL);
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("Play With Fire.wav",NULL,SND_ASYNC);
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("05161074");
glutDisplayFunc(display);
glClearColor(1,1,1,1);
glutMotionFunc(motion);
glutMouseFunc(mouse);
glutKeyboardFunc(keyboard);
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;
}
沒有留言:
張貼留言