今天要跟大家介紹幾個OPEN_GL中有趣的函式,和概念.
1.MOUSE函式
2.MOTION函式
3.Transformation藍色車車旋轉概念
MOUSE函式
今天要來介紹使用滑鼠的程式碼
引用上週Week03的teapot的程式碼當基底
在其中增加一滑鼠的函式(mouse)
#include <GL/glut.h>
#include <stdio.h>
static void display(void)//顯示函示
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(0.3);//茶壺的程式碼
glutSwapBuffers();
}
void mouse(int button,int state,int x,int y)//滑鼠的程式碼
button:滑鼠按鍵判定(0:右鍵,1:左鍵,2:中鍵).
state:滑鼠狀態(0:按下,1:放開).
x,y:滑鼠x和y的位置.
{
printf("button:%d state:%d x:%d y:%d\n",button,state,x,y);
}
int main(int argc, char *argv[])//主要函式
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("08160394 teapot");
glutDisplayFunc(display);//呼叫顯示函示
glutMouseFunc(mouse);//在此呼叫mouse的函式
glutMainLoop();
}
接下來可以運用滑鼠點出點畫出多邊形
首先要更動mouse函式中的程式碼
void mouse(int button,int state,int x,int y)
{
if(state==GLUT_DOWN){
printf("glVertext3f((%d-150)/150.0,(%d-150)/150.0,0);\n",x,y);
}
}
//glVertext3f((%d-150)/150.0,(%d-150)/150.0,0);此段是在display函式中glBegin裡面的座標設定
//state==GLUT_DOWN(滑鼠狀態如果是按下的話)
再改完這個函式之後就可以跑一次
由此得到程式碼1.點擊茶壺視窗,滑鼠點擊的點會顯示在右邊
2.接著複製每個點,製作多邊形
在display函式中貼上
並加上glBegin(GL_POLYGON);開始(GL_多邊形)和glEnd();圖形結束 glBegin(GL_POLYGON);
glVertex3f((202-150)/150.0,(125-150)/150.0,0);
glVertex3f((231-150)/150.0,(131-150)/150.0,0);
glVertex3f((223-150)/150.0,(197-150)/150.0,0);
glVertex3f((182-150)/150.0,(198-150)/150.0,0);
glVertex3f((101-150)/150.0,(201-150)/150.0,0);
glVertex3f((58-150)/150.0,(166-150)/150.0,0);
glVertex3f((64-150)/150.0,(114-150)/150.0,0);
glVertex3f((107-150)/150.0,(108-150)/150.0,0);
glVertex3f((115-150)/150.0,(75-150)/150.0,0);
glVertex3f((150-150)/150.0,(78-150)/150.0,0);
glVertex3f((165-150)/150.0,(38-150)/150.0,0);
glVertex3f((188-150)/150.0,(38-150)/150.0,0);
glVertex3f((183-150)/150.0,(70-150)/150.0,0);
glVertex3f((212-150)/150.0,(71-150)/150.0,0);
glVertex3f((250-150)/150.0,(65-150)/150.0,0);
glVertex3f((277-150)/150.0,(135-150)/150.0,0);
glEnd();
就可以快速完成多邊形了!
MOTION函式
原本茶壺在視窗的正中間
由滑鼠拖移被移動到左上
float teapotX=0,teapotY=0;//首先要先把茶壺的位置重置
static void display(void)///顯示函示
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix(); //矩陣備份
glTranslatef(teapotX,teapotY,0); //照座標移動
glutSolidTeapot(0.3); //畫茶壺的程式碼
glPopMatrix(); //陣列還原
glEnd(); //結束
glutSwapBuffers();
}
void motion(int x,int y) //移動的函式
{
teapotX=(x-150)/150.0; //紀錄茶壺移動的X,Y值
teapotY=-(y-150)/150.0;
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("08160394 teapot");
glutDisplayFunc(display);
glutMotionFunc(motion);///呼叫移動的函式
glutMainLoop();
}
Transformation藍色車車旋轉蓋念
glTranslate();位置(x,y,z);
glRotatef();旋轉(四個方位)
glScalef();物件大小(x,y,z);
glBegin(...);
使用滑鼠旋轉物體
沒有留言:
張貼留言