2020年3月24日 星期二

91013'4 Rotate


Rotate



下載 [data][win32][glut32.dll]

解壓縮後將 [data][glut32.dll]加入 [windows]



打開 [Transformation] 檔案


右鍵選擇Al


就會出現下圖
依照右手安培定則👍



x為1.0時 即為轉動軸 
轉動為垂直上下旋轉



Y為1.0時 即為轉動軸
轉動為左右水平旋轉



Z為1.0時 即為轉動軸




按照以往的方式打開GLUT檔案
加入程式碼





執行後可以得到跟著滑鼠移動的圖形





之後開始做新茶壺😋


#include <GL/glut.h>
float myAngle=0;///宣告角度變數
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);///清畫面
    glPushMatrix();
        glRotatef(myAngle,0,0,1);///對z軸做旋轉
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void motion(int x, int y)
{
    myAngle=x;///我的角度,等等拿來用
    display();///每次做動作就重新畫畫面
}
int main(int argc,char ** argv)
{
    glutInit( &argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week04");

    glutMotionFunc(motion);///加motion函式
    glutDisplayFunc(display);
    glutMainLoop();
}


和以往不同的地方是可以跟著滑鼠轉動
但是他會從按住的地方開始移動
沒辦法固定住停止的位置後, 再次增加位置
所以更改一下程式碼


#include <GL/glut.h>
float myAngle=0;///宣告角度變數
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);///清畫面
    glPushMatrix();
        glRotatef(myAngle,0,0,1);///對z軸做旋轉
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
int oldX=0;///宣告變數
void mouse(int button,int state,int x,int y)
{
    if(state==GLUT_DOWN) oldX=x;///按下後記住位置
}
void motion(int x, int y)
{
    myAngle+=(x-oldX);///移動距離增加多少度
    oldX=x;///最後新的位置變為舊位置
    display();///每次做動作就重新畫畫面
}
int main(int argc,char ** argv)
{
    glutInit( &argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week04");

    glutMotionFunc(motion);///加motion函式
    glutMouseFunc(mouse);///記得增加mouse函式
    glutDisplayFunc(display);
    glutMainLoop();
}

所以更改後
就可以在移動後停止
停止後也能繼續從原本的位置開始移動




沒有留言:

張貼留言