讓聲音一秒播放一次
程式碼↓↓↓↓↓
#include <GL/glut.h> #include <mmsystem.h>///NOW (0)發聲音 #include <stdio.h>///NOW3 for printf() float angle=0;///NOW4 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix();///NOW4 glRotatef(angle, 0, 0, 1);///NOW4 glutSolidTeapot( 0.3 );///NOW4 glPopMatrix();///NOW4 glutSwapBuffers(); } void timer(int t)///NOW (2) { glutTimerFunc(30, timer, t+1);///NOW4 ///NOW3 一起床,馬上撥下一個鬧鐘, 時間才會準 printf("現在的 timer(t)的t是: %d\n", t);///NOW3 angle = t;///NOW4 glutPostRedisplay();///NOW4 要更新畫面 } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(500,500);///大一點 glutCreateWindow("week14 timer"); glutDisplayFunc(display); glutTimerFunc(1000, timer, 0);///NOW (1) glutMainLoop(); }
增加程式碼,讓小黑視窗顯示撥放了幾次
程式碼↓↓↓↓↓
#include <GL/glut.h>
#include <mmsystem.h>///NOW (0)發聲音
#include <stdio.h>///NOW3 for printf()
float angle=0;///NOW4
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///NOW4
glRotatef(angle, 0, 0, 1);///NOW4
glutSolidTeapot( 0.3 );///NOW4
glPopMatrix();///NOW4
glutSwapBuffers();
}
void timer(int t)///NOW (2)
{
glutTimerFunc(30, timer, t+1);///NOW4 ///NOW3 一起床,馬上撥下一個鬧鐘, 時間才會準
printf("現在的 timer(t)的t是: %d\n", t);///NOW3
angle = t;///NOW4
glutPostRedisplay();///NOW4 要更新畫面
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///大一點
glutCreateWindow("week14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW (1)
glutMainLoop();
}
執行結果↓↓↓↓↓
改程式碼讓茶壺左右移動
程式碼↓↓↓↓↓
#include <GL/glut.h> #include <mmsystem.h>///NOW (0)發聲音 #include <stdio.h>///NOW3 for printf() float angle=0;///NOW4 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix();///NOW4 glRotatef(angle, 0, 0, 1);///NOW4 glutSolidTeapot( 0.3 );///NOW4 glPopMatrix();///NOW4 glutSwapBuffers(); } void timer(int t)///NOW (2) { glutTimerFunc(30, timer, t+1);///NOW4 ///NOW3 一起床,馬上撥下一個鬧鐘, 時間才會準 printf("現在的 timer(t)的t是: %d\n", t);///NOW3 angle = t;///NOW4 glutPostRedisplay();///NOW4 要更新畫面 } int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(500,500);///大一點 glutCreateWindow("week14 timer"); glutDisplayFunc(display); glutTimerFunc(1000, timer, 0);///NOW (1) glutMainLoop(); }
執行結果↓↓↓↓↓
---------------------------------------------------------------------------------------------
作業
before
無法紀錄
after
按w可以紀錄
增加程式碼
按第一次 w 儲存原始動作,第二次 w 儲存更改後的動作
到notepad++複製貼上動作紀錄然後儲存
按 t 或 p 可以撥放剛剛紀錄的動作
程式碼↓↓↓↓↓
#include <stdio.h>///NOW1 for fprintf() FILE * fout=NULL;///NOW1 for fopen() + fprintf() FILE * fin =NULL;///NOW2 for fopen() + fscanf() #include <GL/glut.h> #include "glm.h" GLMmodel* pmodel = NULL; GLMmodel* pmodel2 = NULL; GLMmodel* pmodel21 = NULL; GLMmodel* pmodel3 = NULL; GLMmodel* pmodel31 = NULL; GLMmodel* pmodel4 = NULL; GLMmodel* pmodel41 = NULL; GLMmodel* pmodel5 = NULL; GLMmodel* pmodel51 = NULL; 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 }; float angle[20];///NOW1 float oldAngle[20];///NOW4 float newAngle[20];///NOW4 int angleID=1; void display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///身體 glPushMatrix(); glTranslatef(0, 0.3,0 ); glScalef(0.5,0.5,0.5); if (!pmodel) { pmodel = glmReadOBJ("data/06160451.obj"); if (!pmodel) exit(0); glmUnitize(pmodel); glmFacetNormals(pmodel); glmVertexNormals(pmodel, 90.0); } glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL); ///右上臂 glPushMatrix(); glTranslatef(0.45,0.3,0 ); glScalef(0.5,0.5,0.5); glRotatef(angle[1], 0,0,1); glTranslatef(0,-0.7, 0); if (!pmodel2) { pmodel2 = glmReadOBJ("data/123.obj"); if (!pmodel2) exit(0); glmUnitize(pmodel2); glmFacetNormals(pmodel2); glmVertexNormals(pmodel2, 90.0); } glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL); glPushMatrix(); glTranslatef(0,-1.1,0 ); glScalef(1,1,1); glRotatef(angle[2], 0,0,1); glTranslatef(0,-0.7, 0); if (!pmodel2) { pmodel2 = glmReadOBJ("data/123.obj"); if (!pmodel2) exit(0); glmUnitize(pmodel2); glmFacetNormals(pmodel2); glmVertexNormals(pmodel2, 90.0); } glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL); glPopMatrix(); glPopMatrix(); glPushMatrix(); glTranslatef(-0.45,0.3,0 ); glScalef(0.5,0.5,0.5); glRotatef(angle[3], 0,0,1); glTranslatef(0,-0.7, 0); if (!pmodel2) { pmodel2 = glmReadOBJ("data/123.obj"); if (!pmodel2) exit(0); glmUnitize(pmodel2); glmFacetNormals(pmodel2); glmVertexNormals(pmodel2, 90.0); } glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL); glPushMatrix(); glTranslatef(0,-1.1,0 ); glScalef(1,1,1); glRotatef(angle[4], 0,0,1); glTranslatef(0,-0.7, 0); if (!pmodel2) { pmodel2 = glmReadOBJ("data/123.obj"); if (!pmodel2) exit(0); glmUnitize(pmodel2); glmFacetNormals(pmodel2); glmVertexNormals(pmodel2, 90.0); } glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL); glPopMatrix(); glPopMatrix(); glPushMatrix(); glTranslatef(0.2,-1.05,0 ); glScalef(0.5,0.5,0.5); glRotatef(angle[5], 0,0,1); glTranslatef(0,-0.7, 0); if (!pmodel2) { pmodel2 = glmReadOBJ("data/123.obj"); if (!pmodel2) exit(0); glmUnitize(pmodel2); glmFacetNormals(pmodel2); glmVertexNormals(pmodel2, 90.0); } glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL); glPushMatrix(); glTranslatef(0,-1.2,0 ); glScalef(1,1,1); glRotatef(angle[6], 0,0,1); glTranslatef(0,-0.7, 0); if (!pmodel2) { pmodel2 = glmReadOBJ("data/123.obj"); if (!pmodel2) exit(0); glmUnitize(pmodel2); glmFacetNormals(pmodel2); glmVertexNormals(pmodel2, 90.0); } glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL); glPopMatrix(); glPopMatrix(); glPushMatrix(); glTranslatef(-0.2,-1.05,0 ); glScalef(0.5,0.5,0.5); glRotatef(angle[7], 0,0,1); glTranslatef(0,-0.7, 0); if (!pmodel2) { pmodel2 = glmReadOBJ("data/123.obj"); if (!pmodel2) exit(0); glmUnitize(pmodel2); glmFacetNormals(pmodel2); glmVertexNormals(pmodel2, 90.0); } glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL); glPushMatrix(); glTranslatef(0,-1.2,0 ); glScalef(1,1,1); glRotatef(angle[8], 0,0,1); glTranslatef(0,-0.7, 0); if (!pmodel2) { pmodel2 = glmReadOBJ("data/123.obj"); if (!pmodel2) exit(0); glmUnitize(pmodel2); glmFacetNormals(pmodel2); glmVertexNormals(pmodel2, 90.0); } glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL); glPopMatrix(); glPopMatrix(); glPopMatrix(); glutSwapBuffers(); } int oldX=0; void mouse(int button, int state, int x, int y)///NOW2 { oldX = x; } #include <stdio.h> void motion(int x, int y) { angle[angleID] += x-oldX; oldX = x; for(int i=0;i<20;i++){ printf(" %.2f ", angle[i]); } printf("\n"); display(); } void timer(int t)///NOW3 { glutTimerFunc(33, timer, t+1);///NOW3 ///NOW4 快一點 if(t%30==0){///NOW4 每 30frame要讀新資料 if(fin==NULL) fin=fopen("motion.txt", "r");///NOW3 for(int i=0; i<20; i++){///NOW3 oldAngle[i] = newAngle[i]; ///NOW4 fscanf(fin, "%f", &newAngle[i]);///NOW4 新資料 } } float alpha = (t%30)/30.0;///NOW4 今天第1節有寫過它,內插 for(int i=0;i<20;i++){///NOW4 angle[i] = alpha*newAngle[i] + (1-alpha)*oldAngle[i];///NOW4 } glutPostRedisplay();///NOW4 } void keyboard(unsigned char key, int x, int y) { 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=='w'){///NOW1 if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW1 for(int i=0; i<20; i++){///NOW1 fprintf(fout, "%.1f ", angle[i]);///NOW1 }///NOW1 fprintf(fout, "\n");///NOW1 } if(key=='r'){///NOW2 if(fin==NULL) fin=fopen("motion.txt", "r");///NOW2 for(int i=0; i<20; i++){///NOW2 fscanf(fin, "%f", &angle[i]);///NOW2 } } if(key=='t' || key=='p'){///NOW3 ///啟動timer 或是 play glutTimerFunc(33, timer, 0);///NOW3 ///NOW4 變快了 if(fin==NULL) fin=fopen("motion.txt", "r");///NOW3 for(int i=0; i<20; i++){///NOW3 fscanf(fin, "%f", &newAngle[i]);///NOW3 ///NOW4 新角度 } } glutPostRedisplay();///NOW2 請讀到angle[i]之後, 重畫畫面 } int main(int argc,char**argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH); glutCreateWindow("Week06"); glutDisplayFunc(display); glutIdleFunc(display); glClearColor(1,1,1,1); 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); glutKeyboardFunc(keyboard);///NOW3 glutMouseFunc(mouse);///NOW2 glutMotionFunc(motion);///NOW2 glutDisplayFunc(display); glutMainLoop(); }
執行結果↓↓↓↓↓
沒有留言:
張貼留言