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();
}
沒有留言:
張貼留言