電腦圖學
(1)主題:計時器 Timer
TODO:在Google Chrome下載freeglut(window的mingw版)
https://www.transmissionzero.co.uk/software/freeglut-devel/ 並把他解壓縮到桌面
之後再把解壓縮的freeglut資料夾打開來,並找到lib資料夾
再把lib裡面的libfreeglut.a複製成libglut32.a)
接下來開始編寫程式碼:
首先先讓視窗變大
程式碼如下:
#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);///變大了 glutCreateWindow("week 14 timer"); glutDisplayFunc(display); glutMainLoop(); }
程式碼如下:
#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);///變大了 glutCreateWindow("week 14 timer"); glutDisplayFunc(display); glutMainLoop(); }
讓圖片可以伴隨聲音打開來
程式碼如下:
#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("fart.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(3000, timer, 0);///NOW timer!!!!
glutMainLoop();
}
可以讓茶壺自動旋轉
程式碼如下:
#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)主題:內插公式
可以讓茶壺往右移動
程式碼如下:
#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(); }
可以讓茶壺往右移動
程式碼如下:
#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)主題:動畫
(4)期末作品
沒有留言:
張貼留言