Week14
今天開始就先複習上週講的東西
(1)glmDraw GLM_TEXTURE
(借用老師的截圖 :)
(2) Timer
1.先備份GLUT範例的177行程式,等下會用到其中1行
2.精簡程式碼,就偷一行來

#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidSphere( 0.3, 30, 30 );///範例偷這一行來
/// 半徑 經度 緯度
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow(" Week14 timer ");
glutDisplayFunc(display);
glutMainLoop();
}
3.Void timer(int t) ///等多久後,執行你要做的事情
(以此程式當範例, 等3秒後背景變紅色)
#include <GL/glut.h>
///display()函式, 其實 display 是函式指標
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glutSolidSphere( 0.3, 30, 30 ); ///範例偷這一行來
/// 半徑,縱切,橫切
glutWireSphere( 0.3, 30, 30); ///網格
glutSwapBuffers();
}
void timer(int t)
///timer響起時, 做你要做的事
{
glClearColor( 1, 0, 0, 0 );///清背景色:紅色
display();///重製畫面
}
int main(int argc, char**argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow(" Week14 timer ");
glutDisplayFunc(display);
glutTimerFunc( 3000 , timer , 0 );
/// 等多久, 函式 , int t
glutMainLoop();
}
4. 進階點 , 重複持續設定Timer(鬧鐘) , 實現Angle持續旋轉角度
第一個Timer啟動後 , 重新設定 Timer 函式 , 做你要執行的事情 , 重製畫面 。
舉個例子說明:
舉個例子說明:
早上九點鬧鐘響起床 glutTimerFunc( 3000 , timer , 0 );
賴床,重新設定新鬧鐘
void timer(int t)
///timer響起時, 做你要做的事 (鬧鐘)
{
glutTimerFunc( 300, timer, t+1 );
glClearColor( 1, 0, 0, 0 );
angle++;
display();
}
上廁所、喝水
void timer(int t)
///timer響起時, 做你要做的事 (鬧鐘)
{
glutTimerFunc( 300, timer, t+1 );
glClearColor( 1, 0, 0, 0 );
angle++;
display();
}
倒頭回去睡覺
void timer(int t)
///timer響起時, 做你要做的事 (鬧鐘)
{
glutTimerFunc( 300, timer, t+1 );
glClearColor( 1, 0, 0, 0 );
angle++;
display();
}
也可舉一反三
將等多久改小(刷新率快),Angle加大(轉得快)
20:50FPS, 30:33fps, 50:20fps, 100:10fps (設太小沒用,因為不可能)
#include <GL/glut.h>
///display()函式, 其實 display 是函式指標
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef( angle, 0, 0, 1 );
glutSolidCube( 0.3 );
glPopMatrix();
///glutWireSphere( 0.3, 30, 30); ///網格
glutSwapBuffers();
}
void timer(int t)
///timer響起時, 做你要做的事 (鬧鐘)
{
glutTimerFunc( 300, timer, t+1 ); ///起床第一件事, 先設定新鬧鐘
glClearColor( 1, 0, 0, 0 );///清背景色:紅色
angle++;
display();///重製畫面
}
int main(int argc, char**argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow(" Week14 timer ");
glutDisplayFunc(display);
glutTimerFunc( 3000 , timer , 0 );
/// 等多久, 函式 , int t
glutMainLoop();
}
(3) 繼續修改程式碼
1.老師來回旋轉(Angle變化)的方法 (我的第三個作業有自己的方式,請往前找筆記)
int diff=2;
void timer(int t)
///timer響起時, 做你要做的事 (鬧鐘)
{
glutTimerFunc( 20, timer, t+1 ); ///起床第一件事, 先設定新鬧鐘
glClearColor( 1, 0, 0, 0 );///清背景色:紅色
if( angle>90 ) diff=diff-2;
if( angle<0 ) diff=diff+2;
angle = angle+diff ;
display();///重製畫面
}
2.再做一次以前教的,手手掛在身體上轉動! (忘記了給我去找以前筆記)
#include <GL/glut.h>
///display()函式, 其實 display 是函式指標
float angle=0;
void drawArm1()
{
glPushMatrix();
glScalef(1, 0.5, 0.5);///變細長的手臂
glColor3f(0, 1, 0);///綠色的
glutSolidCube( 0.2 );///手臂
glPopMatrix();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1, 1, 1); glutSolidCube( 0.4 );///白色的身體
glPushMatrix();
glTranslatef( -0.2, 0.2, 0);///(3)掛上肩膀
glRotatef( angle, 0, 0, 1 );///(2)轉動
glTranslatef( -0.1, 0, 0);///(1)把旋轉中心(關節) 移到畫面最中心
drawArm1();///綠色的手臂
glPopMatrix();
glutSwapBuffers();
}
int diff=2;
void timer(int t)
///timer響起時, 做你要做的事 (鬧鐘)
{
glutTimerFunc( 20, timer, t+1 ); ///起床第一件事, 先設定新鬧鐘
///glClearColor( 1, 0, 0, 0 );///清背景色:紅色
if( angle>90 ) diff=diff-2;
if( angle<0 ) diff=diff+2;
angle = angle+diff ;
display();///重製畫面
}
int main(int argc, char**argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow(" Week14 timer ");
glutDisplayFunc(display);
glutTimerFunc( 3000 , timer , 0 );
/// 等多久, 函式 , int t
glutMainLoop();
}





沒有留言:
張貼留言