FILE * fout=NULL;
FILE * fin=NULL;
#include <GL/glut.h>
#include "glm.h"
#include "CMP3_MCI.h"
#include <opencv/highgui.h>
#include <opencv/cv.h>
CMP3_MCI myMP3;
GLMmodel*model=NULL;
GLMmodel*mode2=NULL;
GLMmodel*mode3=NULL;
GLMmodel*mode4=NULL;
GLMmodel*mode5=NULL;
GLMmodel*mode6=NULL;
GLMmodel*mode7=NULL;
int angle[15]={};
int angleID=0;
int oldX, oldY;
GLUquadric * quad;
GLuint id;
void motion(int x, int y);
void mouse(int button, int state, int x, int y);
void keyboard(unsigned char key, int x, int y);
void saveAll();
const GLfloat light_ambient[] = { 4.0f, 4.0f, 4.0f, 4.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, -10.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 oldAngle[15];
int newAngle[15];
int myTexture(char *filename)
{
IplImage * img = cvLoadImage(filename);
cvCvtColor(img,img, CV_BGR2RGB);
glEnable(GL_TEXTURE_2D);
GLuint id;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
return id;
}
void myInit()
{ quad = gluNewQuadric();
id = myTexture("tree.png");
}
void timer(int t)
{
glutTimerFunc(60,timer,t+1);
if(t==0){
if(fin==NULL)fin=fopen("motion.txt","r");
for(int i=0;i<15;i++){
fscanf(fin,"%d",&newAngle[i]);
}
}
if(t%10==0){
for(int i=0;i<15;i++){
oldAngle[i]=newAngle[i];
fscanf(fin,"%d",&newAngle[i]);
}
}
float Alpha=(t%10)/10.0;
for(int i=0;i<15;i++)
{
angle[i]=Alpha*newAngle[i]+(1-Alpha)*oldAngle[i];
}
glutPostRedisplay();
}
void drawBody()
{
if(model==NULL){
model = glmReadOBJ("body.obj");
glmUnitize(model);
glmFacetNormals(model);
glmVertexNormals(model, 90);
}
if(mode2==NULL){
mode2 = glmReadOBJ("head.obj");
glmUnitize(mode2);
glmFacetNormals(mode2);
glmVertexNormals(mode2, 90);
}
if(mode3==NULL){
mode3 = glmReadOBJ("lf.obj");
glmUnitize(mode3);
glmFacetNormals(mode3);
glmVertexNormals(mode3, 90);
}
if(mode4==NULL){
mode4 = glmReadOBJ("lh.obj");
glmUnitize(mode4);
glmFacetNormals(mode4);
glmVertexNormals(mode4, 90);
}
if(mode5==NULL){
mode5 = glmReadOBJ("rf.obj");
glmUnitize(mode5);
glmFacetNormals(mode5);
glmVertexNormals(mode5, 90);
}
if(mode6==NULL){
mode6 = glmReadOBJ("rh.obj");
glmUnitize(mode6);
glmFacetNormals(mode6);
glmVertexNormals(mode6, 90);
}
if(mode7==NULL){
mode7 = glmReadOBJ("teal.obj");
glmUnitize(mode7);
glmFacetNormals(mode7);
glmVertexNormals(mode7, 90);
}
glPushMatrix();///TODO:身體
glTranslatef(0,0,0);
glRotatef(angle[1],0,1,0);
glRotatef(angle[2],1,0,0);
glTranslatef(0,0,0);
glScalef(1,1,1);
glRotatef(-90, 0,1,0);
glPushMatrix();///TODO:頭
glTranslatef(0,0.0,0.5);
glRotatef(angle[3],1,0,0);
glRotatef(angle[4],0,0,1);
glTranslatef(0,0.2,0.2);
glScalef(1.2,1.2,1.2);
glRotatef(0, 0,0,0);
glmDraw(mode2, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();///TODO:左腳
glTranslatef(0.2,-0.1,-0.2);
glRotatef(angle[5],1,0,0);
glRotatef(angle[6],0,0,1);
glTranslatef(0,-0.5,-0.1);
glScalef(0.5,0.5,0.5);
glRotatef(0, 0,0,0);
glmDraw(mode3, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();///TODO:左手
glTranslatef(-0.12,-0.12,0.2);
glRotatef(angle[7],1,0,0);
glRotatef(angle[8],0,0,1);
glTranslatef(0,-0.2,0);
glScalef(0.7,0.7, 0.7);
glRotatef(0, 0,0,0);
glmDraw(mode4, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();///TODO:右腳
glTranslatef(-0.2,-0.1,-0.2);
glRotatef(angle[9],1,0,0);
glRotatef(angle[10],0,0,1);
glTranslatef(0,-0.5,-0.1);
glScalef(0.5,0.5,0.5);
glRotatef(0, 0,0,0);
glmDraw(mode5, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();///TODO:右手
glTranslatef(0.18,-0.13,0.2);
glRotatef(angle[11],1,0,0);
glRotatef(angle[12],0,0,1);
glTranslatef(0,-0.2,0);
glScalef(0.7, 0.7, 0.7);
glRotatef(0, 0,1,0);
glmDraw(mode6, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();///TODO:尾巴
glTranslatef(0,0.1,-0.3);
glRotatef(angle[13],1,0,0);
glRotatef(angle[14],0,0,1);
glTranslatef(0,0.2,-0.8);
glScalef(1.2, 1.2, 1.2);
glRotatef(0, 0,0,0);
glmDraw(mode7, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glmDraw(model, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
}
void mouse(int button, int state, int x, int y)
{
oldX=x; oldY=y;
}
void saveAll()
{
if(fout==NULL) fout=fopen("motion.txt", "w+");
for(int i=0; i<15; i++){
printf("%d ", angle[i]);
fprintf(fout,"%d ", angle[i]);
}
printf("\n");
fprintf(fout, "\n");
}
void motion(int x, int y)
{
angle[angleID] += (x-oldX);
oldX=x;
glutPostRedisplay();///TODO2:重畫畫面
}
void readAll()
{
if(fin==NULL) fin=fopen("motion.txt", "r");///TODO4 開檔
for(int i=0; i<15; i++){
fscanf(fin, "%d", &angle[i]);///TODO4 讀檔
}
}
void keyboard(unsigned char key, int x, int y)
{///TODO2: 鍵盤,選angleID
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;
if(key=='7') angleID=7;
if(key=='8') angleID=8;
if(key=='9') angleID=9;
if(key=='a') angleID=10;
if(key=='b') angleID=11;
if(key=='c') angleID=12;
if(key=='d') angleID=13;
if(key=='e') angleID=14;
if(key=='s') saveAll();///記住動作
if(key=='r')
{
readAll();
glutPostRedisplay();///TODO4 重畫
}
if(key=='p'){
glutTimerFunc(0,timer,0);
}
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glColor3f (1,1,1);
glBegin(GL_POLYGON);
glTexCoord2f(0,0);glVertex2f(-1,+1);
glTexCoord2f(0,1);glVertex2f(-1,-1);
glTexCoord2f(1,1);glVertex2f(+1,-1);
glTexCoord2f(1,0);glVertex2f(+1,+1);
glEnd();
glDisable(GL_TEXTURE_2D);
glPushMatrix();
glTranslatef(0,-0.08,-0.5);
glScalef(0.6,0.6,0.6);
drawBody();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(650 ,650);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("07160245");
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);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
myMP3.Load("music.mp3");
myInit();
myMP3.Play();
glutMainLoop();
}
影片連結:https://youtu.be/n0ImtQqnugI

沒有留言:
張貼留言