期末作品展示(Coding)
youtube連結:https://youtu.be/1Bh3QzzA5n8
操控關節0~9 a~i
s w寫入
p播放
r重讀紀錄
#include <stdio.h>
#include <GL/glut.h>
#include <mmsystem.h>
#include "CMP3_MCI.h"
GLMmodel* pmodel = NULL;
GLMmodel* right1 = NULL;
GLMmodel* right2 = NULL;
GLMmodel* right31 = NULL;
GLMmodel* right32 = NULL;
GLMmodel* left1 = NULL;
GLMmodel* left2 = NULL;
GLMmodel* left31 = NULL;
GLMmodel* left32 = NULL;
GLMmodel* head = NULL;
GLMmodel* head2 = NULL;
GLMmodel* head3 = NULL;
GLMmodel* right4 = NULL;
GLMmodel* left4 = NULL;
FILE * fout=NULL;
FILE * fin = NULL;
CMP3_MCI ado1;
float angle[20]={0},angleNew[20],angleOld[20];
int now=0;
int oldX=0, oldY=0;///oldx,oldy為了瞭解原本已經走了多少
void timer (int t){
/*if(t<=198)
glutTimerFunc(33,timer,t+1);
else ado1.Stop();*/
glutTimerFunc(33,timer,t+1);
if(t%30==0){
for(int i=0;i<20;i++){
angleOld[i]=angleNew[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 keyboard(unsigned char key, int x, int y){
if(key-'0'>=0 && key-'0'<=9) now=key-'0'; ///用數字鍵來切換關節
if(key-'a'>=0 && key-'a'<=9) now=key-'a'+10;
if(key=='s' ||key=='S' ||key=='w' ||key=='W' ){ ///啟用檔案
if(fout==NULL) fout=fopen("output.txt", "w+");
for(int i=0;i<20;i++){
printf("%.3f ",angle[i]);
fprintf(fout, "%.3f ",angle[i]);
}
printf("\n");
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]);
printf("%.2f ", angle[i]);
}
printf("\n");
}
if(key=='p' || key=='P'){
if(fin==NULL) fin=fopen("output.txt", "r");
for(int i=0;i<20;i++){
fscanf(fin, "%f", &angleNew[i]);
}
ado1.Load("music/enter.mp3");
ado1.Play();
glutTimerFunc(33, timer, 1);
}
glutPostRedisplay();
}
static void display(void)
{
glClearColor(0.96, 0.87, 0.7,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle[13],1,1,0);
glRotatef(angle[16],1,0,0);
glRotatef(angle[17],0,1,0);
glRotatef(angle[18],0,0,1);
glScalef(angle[15]*0.008,angle[15]*0.008,angle[15]*0.008);
glTranslatef(angle[14]*0.01,0,0);
///glScalef(0.8,0.8,0.8);
if (!pmodel) {
pmodel = glmReadOBJ("data/body.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
if (!right1) {
right1 = glmReadOBJ("data/right1.obj");
if (!right1) exit(0);
glmUnitize(right1);
glmFacetNormals(right1);
glmVertexNormals(right1, 90.0);
}
if (!right2) {
right2 = glmReadOBJ("data/right2.obj");
if (!right2) exit(0);
glmUnitize(right2);
glmFacetNormals(right2);
glmVertexNormals(right2, 90.0);
}
if (!right31) {
right31 = glmReadOBJ("data/right3.1.obj");
if (!right31) exit(0);
glmUnitize(right31);
glmFacetNormals(right31);
glmVertexNormals(right31, 90.0);
}
if (!right32) {
right32 = glmReadOBJ("data/right3.2.obj");
if (!right32) exit(0);
glmUnitize(right32);
glmFacetNormals(right32);
glmVertexNormals(right32, 90.0);
}
if (!left1) {
left1 = glmReadOBJ("data/left1.obj");
if (!left1) exit(0);
glmUnitize(left1);
glmFacetNormals(left1);
glmVertexNormals(left1, 90.0);
}
if (!left2) {
left2 = glmReadOBJ("data/left2.obj");
if (!left2) exit(0);
glmUnitize(left2);
glmFacetNormals(left2);
glmVertexNormals(left2, 90.0);
}
if (!left31) {
left31 = glmReadOBJ("data/left3.1.obj");
if (!left31) exit(0);
glmUnitize(left31);
glmFacetNormals(left31);
glmVertexNormals(left31, 90.0);
}
if (!left32) {
left32 = glmReadOBJ("data/left3.2.obj");
if (!left32) exit(0);
glmUnitize(left32);
glmFacetNormals(left32);
glmVertexNormals(left32, 90.0);
}
if (!head) {
head = glmReadOBJ("data/head.obj");
if (!head) exit(0);
glmUnitize(head);
glmFacetNormals(head);
glmVertexNormals(head, 90.0);
}
if (!head2) {
head2 = glmReadOBJ("data/head2.obj");
if (!head2) exit(0);
glmUnitize(head2);
glmFacetNormals(head2);
glmVertexNormals(head2, 90.0);
}
if (!head3) {
head3 = glmReadOBJ("data/head3.obj");
if (!head3) exit(0);
glmUnitize(head3);
glmFacetNormals(head3);
glmVertexNormals(head3, 90.0);
}
if (!right4) {
right4 = glmReadOBJ("data/right4.obj");
if (!right4) exit(0);
glmUnitize(right4);
glmFacetNormals(right4);
glmVertexNormals(right4, 90.0);
}
if (!left4) {
left4 = glmReadOBJ("data/left4.obj");
if (!left4) exit(0);
glmUnitize(left4);
glmFacetNormals(left4);
glmVertexNormals(left4, 90.0);
}
glPushMatrix();///備分矩陣
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);///身體
glPushMatrix();///右邊手
glTranslatef(0.32,0.3,0);
glRotatef(angle[1],1,0,0);
glTranslatef(0,-0.1,0);
glmDraw(right1, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();
glTranslatef(0.01,-0.15,0);
glRotatef(angle[2],1,0,0);
glTranslatef(0,-0.1,0);
glmDraw(right2, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();
glTranslatef(0.03,-0.13,0);
glRotatef(angle[3],0,0,1);
glTranslatef(0.03,-0.11,0);
glmDraw(right31, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();
glTranslatef(0.01,-0.13,0);
glRotatef(angle[4],0,0,1);
glTranslatef(-0.05,-0.11,0);
glmDraw(right32, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();///左邊手
glTranslatef(-0.32,0.3,0);
glRotatef(angle[5],1,0,0);
glTranslatef(0,-0.1,0);
glmDraw(left1, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();
glTranslatef(-0.01,-0.15,0);
glRotatef(angle[6],1,0,0);
glTranslatef(0,-0.1,0);
glmDraw(left2, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();
glTranslatef(-0.0,-0.13,0);
glRotatef(angle[7],0,0,1);
glTranslatef(0.03,-0.11,0);
glmDraw(left31, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();
glTranslatef(-0.01,-0.13,0);
glRotatef(angle[8],0,0,1);
glTranslatef(-0.05,-0.11,0);
glmDraw(left32, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();///頭
glRotatef(180,0,1,0);
glTranslatef(0,0.35,0);
glRotatef(angle[9],0,0,1);
glTranslatef(0,0.2,0);
glmDraw(head, GLM_SMOOTH | GLM_MATERIAL);
glPushMatrix();///頭
glTranslatef(0.08,0.16,0);
glRotatef(angle[0],0,0,1);
glTranslatef(0.05,0.08,0);
glmDraw(head2, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();///頭
glTranslatef(-0.08,0.16,0);
glRotatef(angle[10],0,0,1);
glTranslatef(-0.05,0.08,0);
glmDraw(head3, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();
glPushMatrix();///右腳
glScalef(0.3,0.3,0.3);
glRotatef(180,0,1,0);
glTranslatef(-0.4,-1.2,0);
glRotatef(angle[11],1,0,0);
glTranslatef(0,-1,0.25);
glmDraw(right4, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPushMatrix();///左腳
glScalef(0.3,0.3,0.3);
glRotatef(180,0,1,0);
glTranslatef(0.4,-1.2,0);
glRotatef(angle[12],1,0,0);
glTranslatef(0,-1,0.25);
glmDraw(left4, GLM_SMOOTH | GLM_MATERIAL);
glPopMatrix();
glPopMatrix();///還原矩陣
glPopMatrix();
glutSwapBuffers();
}
void motion(int x, int y)
{
angle[now] -=(x-oldX);
oldX=x; ///新座標記錄
glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
oldX=x;
///先給他有記憶之前的座標在哪
}
const GLfloat light_ambient2[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse2[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular2[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position2[] = { 0.3f, 4.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, 4.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("05160710_Robot");
glutMotionFunc(motion);
glutMouseFunc(mouse);
glutDisplayFunc(display);
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_ambient2);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse2);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular2);
glLightfv(GL_LIGHT0, GL_POSITION, light_position2);
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;
}

沒有留言:
張貼留言