2021年6月2日 星期三

Xian筆記-Week15

 Week15


1. 主題: 機器人2.0, 切換不同關節轉動,存讀檔

2. HW4 再延一週

3. 存讀檔

--------------------------------------------------------------------------

(1) 

    1.    printf / fprintf  配合 fopen



#include <stdio.h> ///printf(), fprintf() int main( int argc, char**argv ) { FILE * fout = NULL;///檔案的指標 fout output用 fout = fopen("檔名.txt", "w+" ); ///開啟檔案,使用w+模式 printf( "Hello World\n"); fprintf( fout,"Hello World\n"); }





    


    2.     更換執行目錄 (從working_dir 換成現在的目錄 " .  ") 
            做好幾次了,再來一次!!!

        先複製freeglut.dll到你的目錄裡
        打開.cbp檔 , 找到裡面的2行 working_dir

        working_dir 後面的目錄 改成 "."

        




    3.    scanf / fscanf    配合 fin

           利用 fscanf 讀取你剛剛的"檔名.txt"
           再印出在小黑,試試看




#include <stdio.h> ///printf(), fprintf() int main( int argc, char**argv ) { /// FILE * fout = NULL;///檔案的指標 fout output用 /// fout = fopen( "檔名.txt", "w+" ); ///開啟檔案,使用w+模式 ( write ) /// printf( "Hello World\n"); /// fprintf( fout,"Hello World\n"); FILE * fin = NULL; fin = fopen( "檔名.txt", "r" ); /// scanf( "%d", &n); 配 int n; /// scanf( "%f", &f); float f; /// scanf( "%c", &c); char c; /// scanf( "%s", &line); char line[100] char line[100]; fscanf( fin, "%s", line ); printf( "你讀到了字串: %s\n", line ); fscanf( fin, "%s", line ); printf( "你讀到了字串: %s\n", line ); }










-----------------------------------------------------------------------------------------

(2)    

    1.機器人2.0 上週簡化版

            display裡面 push, pop做出階層,再利用 T-R-T 去慢慢調整手臂位置

            最後利用 Timer 來改變 angle 讓我們看到手臂再轉動

        



#include <stdio.h> #include <GL/glut.h> float angle=0, diff=2; void timer(int t) ///用Timer改變angle { glutTimerFunc( 30, timer , t+1); angle += diff; if(angle>90) diff = diff-2 ; if(angle<0 ) diff = diff+2 ; glutPostRedisplay();///以前會用 display()重畫, 現在這個會比較好 } void display() { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glPushMatrix(); ///glutSolidTeapot(0.3);///身體 glPushMatrix(); glTranslatef(-0.3, 0, 0 );///(3)掛在正確的地方 glRotatef(angle, 0, 0, 1);///(2)旋轉 glTranslatef(-0.4, 0, 0 );///(1)把關節旋轉中心放到畫面中心 glutSolidTeapot(0.3);///左手 glPushMatrix(); ///glutSolidTeapot(0.3);///右手 glPopMatrix(); glPopMatrix(); glPopMatrix(); glutSwapBuffers(); } int main( int argc, char ** argv ) { glutInit( &argc, argv ); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("week15 test"); glutTimerFunc(0, timer, 0);///設第一個Timer設定動畫 glutDisplayFunc(display); glutMainLoop(); }

















    繼續做 T-R-T 




