2021年5月26日 星期三

Xian筆記-Week14


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(); }





































沒有留言:

張貼留言

距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...