每日婆,然後忘記做week03的網誌了
這周要理解Transformation的運作方法,先去http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/ 把data,win32和glut32.dll一起下載下來並且把data解壓縮放進win32裡面,就可使用裡面的模擬器。目前可以知道對於一個人物的XYZ軸有不同的旋轉方向。且旋轉的方向是基於安培右手定則來運作。以下是這個模擬器的圖片:
這裡是利用滑鼠來控制X軸來讓圖形轉動,其中要注意的是需要先void一個角度變數以及motion,並且執行一次motion後會重畫一次。
這裡則是把圖片換成茶壺,要注意的地方是其實跟上面的差不多,但是要注意PushMatrix的備份跟PopMatrix還原。
#include <GL/glut.h> ///為了glut函式
float myAngle=0;///宣告角度變數
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);///清畫面
glPushMatrix();///備份
glRotatef(myAngle,0,0,1);///對Z軸做旋轉,所以X跟Y的軸是0
glutSolidTeapot(0.3);
glPopMatrix();///還原
glutSwapBuffers();
}
void motion(int x,int y)
{
myAngle=x;///把角度放到X
display();///做一次重劃一次
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week04 Rotate");
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMainLoop();
}
-----------------------------------------------------------以上程式碼------------------------------------------------
由於上一個程式執行後會發生一件事情-角度的直接更新會讓茶壺移動得很奇怪,所以我們在額外新增其他的程式碼來完善。而其中x-oldx的意思是說:滑鼠按下去後所產生的x減掉當初所記錄下來,最後離開滑鼠點所記錄的x,來產生新的x來進行移動。
#include <GL/glut.h> ///為了glut函式
float myAngle=0;///宣告角度變數
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);///清畫面
glPushMatrix();///備份數值
glRotatef(myAngle,0,0,1);///對Z軸做旋轉,所以X跟Y的軸是0
glutSolidTeapot(0.3);///茶壺的尺寸
glPopMatrix();///還原,防止數值疊加
glutSwapBuffers();
}
int oldx=0;///當初移動的X值
void mouse(int button,int state,int x,int y)
{
if(state==GLUT_DOWN) oldx=x;///如果按下去的話記錄當下的X值
}
void motion(int x,int y)
{
myAngle+=(x-oldx);///把更新後的角度放到myAngle
oldx=x;///把X的數值放到oldx裡面
display();///做一次重劃一次
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week04 Rotate");
glutMotionFunc(motion);
glutMouseFunc(mouse);
glutDisplayFunc(display);
glutMainLoop();
}





沒有留言:
張貼留言