先開啟15週的程式碼
開一個新專案week16_interpolation,把15週的程式碼貼到16週的!
///新專案,刪光光,放入上週程式,改成week16,把 float angle 改成 float angle[20]
#include <stdio.h>
#include <GL/glut.h>
float angle[20]={},diff=2;///都是0的陣列 angle;///上週程式,會增加、會減少!!!
int angleID=0;///上週程式,會增加、會減少!!!
void timer(int t)///上週程式,會增加、會減少!!
{
glutTimerFunc( 30, timer, t+1 );///上週程式 設定新的timer
angle[angleID] += diff;///上週程式,會增加、會減少!!!
if(angle[angleID]>90) diff = -2;///上週程式,會增加、會減少!!!
if(angle[angleID]<0) diff = +2;///上週程式,會增加、會減少!!!
glutPostRedisplay();///上週教display();
}
void keyboard(unsigned char key, int x, int y)
{
if( key=='0') angleID=0; ///之後timer()會改變關節 angle()
if( key=='1') angleID=1;
if( key=='2') angleID=2;
if( key=='3') angleID=3;
}
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();///Step05-2
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///Step05-2
glTranslatef(-0.3,0,0);
glRotatef(angle[0], 0,0,1);//(下週Week16-1接著教) angle[0]
glTranslatef(-0.3,0,0);
glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
glPushMatrix();
glTranslatef(-0.3, 0,0);
glRotatef(angle[1], 0,0,1);//(下週Week16-1接著教) angle[1]
glTranslatef(-0.3, 0,0);
glutSolidTeapot( 0.3 );///左手肘
glPopMatrix();
glPopMatrix();///Step05-2
glPushMatrix();///Step05-2
glTranslatef(+0.3,0,0);
glRotatef(-angle[2], 0,0,1);//(下週Week16-1接著教) angle[2]
glTranslatef(+0.3,0,0);
glutSolidTeapot( 0.3 );///右手臂
glPushMatrix();///step05-3
glTranslatef(+0.3,0,0);
glRotatef(-angle[3], 0,0,1);//(下週Week16-1接著教) angle[3]...
glTranslatef(+0.3,0,0);
glutSolidTeapot( 0.3 );///右手肘
glPopMatrix();///Step05-3
glPopMatrix();///Step05-2
glPopMatrix();///Step05-2
glutSwapBuffers();
}
int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow( "week15 many angles" );
glutKeyboardFunc( keyboard );
glutDisplayFunc( display );
glutTimerFunc( 0, timer, 0);
glutMainLoop();
}///先不放貼圖, 先不放打光
///新專案,刪光光,放入上週程式,改成week16,把 float angle 改成 float angle[20]
#include <stdio.h>
#include <GL/glut.h>
float angle[20]={},diff=2;///都是0的陣列 angle;///上週程式,會增加、會減少!!!
int angleID=0;///上週程式,會增加、會減少!!!
void timer(int t)///上週程式,會增加、會減少!!
{///timer()什麼都不做
/// glutTimerFunc( 30, timer, t+1 );///上週程式 設定新的timer
}
///想要用 mouse() 及 motion() 來操作關節!!! (期末作品),第07週教過
int oldX=0, oldY=0;
void mouse( int button, int state, int x, int y)
{///mouse按下去時,記下現在的位置,冰箱門打開, 把大象放進去, 冰箱門關起來
oldX = x;
oldY = y;
}
void motion(int x, int y)
{///mouse motion時,會叫這個 motion()
angle[angleID] += x - oldX;
oldX = x;
glutPostRedisplay();///上週教display();
}
void keyboard(unsigned char key, int x, int y)
{
if( key=='0') angleID=0; ///之後timer()會改變關節 angle()
if( key=='1') angleID=1;
if( key=='2') angleID=2;
if( key=='3') angleID=3;
}
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();///Step05-2
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///Step05-2
glTranslatef(-0.3,0,0);
glRotatef(angle[0], 0,0,1);//(下週Week16-1接著教) angle[0]
glTranslatef(-0.3,0,0);
glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
glPushMatrix();
glTranslatef(-0.3, 0,0);
glRotatef(angle[1], 0,0,1);//(下週Week16-1接著教) angle[1]
glTranslatef(-0.3, 0,0);
glutSolidTeapot( 0.3 );///左手肘
glPopMatrix();
glPopMatrix();///Step05-2
glPushMatrix();///Step05-2
glTranslatef(+0.3,0,0);
glRotatef(-angle[2], 0,0,1);//(下週Week16-1接著教) angle[2]
glTranslatef(+0.3,0,0);
glutSolidTeapot( 0.3 );///右手臂
glPushMatrix();///step05-3
glTranslatef(+0.3,0,0);
glRotatef(-angle[3], 0,0,1);//(下週Week16-1接著教) angle[3]...
glTranslatef(+0.3,0,0);
glutSolidTeapot( 0.3 );///右手肘
glPopMatrix();///Step05-3
glPopMatrix();///Step05-2
glPopMatrix();///Step05-2
glutSwapBuffers();
}
int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow( "week15 many angles" );
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc( keyboard );
glutDisplayFunc( display );
glutTimerFunc( 0, timer, 0);
glutMainLoop();
}///先不放貼圖, 先不放打光
///新專案,刪光光,放入上週程式,改成week16,把 float angle 改成 float angle[20]
#include <stdio.h>
#include <GL/glut.h>
float angle[20]={},diff=2;///都是0的陣列 angle;///上週程式,會增加、會減少!!!
int angleID=0;///上週程式,會增加、會減少!!!
void timer(int t)///上週程式,會增加、會減少!!
{///timer()什麼都不做
/// glutTimerFunc( 30, timer, t+1 );///上週程式 設定新的timer
}
///想要用 mouse() 及 motion() 來操作關節!!! (期末作品),第07週教過
int oldX=0, oldY=0;
void mouse( int button, int state, int x, int y)
{///mouse按下去時,記下現在的位置,冰箱門打開, 把大象放進去, 冰箱門關起來
oldX = x;
oldY = y;
}
void motion(int x, int y)
{///mouse motion時,會叫這個 motion()
angle[angleID] += x - oldX;
oldX = x;
glutPostRedisplay();///上週教display();
}
#include <stdio.h> ///step03: 上週教的第0步 才能用 fopen() printf() fprintf()
FILE * fout = NULL;///step03: 上週教的第1步
void keyboard(unsigned char key, int x, int y)
{
if( key=='0') angleID=0; ///之後timer()會改變關節 angle[0]
if( key=='1') angleID=1; ///之後timer()會改變關節 angle[1]
if( key=='2') angleID=2; ///之後timer()會改變關節 angle[2]
if( key=='3') angleID=3; ///之後timer()會改變關節 angle[3]
if( key=='s')
{///step03: 想要存檔 Save
if(fout == NULL) fout = fopen("angle.txt", "w+");///step03 若NULL, fopen()
for(int i=0; i<20; i++) printf("%.2f", angle[i] );///step03 for迴圈印陣列
printf("\n");
for(int i=0; i<20; i++) fprintf(fout, "%.2f", angle[i] );///step03 for迴圈印陣列
fprintf(fout,"\n");
}
}
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();///Step05-2
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///Step05-2
glTranslatef(-0.3,0,0);
glRotatef(angle[0], 0,0,1);//(下週Week16-1接著教) angle[0]
glTranslatef(-0.3,0,0);
glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
glPushMatrix();
glTranslatef(-0.3, 0,0);
glRotatef(angle[1], 0,0,1);//(下週Week16-1接著教) angle[1]
glTranslatef(-0.3, 0,0);
glutSolidTeapot( 0.3 );///左手肘
glPopMatrix();
glPopMatrix();///Step05-2
glPushMatrix();///Step05-2
glTranslatef(+0.3,0,0);
glRotatef(-angle[2], 0,0,1);//(下週Week16-1接著教) angle[2]
glTranslatef(+0.3,0,0);
glutSolidTeapot( 0.3 );///右手臂
glPushMatrix();///step05-3
glTranslatef(+0.3,0,0);
glRotatef(-angle[3], 0,0,1);//(下週Week16-1接著教) angle[3]...
glTranslatef(+0.3,0,0);
glutSolidTeapot( 0.3 );///右手肘
glPopMatrix();///Step05-3
glPopMatrix();///Step05-2
glPopMatrix();///Step05-2
glutSwapBuffers();
}
int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow( "week15 many angles" );
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc( keyboard );
glutDisplayFunc( display );
glutTimerFunc( 0, timer, 0);
glutMainLoop();
}///先不放貼圖, 先不放打光
小黑窗關掉後,angle.txt才會更新! 以下實際操作,請follow me往下~~~
記事本不會更新,因為小黑窗還開著!
小黑窗關掉後,再把記事本angle.txt重開,才會更新成剛剛小黑窗的數值!
///新專案,刪光光,放入上週程式,改成week16,把 float angle 改成 float angle[20]
#include <stdio.h>
#include <GL/glut.h>
float angle[20]={},diff=2;///都是0的陣列 angle;///上週程式,會增加、會減少!!!
int angleID=0;///上週程式,會增加、會減少!!!
void timer(int t)///上週程式,會增加、會減少!!
{///timer()什麼都不做
/// glutTimerFunc( 30, timer, t+1 );///上週程式 設定新的timer
}
///想要用 mouse() 及 motion() 來操作關節!!! (期末作品),第07週教過
int oldX=0, oldY=0;
void mouse( int button, int state, int x, int y)
{///mouse按下去時,記下現在的位置,冰箱門打開, 把大象放進去, 冰箱門關起來
oldX = x;
oldY = y;
}
void motion(int x, int y)
{///mouse motion時,會叫這個 motion()
angle[angleID] += x - oldX;
oldX = x;
glutPostRedisplay();///上週教display();
}
#include <stdio.h> ///step03: 上週教的第0步 才能用 fopen() printf() fprintf()
FILE * fout = NULL;///step03: 上週教的第1步
FILE * fin = NULL;///step04: 準備讀檔的 fin input用
void keyboard(unsigned char key, int x, int y)
{
if( key=='0') angleID=0; ///之後timer()會改變關節 angle[0]
if( key=='1') angleID=1; ///之後timer()會改變關節 angle[1]
if( key=='2') angleID=2; ///之後timer()會改變關節 angle[2]
if( key=='3') angleID=3; ///之後timer()會改變關節 angle[3]
if( key=='s')
{///step03: 想要存檔 Save
if(fout == NULL) fout = fopen("angle.txt", "w+");///step03 若NULL, fopen()
for(int i=0; i<20; i++) printf("%.2f", angle[i] );///step03 for迴圈印陣列
printf("\n");
for(int i=0; i<20; i++) fprintf(fout, "%.2f", angle[i] );///step03 for迴圈印陣列
fprintf(fout,"\n");
}///你必須 fclose(fout) 或「程式關閉」後,才更新硬碟裡的 angle.txt
if( key=='r')
{///step04: read 想讀進來
if(fin == NULL) fin = fopen("angle.txt", "r");///step04 若NULL, fopen() r模
for(int i=0; i<20; i++) fscanf(fin, "%f", &angle[i]);///step04
glutPostRedisplay();///step04 重畫畫面
}
}
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();///Step05-2
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///Step05-2
glTranslatef(-0.3,0,0);
glRotatef(angle[0], 0,0,1);//(下週Week16-1接著教) angle[0]
glTranslatef(-0.3,0,0);
glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
glPushMatrix();
glTranslatef(-0.3, 0,0);
glRotatef(angle[1], 0,0,1);//(下週Week16-1接著教) angle[1]
glTranslatef(-0.3, 0,0);
glutSolidTeapot( 0.3 );///左手肘
glPopMatrix();
glPopMatrix();///Step05-2
glPushMatrix();///Step05-2
glTranslatef(+0.3,0,0);
glRotatef(-angle[2], 0,0,1);//(下週Week16-1接著教) angle[2]
glTranslatef(+0.3,0,0);
glutSolidTeapot( 0.3 );///右手臂
glPushMatrix();///step05-3
glTranslatef(+0.3,0,0);
glRotatef(-angle[3], 0,0,1);//(下週Week16-1接著教) angle[3]...
glTranslatef(+0.3,0,0);
glutSolidTeapot( 0.3 );///右手肘
glPopMatrix();///Step05-3
glPopMatrix();///Step05-2
glPopMatrix();///Step05-2
glutSwapBuffers();
}
int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow( "week15 many angles" );
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc( keyboard );
glutDisplayFunc( display );
glutTimerFunc( 0, timer, 0);
glutMainLoop();
}///先不放貼圖, 先不放打光
working dir 一樣改"."
複製貼上freeglut.dll
第一次先開小視窗,按s多存幾個動作,關掉小黑,開angle.txt(16週專案資料夾裡應該有),看有沒有更新剛剛的數值,有的話再重開小黑窗,直接按r,茶壺就會根據存的動作去動了。
多加程式碼,讓茶壺動一個關節,就可以跑出很多數值,而且不用再按"s"(想按也是可),就能自動存了!
🌟小tip:存動作時,滑鼠可以動快一點,這樣最後移動的速度會比較快,因為最後出來的動作會根據所存的速度去移動。🌟
下個步驟一樣關掉小黑,開angle.txt檢查有沒有東西,有的話再開小黑,直接按"r"就會動了!!!!這週作業就成功!!!(淚流滿面貌💧💦)
///新專案,刪光光,放入上週程式,改成week16,把 float angle 改成 float angle[20]
#include <stdio.h>
#include <GL/glut.h>
float angle[20]={},diff=2;///都是0的陣列 angle;///上週程式,會增加、會減少!!!
int angleID=0;///上週程式,會增加、會減少!!!
void timer(int t)///上週程式,會增加、會減少!!
{///timer()什麼都不做
/// glutTimerFunc( 30, timer, t+1 );///上週程式 設定新的timer
}
///想要用 mouse() 及 motion() 來操作關節!!! (期末作品),第07週教過
int oldX=0, oldY=0;
void mouse( int button, int state, int x, int y)
{///mouse按下去時,記下現在的位置,冰箱門打開, 把大象放進去, 冰箱門關起來
oldX = x;
oldY = y;
}
#include <stdio.h> ///step03: 上週教的第0步 才能用 fopen() printf() fprintf()
FILE * fout = NULL;///step03: 上週教的第1步
FILE * fin = NULL;///step04: 準備讀檔的 fin input用
void motion(int x, int y)
{///mouse motion時,會叫這個 motion()
angle[angleID] += x - oldX;
oldX = x;
glutPostRedisplay();///上週教display();
///step06 現在老師想要邊 motion 邊存檔!!!
///把剛剛 keyboard 的 if(key=='s') 的存檔, 複製到這裡
///啊,移到樓上 fout 還有 #include <stdio.h>
if(fout == NULL) fout = fopen("angle.txt", "w+");///step03 若NULL, fopen()
for(int i=0; i<20; i++) printf("%.2f ", angle[i] );///step03 for迴圈印陣列
printf("\n");
for(int i=0; i<20; i++) fprintf(fout, "%.2f ", angle[i] );///step03 for迴圈印陣列
fprintf(fout,"\n");
}
void keyboard(unsigned char key, int x, int y)
{
if( key=='0') angleID=0; ///之後timer()會改變關節 angle[0]
if( key=='1') angleID=1; ///之後timer()會改變關節 angle[1]
if( key=='2') angleID=2; ///之後timer()會改變關節 angle[2]
if( key=='3') angleID=3; ///之後timer()會改變關節 angle[3]
if( key=='s')
{///step03: 想要存檔 Save
if(fout == NULL) fout = fopen("angle.txt", "w+");///step03 若NULL, fopen()
for(int i=0; i<20; i++) printf("%.2f", angle[i] );///step03 for迴圈印陣列
printf("\n");
for(int i=0; i<20; i++) fprintf(fout, "%.2f", angle[i] );///step03 for迴圈印陣列
fprintf(fout,"\n");
}///你必須 fclose(fout) 或「程式關閉」後,才更新硬碟裡的 angle.txt
if( key=='r')
{///step04: read 想讀進來
if(fin == NULL) fin = fopen("angle.txt", "r");///step04 若NULL, fopen() r模
for(int i=0; i<20; i++) fscanf(fin, "%f", &angle[i]);///step04
glutPostRedisplay();///step04 重畫畫面
}
}
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();///Step05-2
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///Step05-2
glTranslatef(-0.3,0,0);
glRotatef(angle[0], 0,0,1);//(下週Week16-1接著教) angle[0]
glTranslatef(-0.3,0,0);
glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
glPushMatrix();
glTranslatef(-0.3, 0,0);
glRotatef(angle[1], 0,0,1);//(下週Week16-1接著教) angle[1]
glTranslatef(-0.3, 0,0);
glutSolidTeapot( 0.3 );///左手肘
glPopMatrix();
glPopMatrix();///Step05-2
glPushMatrix();///Step05-2
glTranslatef(+0.3,0,0);
glRotatef(-angle[2], 0,0,1);//(下週Week16-1接著教) angle[2]
glTranslatef(+0.3,0,0);
glutSolidTeapot( 0.3 );///右手臂
glPushMatrix();///step05-3
glTranslatef(+0.3,0,0);
glRotatef(-angle[3], 0,0,1);//(下週Week16-1接著教) angle[3]...
glTranslatef(+0.3,0,0);
glutSolidTeapot( 0.3 );///右手肘
glPopMatrix();///Step05-3
glPopMatrix();///Step05-2
glPopMatrix();///Step05-2
glutSwapBuffers();
}
int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow( "week15 many angles" );
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc( keyboard );
glutDisplayFunc( display );
glutTimerFunc( 0, timer, 0);
glutMainLoop();
}///先不放貼圖, 先不放打光














沒有留言:
張貼留言