(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();
}
沒有留言:
張貼留言