程式碼:
#include<GL/glut.h>///函式庫
void display() { glColor3f(0.5,1.0,0.2); ///gl開頭 3f結尾 (3個float數字)中間color glutSolidTeapot(0.3); glutSwapBuffers(); } int main(int argc,char**argv) { glutInit(&argc,argv); ///將main()的參數放進來 glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH); ///啟動3D的顯示能力(兩倍顯示 |看3D的深度) glutCreateWindow("Week02");///3D視窗名 glutDisplayFunc(display);///用display這個func畫 glutMainLoop();///主要迴圈 }
詳細複習上周
注:上課前先把freeglut壓縮檔解壓縮並且設定完!
1.glutMouseFunc
顏色:新增的程式碼/註解
#include<GL/glut.h>///函式庫 #include<stdio.h>///為了printf void display() { glutSolidTeapot(0.3); glutSwapBuffers(); } void mouse(int button,int state,int x,int y) ///mouse函式:左中右鍵,Down/Up,X座標,y座標 { printf("%d %d %d %d\n",button,state,x,y); ///測試給你「值」 } int main(int argc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH); glutCreateWindow("Week03");///3D視窗名 glutDisplayFunc(display);///用display這個func畫
glutMouseFunc(mouse); glutMainLoop();///主要迴圈 }
成果:
2.Translatef
程式碼:
#include<GL/glut.h>///函式庫 #include<stdio.h> ///為了printf void display() { glutSolidTeapot(0.3); glutSwapBuffers(); } void mouse(int button,int state,int x,int y) ///mouse函式:左(0)中(1)右(2)鍵,Down/Up,X座標,y座標 { printf("%f %f\n",(x-150)/150.0,(y-150)/150.0); ///x:0 ~ 300 變成 -1 ~ +1 ///y:300~ 0 變成 -1 ~ +1 } int main(int argc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH); glutCreateWindow("Week03");///3D視窗名 glutDisplayFunc(display);///用display這個func畫
glutMouseFunc(mouse); glutMainLoop();///主要迴圈 }
解說:
以這個視窗的中點為中心,實際上座標為(150,150),
由於printf("%f %f\n",(x-150)/150.0,(y-150)/150.0);的關係,將我們滑鼠所點擊的位置呈現為相對位置!正題開始:程式碼:
#include<GL/glut.h>///函式庫 #include<stdio.h>///為了printf float teapotX=0,teapotY=0;///宣告目標的座標 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清上個痕跡 glPushMatrix(); ///備份矩陣 glTranslatef(teapotX,teapotY,0); ///移動 glutSolidTeapot(0.3); glPopMatrix();///備份矩陣 glutSwapBuffers(); } void mouse(int button,int state,int x,int y) ///mouse函式:左(0)中(1)右(2)鍵,Down/Up,X座標,y座標 { printf("%f %f\n",(x-150)/150.0,(y-150)/150.0); ///x:0 ~ 300 變成 -1 ~ +1 ///y:300~ 0 變成 -1 ~ +1 teapotX=(x-150)/150.0; ///更改X位置 teapotY=-(y-150)/150.0; ///更改Y位置 } int main(int argc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH); glutCreateWindow("Week03");///3D視窗名 glutDisplayFunc(display);///用display這個func畫 glutMouseFunc(mouse); glutMainLoop();///主要迴圈 }
成果:
注:為了讓teapotY的位置出現在正確的位置上,必須加負號。
例子:點的Y值為160(絕對位置)(圖一)
-(160-150)/150.0=-(10)/150.0
得到:teapotY=-0.06666...
相對於(150,150)只要Y往左移動0.0666格(圖二)
位置表示
![]() |
| 圖一 |
![]() |
| 圖二 |
3.用滑鼠來寫程式
程式碼:
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
///清背景
glBegin(GL_POLYGON);
glEnd(); glutSwapBuffers(); } void mouse(int button,int state,int x,int y) ///mouse函式:左(0)中(1)右(2)鍵,Down/Up,X座標,y座標 { if(state==GLUT_DOWN)///只判定滑鼠按下的座標 { printf(" glVertex2f( (%d-150)/150.0,-(%d-150)/150.0);\n",x,y); } }
正題:
變成
4.小畫家座標換算
透過吸管可以知道該顏色的RGB
透過鼠標位置可以知道其(X,Y)
glClearColor(240/255.0,106/255.0,53/255.0,1);///RGB 240 106 53///背景顏色
通過描點後得到結果
6.cos()sin()可畫圓
#include<GL/glut.h>///函式庫 #include<stdio.h>///為了printf #include<math.h>///為了cos和sin float teapotX=0,teapotY=0;///宣告目標的座標 void display() { glClearColor(240/255.0,106/255.0,53/255.0,1);///RGB 240 106 53///背景顏色 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清背景 glBegin(GL_POLYGON); for(float angle=0;angle<=3.1415;angle+=0.01) { glVertex2f( cos(angle),sin(angle)); } glEnd(); glutSwapBuffers(); }
結果:
透過cos和sin可以變成圓形的曲線
![]() |
| 示意圖 |























沒有留言:
張貼留言