---------------------------------------------------------------------------------
打光
1.接著到老師的網站(http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/)
下載"source.zip","data.zip","win32.zip"
2.解壓縮source.zip後,用notepad++開啟"projection.c"
3.開啟後搜尋LIGHT相關的函式
4.搜尋後將
"glEnable(GL_DEPTH_TEST);"///3D深度測試,打開Enable
"glEnable(GL_LIGHTING);"///打光1,打開Enable
"glEnable(GL_LIGHT0);"///打光2,打開Enable
"glLightfv(GL_LIGHT0, GL_POSITION, light_pos);"
貼在glutCreateWindow後,最後記得將
"GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };"
///打光3(-1表示從後面照)
在main函式前宣告
5.接著就可以執行拉
--------------------------------------------------------------------------------------------------------------------------
鍵盤輸入函式
1.在"glutMainLoop"前加入
"glutKeyboardFunc(keyboard);"
接著在main函式前加入
"void keyboard(unsigned char key ,int x,int y )
{
printf("now : %c (%d, %d)\n",key,x,y);
}"
2.如此一來,將滑鼠放在圖上,並且以鍵盤輸入,就可以知道輸入的是哪個字元,也可以得知滑鼠所在的座標
--------------------------------------------------------------------------------------------------------------------------
滑鼠輸入函式
1.在"glutMainLoop"前加入
"glutMouseFunc(mouse);"
接著在main函式前加入
"void mouse(int button,int state,int x,int y)
{
printf("%d %d (%d,%d)\n",button,state,x,y);
}"
2.如此一來,滑鼠在圖上點擊就可以知道是哪個鍵(左鍵、右鍵、滾輪),按下或是放開以及該點座標
--------------------------------------------------------------------------------------------------------------------------
用鍵盤輸入的方式旋轉物件
1.先定義全域變數
"int rotateX=0,rotateY=0,rotateZ=0;"
接著在剛剛的keyboard函式中加入
"if(key=='1'){rotateX+=5;}
if(key=='2'){rotateY+=5;}
if(key=='3'){rotateZ+=5;}
glutPostRedisplay();///這函式表示每次數入字元時都要刷新畫面,這樣物件才會不斷地轉動"
2.接著在display函式中加入
"glPushMatrix();
glRotated(rotateX,1,0,0);
glRotated(rotateY,0,1,0);
glRotated(rotateZ,0,0,1);
drawmodel();///這行是原本就有的
glPopMatrix();"
3.如此一來,
輸入1的話,物件將會以繞著X軸旋轉;
輸入2的話,物件將會以繞著Y軸旋轉;
輸入3的話,物件將會以繞著Z軸旋轉;
--------------------------------------------------------------------------------------------------------------------------
用滑鼠旋轉物件
1.首先,定義全域變數
"int oldX=0,oldY=0;"
接著在mouse函式中加入
"if(state==GLUT_DOWN)
{
oldX=x;
oldY=y;
}
"
表示當按下滑鼠時,oldX以及oldY被滑鼠所在的x、y取代掉
2.接著在主程式main裡頭,加入
"glutMotionFunc(motion);"
然後在main外頭宣告函式
"void motion(int x,int y)
{
rotateY+=oldX-x;
rotateX+=oldY-y;
oldX=x;oldY=y;
glutPostRedisplay();
}
"表示每次旋轉的角度都是滑鼠現在所在的位置減去剛按下時的那點之間的角度差
3.最後就可以執行並且旋轉拉

沒有留言:
張貼留言