2019年5月24日 星期五

DannyLo筆記 Week14

本周主題:計時器,內插公式(補間動畫),動畫(KeyFrame)


計時器

1.先開GLUT專案

2.程式碼
#include <GL/glut.h> #include <mmsystem.h>///NOW (0)發聲音 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutSwapBuffers(); } void timer(int t)///NOW (2) { glutTimerFunc(1000, timer, 0);///NOW2 每延遲1秒 呼叫timer PlaySoundA("fart.wav", NULL, SND_ASYNC);///NOW (2) 播音檔 } 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(); }

3.旋轉茶壺
#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 一起床,馬上撥下一個鬧鐘, 時間才會準
///延遲30/1000秒 才會呼叫timer 並做加1的動作
///因為延遲 所以先轉動 才會呼叫 timer printf("現在的 timer(t)的t是: %d\n", t);///NOW3 angle = t;///NOW4 每秒跟著t轉1度 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(); }

內插公式

alpha 0.0~1.0
內插: alpha*新+(1-alpha)*舊

#include <GL/glut.h>
#include <mmsystem.h>///NOW (0)發聲音 #include <stdio.h>///NOW3 for printf() float angle=0;///NOW4 float nowX=0;///NOW5 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix();///NOW4 ///glRotatef(angle, 0, 0, 1);///NOW4 glTranslatef(nowX, 0, 0);///NOW5 glutSolidTeapot( 0.3 );///NOW4 glPopMatrix();///NOW4 glutSwapBuffers(); } void timer(int t)///NOW (2) {/// 1000 ms = 1秒, 30ms = 0.03秒 => 33*30=(大約)1000, 每1秒30fps glutTimerFunc(30, timer, t+1);///NOW4 ///NOW3 一起床,馬上撥下一個鬧鐘, 時間才會準 printf("現在的 timer(t)的t是: %d\n", t);///NOW3 float alpha = (t%30) / 30.0;///變成 alpha: 0.0 ~ 1.0 ///NOW5 t到30會再回到0 nowX = alpha*1.0 + (1-alpha)* -1.0;///NOW5 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(); }

沒有留言:

張貼留言