void display() { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glPushMatrix(); glutSolidTeapot(0.3);///身體 glPushMatrix(); glTranslatef(-0.3, 0, 0 );///(3)掛在正確的地方 glRotatef(angle, 0, 0, 1);///(2)旋轉 glTranslatef(-0.4, 0, 0 );///(1)把關節旋轉中心放到畫面中心 glutSolidTeapot(0.3);///左手 glPushMatrix(); glTranslatef(-0.3, 0, 0 );///(3)掛在正確的地方 glRotatef(angle, 0, 0, 1);///(2)旋轉 glTranslatef(-0.4, 0, 0 );///(1)把關節旋轉中心放到畫面中心 glutSolidTeapot(0.3);///右手 glPopMatrix(); glPopMatrix(); glPopMatrix(); glutSwapBuffers(); }










    上述是基本 T-R-T 運用
    下面要改其他東西了!!!

    2. angle 改 陣列 , 並且加入 keyboard 函式

           這樣就可以利用 keyboard 把每個關節都分開轉動了!!!



            

#include <stdio.h> #include <GL/glut.h> float angle[20]={}, diff=2; ///step02 本來只有1個角度,現在有很多個,初始為0 int angleID=0; ///step02 現在要改第幾個角度!!!!!! void timer(int t) ///用Timer改變angle { glutTimerFunc( 30, timer , t+1); angle[angleID] += diff; ///step02 if(angle[angleID]>90) diff = diff-2 ; ///step02 if(angle[angleID]<0 ) diff = diff+2 ; ///step02 glutPostRedisplay();///以前會用 display()重畫, 現在這個會比較好 } void keyboard( unsigned char key, int x, int y) ///step02 { if(key=='1') angleID=1; ///step02 if(key=='0') angleID=0; ///step02 } void display() { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glPushMatrix(); glutSolidTeapot(0.3);///身體 glPushMatrix(); glTranslatef(-0.3, 0, 0 );///(3)掛在正確的地方 glRotatef(angle[0], 0, 0, 1);///(2)旋轉 ///step02 glTranslatef(-0.4, 0, 0 );///(1)把關節旋轉中心放到畫面中心 glutSolidTeapot(0.3);///左手臂 glPushMatrix(); glTranslatef(-0.3, 0, 0 );///(3)掛在正確的地方 glRotatef(angle[1], 0, 0, 1);///(2)旋轉 ///step02 glTranslatef(-0.4, 0, 0 );///(1)把關節旋轉中心放到畫面中心 glutSolidTeapot(0.3);///左手肘 glPopMatrix(); glPopMatrix(); glPopMatrix(); glutSwapBuffers(); } int main( int argc, char ** argv ) { glutInit( &argc, argv ); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("week15 test"); glutKeyboardFunc(keyboard);///整合很多關節 會去改angleID glutTimerFunc(0, timer, 0);///設第一個Timer設定動畫 glutDisplayFunc(display); glutMainLoop(); }






















    最後自行改良!!! ///設定為一開始不動 , 按按鍵後才會動 , 按初始值鍵可以停止動作!!

#include <stdio.h> #include <GL/glut.h> float angle[20]={}, diff=2; ///step02 本來只有1個角度,現在有很多個,初始為0 int angleID=0; ///step02 現在要改第幾個角度!!!!!! void timer(int t) ///用Timer改變angle { glutTimerFunc( 30, timer , t+1); angle[angleID] += diff; ///step02 if(angle[angleID]>90) diff = diff-2 ; ///step02 if(angle[angleID]<0 ) diff = diff+2 ; ///step02 glutPostRedisplay();///以前會用 display()重畫, 現在這個會比較好 } void keyboard( unsigned char key, int x, int y) ///step02 { if(key=='1') angleID=1; ///step02 if(key=='2') angleID=2; ///step02 if(key=='3') angleID=3; if(key=='4') angleID=4; if(key=='0') angleID=0; ///全部停止 } void display() { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glPushMatrix(); glutSolidTeapot(0.3);///身體 glPushMatrix();///左手 glTranslatef(-0.3, 0, 0 );///(3)掛在正確的地方 glRotatef(angle[1], 0, 0, 1);///(2)旋轉 ///step02 glTranslatef(-0.4, 0, 0 );///(1)把關節旋轉中心放到畫面中心 glutSolidTeapot(0.3);///左手臂 glPushMatrix(); glTranslatef(-0.3, 0, 0 );///(3)掛在正確的地方 glRotatef(angle[2], 0, 0, 1);///(2)旋轉 ///step02 glTranslatef(-0.4, 0, 0 );///(1)把關節旋轉中心放到畫面中心 glutSolidTeapot(0.3);///左手肘 glPopMatrix(); glPopMatrix(); glPopMatrix(); glPushMatrix();///右手 glTranslatef(0.3, 0, 0 );///(3)掛在正確的地方 glRotatef(-angle[3], 0, 0, 1);///(2)旋轉 ///step02 glTranslatef(0.4, 0, 0 );///(1)把關節旋轉中心放到畫面中心 glutSolidTeapot(0.3);///左手臂 glPushMatrix(); glTranslatef(0.3, 0, 0 );///(3)掛在正確的地方 glRotatef(-angle[4], 0, 0, 1);///(2)旋轉 ///step02 glTranslatef(0.4, 0, 0 );///(1)把關節旋轉中心放到畫面中心 glutSolidTeapot(0.3);///左手肘 glPopMatrix(); glPopMatrix(); glutSwapBuffers(); } int main( int argc, char ** argv ) { glutInit( &argc, argv ); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("week15 test"); glutKeyboardFunc(keyboard);///整合很多關節 會去改angleID glutTimerFunc(0, timer, 0);///設第一個Timer設定動畫 glutDisplayFunc(display); glutMainLoop(); }

        













沒有留言:

張貼留言

距地表面160 Week11

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