2023年3月1日 星期三

旻_Week03

(1). 技巧: 用 mouse 幫忙寫作業
(2). 主題: 移動 Translate
(3). 實作: glTranslatef(x,y,z) 配合 glPushMatrix() glPopMatrix()
(4). 問題與回覆Q&A: Blog, 作業



範例

下載data (data.zip)/win32 (windows.zip)/glut32.dll

解壓縮檔案到下載資料夾



執行今天的教學範例 Transformation.exe 
(若有閃退代表解壓縮到錯誤的資料夾)


成功開啟會看見一台藍色的車子


實作

看完教學範例要換自己實作
開啟Codeblocks/GLUT專案並使用上禮拜的程式碼改寫





先開啟上周的茶壺

#include <GL/glut.h>

void display()
{

    glutSolidTeapot(0.3);///畫出一個實心的茶壺,(小茶壺)它的大小
    glutSwapBuffers();///請GLUT把畫面swap送到顯示的地方
}
int main(int argc,char *argv[])
{///上面是特別的main()函式,有很多參數
    glutInit(&argc, argv);///把GLUT開起來
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///上面
    glutCreateWindow("GLUT Shapes");///要開式窗
    glutDisplayFunc(display);///要顯示的對應函式
    glutMainLoop();///最後用main迴圈,壓在最後面

}



 再新增一行移動程式碼
#include <GL/glut.h>

void display()
{
    glTranslatef(0.5,0,0);///只有這行還不夠   ←新增了這行但是還不夠 茶壺位置怪怪
    glutSolidTeapot(0.3);///畫出一個實心的茶壺,(小茶壺)它的大小
    glutSwapBuffers();///請GLUT把畫面swap送到顯示的地方
}
int main(int argc,char *argv[])
{///上面是特別的main()函式,有很多參數
    glutInit(&argc, argv);///把GLUT開起來
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///上面
    glutCreateWindow("GLUT Shapes");///要開視窗
    glutDisplayFunc(display);///要顯示的對應函式
    glutMainLoop();///最後用main迴圈,壓在最後面

}

↓對程式碼繼續進行修改

↓可以成功左鍵按一下,讓茶壺往右移動


#include <GL/glut.h>
float X=0,Y=0; ///利用global 變數,在函式之間傳值(大寫的)
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); ///清背景
    glPushMatrix(); ///備份矩陣
        glTranslatef( X, Y, 0);///只有這行還不夠
        glutSolidTeapot(0.3);///畫出一個實心的茶壺,(小茶壺)它的大小
    glPopMatrix();///還原矩陣

    glutSwapBuffers();///請GLUT把畫面swap送到顯示的地方
}
void mouse(int button,int state, int x, int y)///小寫的
{///請mouse函式幫忙
    X = (x-150)/150.0;
    Y = -(y-150)/150.0; /// 口訣:減一半,除一半,y負號
}
int main(int argc,char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///上面
    glutCreateWindow("08160695");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);///請mouse函式幫忙

    glutMainLoop();

}





#include <GL/glut.h>
#include <stdio.h>
float X=0,Y=0; ///利用global 變數,在函式之間傳值(大寫的)
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glBegin(GL_LINE_LOOP);
    glVertex2f(-0.420,0.640);
    glVertex2f(-0.388,0.428);
    glVertex2f(-0.140,0.044);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.080,-0.048);
    glVertex2f(-0.192,-0.408);
    glVertex2f(-0.192,-0.408);
    glVertex2f(-0.192,-0.408);
    glVertex2f(-0.152,0.520);
    glVertex2f(-0.152,0.520);
    glVertex2f(-0.152,0.520);
    glVertex2f(-0.152,0.520);
    glEnd();
    glutSwapBuffers();
}
void mouse(int button,int state, int x, int y)///小寫的
{///請mouse函式幫忙
    float X = (x-250)/250.0;
    float Y = -(y-250)/250.0; /// 口訣:減一半,除一半,y負號
    if(state==GLUT_DOWN){    ///只有按下mouse,才印出程式
        printf("   glVertex2f(%.3f,%.3f);\n", X, Y);
    }
}
int main(int argc,char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500)
    glutCreateWindow("08160695");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);///請mouse函式幫忙

    glutMainLoop();

}


沒有留言:

張貼留言