登入facebook從社團中老師的PO文取得網址 : http://jsyeh.org/3dcg10
下載 data.zip、windows.zip、glut32.dll 三個檔案
接著將剛剛下載下來的glut32.dll複製
接著打開Shape.exe就可以看到各種繪製圖形
(1)在程式碼區塊可以透過按著滑鼠左鍵上下調整來控制顏色和位置
(1) Toggle big vertices - 切換成大頂點
(2) Toggle drawing outlines - 切換成讓圖形有外框
Toggle big vertices - 切換成大頂點(如圖用紅色框起來的部分)
Toggle drawing outlines - 切換成讓圖形有外框(如圖紅色箭頭指向的框線)
Week 03 - Part 2-1 - mouse() 滑鼠事件
先開啟一個GLUT,繪製一個茶壺,並打上等一下會用到的程式碼
#include <stdio.h>
#include <GL/glut.h>///整套GLUT外掛
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();///搭配GLUT_DOUBLE兩倍顯示
}
int main (int argc,char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);///兩個顯示參數
glutCreateWindow("Week03 Mouse");
glutDisplayFunc(display);
///glutMouseFunc(mouse);///等一下會有mouse()滑鼠事件
///glutMotionFunc(motion);///等一下會有mouse()滑鼠motion事件
glutMainLoop();
}
將mouse滑鼠事件的函式程式碼加上
#include <stdio.h>
#include <GL/glut.h>///整套GLUT外掛
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();///搭配GLUT_DOUBLE兩倍顯示
}
void mouse(int button,int state,int x,int y)
{///button:左、中、右鍵,state:按下去、彈起來,x,y:mouse的位置
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_DOUBLE | GLUT_DEPTH);///兩個顯示參數
glutCreateWindow("Week03 Mouse");
glutDisplayFunc(display);
glutMouseFunc(mouse);///mouse()滑鼠事件
///glutMotionFunc(motion);///等一下會有mouse()滑鼠motion事件
glutMainLoop();
}
下圖為執行程式碼後的截圖,由紅色框起來的部分可以得知
(1)button:左鍵為0,中鍵(滑鼠滾輪)為1,右鍵為2
(2)state:按下去為0,彈起來為1
(3)x,y:位置所在
Week 03 - Part 2-2 - 利用滑鼠點下來看頂點的程式碼
#include <stdio.h>
#include <GL/glut.h>///整套GLUT外掛
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();///搭配GLUT_DOUBLE兩倍顯示
}
void mouse(int button,int state,int x,int y)
{///button:左、中、右鍵,state:按下去、彈起來,x,y:mouse的位置
if(state==GLUT_DOWN) printf("glVertex2f(%f, %f);\n",(x-150)/150.0,(150-y)/150.0);
///如果滑鼠按下去,將頂點x,y的位置印出來
}
int main (int argc,char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);///兩個顯示參數
glutCreateWindow("Week03 Mouse");
glutDisplayFunc(display);
glutMouseFunc(mouse);///mouse()滑鼠事件
///glutMotionFunc(motion);///等一下會有mouse()滑鼠motion事件
glutMainLoop();
}
下圖為程式碼執行後的截圖,由紅色框起來的部分可得到茶壺頂點的程式碼
Week 03 - Part 3 - mouse() 滑鼠motion事件
將mouse()函示裡的程式碼刪掉或者註解掉,加上今天的重點motion()函式
#include <stdio.h>
#include <GL/glut.h>
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)
{
}
void motion(int x,int y)
{
teapotX=(x-150)/150.0; teapotY=(150-y)/150.0;///依照motion時的x,y來改teapot的座標
glutPostRedisplay();///讀3M Post便利貼,貼出來說,有空時記得要Redisplay()
}
int main (int argc,char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Week03 Mouse");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);///mouse()滑鼠motion事件
glutMainLoop();
}
下圖為程式碼執行後的截圖,可以看到茶壺的位置可以移動














沒有留言:
張貼留言