1. 主題: 計時器 Timer (聲音、旋轉)
1. 先載入freeglut (跟第一週一樣)
1. Google search "freeglut windows"
2. 從Transmission Zero 下載 "freeglut 3.0.0 MinGW Package"
2. 從Transmission Zero 下載 "freeglut 3.0.0 MinGW Package"
3. 解壓縮後放到桌面
4. 在lib複製一個"libfreeglut.a"命名為"libglut32.a"
5. CodeBlocks 開
6. File -> New -> Project -> GLUT Project
7. 把location改成"C:\Users\user\Desktop\freeglut"
2. 加入程式碼
3. 先做一個茶壺
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot( 0.3 );
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(500,500);///可以開大一點的window
glutCreateWindow("Week 14 Timer");
glutDisplayFunc(display);
glutMainLoop();
}
4. 下載一個wav檔
5. 把wav檔放在 freeglut 的 bin 資料夾裡
6. 先把聲音放進去 他會跟著 timer 裡的變數跑(多少秒會跑一次)
#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot( 0.3 );
glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
PlaySoundA("duck.wav", NULL, SND_ASYNC);///Now (2) ///NOW timer!!!!
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///變大了
glutCreateWindow("week 14 Timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW timer!!!! 1秒=1000 2秒=2000等等
glutMainLoop();
}
7. 設定一個函式 讓他隔1秒響一次 (還有一個變數t 記錄秒數)
#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
#include <stdio.h>///printf()
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot( 0.3 );
glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
glutTimerFunc(1000, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
printf("timer(t) 的 t是 %d\n", t);///順便印一下現在的t是多少
PlaySoundA("duck.wav", NULL, SND_ASYNC);///Now (2) ///NOW timer!!!!
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///變大了
glutCreateWindow("week 14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW timer!!!!
glutMainLoop();
}
8. 用 timer 做旋轉 (把聲音的函式改成旋轉的函式)
#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0,0,1);
glutSolidTeapot( 0.3 );
glPopMatrix();
glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
/// 1000 ms = 1 sec, 30 ms = 1/33 sec , 33 fps
glutTimerFunc(30, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
angle += 1;
glutPostRedisplay();///系統重繪畫面
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///變大了
glutCreateWindow("week 14 Timer");
glutDisplayFunc(display);
glutTimerFunc(3000, timer, 0);///NOW timer!!!!
glutMainLoop();
}
2. 主題: 內插公式
1. 用Excel來試內插公式
內插公式: ans = alpha * future + (1-alpha) *old
alpha = 你有幾個fps 就是 現在的 fps/總共fps
2. 把內插公式放到程式
#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
float angle=0;
float nowX=0;///NOW2
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
///glRotatef(angle, 0,0,1);
glTranslatef(nowX, 0, 0);///NOW2
glutSolidTeapot( 0.3 );
glPopMatrix();
glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
/// 1000 ms = 1 sec, 30 ms = 1/33 sec , 33 fps
glutTimerFunc(30, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
float alpha = (t%33) / 33.0;///NOW2 alpha 內插
nowX = alpha* 1 + (1-alpha)* -1 ;///NOW2
angle += 1;
glutPostRedisplay();///系統重繪畫面
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///變大了
glutCreateWindow("week 14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW timer!!!!
glutMainLoop();
}
3. 主題: 動畫
1. 把自己的摸型讀入
2. 按W能存動作
3. 按R能讀動作
4. 加內插公式
6. 做成動畫
4. 期末作品
沒有留言:
張貼留言