week03
#week03_mouse
0. 桌面安裝 freeglut , 把 lib 的 libfreeglut.a 複製成 libglut32.a
1. File-New-Project , GLUT 專案 week03_mouse (檔案位置:桌面) ,GLUT目錄(桌面/freeglut 複製上去)
2. 貼上10行程式碼(github)
3. 加三行新的 mouse
4. 新增一行程式碼 printf("%d %d %d %d\n", button, state, x, y);
button 代表 滑鼠按鍵 (0左 1中 2右)
state 滑鼠鍵按下去 & 起來
x y 代表座標
1. 請到 https://jsyeh.org/3dcg10 下載課本範例 data 及 win32 兩個檔案
2. windows.zip 解壓縮 => data.zip點開 => 將data資料夾複製到windows裡
3. 點開 Transformation.exe
1. File-New-Project , GLUT 專案 week03_mouse_glTranslatef
2. 複製程式碼 46 49 54 行
執行畫面:滑鼠點哪 茶壺就到哪
#轉動 (安培右手定則)
粉色代表轉動的角度
橘色代表X軸
黃色代表Y軸
藍色代表Z軸
當X軸等於1.00時 大拇指朝X軸正向擺(朝右) 剩下四肢手指頭朝下轉動
當Y軸等於1.00時 大拇指朝Y軸正向擺(朝上) 剩下四肢手指頭朝右轉動
當Z軸等於1.00時 大拇指朝Z軸正向擺(朝自己) 剩下四肢手指頭朝下轉動
1. File-New-Project , GLUT 專案 week03_mouse_glRotatef
2.把week03_mouse_Translatef 的程式拿來用
3.轉動
#week03_mouse_translate_rotate
1.#include <GL/glut.h>
#include <stdio.h> ///為了printf()
void mouse(int button, int state, int x, int y)
{
///printf("Hello Mouse!\n");
///printf("%d %d %d %d\n",button,state,x,y);
if(state==GLUT_DOWN)
printf("glVertex2f((%d-150)/150.0),(-(%d-150)/150.0);\n",x,y);
}
void display()
{
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03_mouse");
glutDisplayFunc(display);
glutMouseFunc(mouse);///註冊mouse函式
glutMainLoop();
}
2.
#include <GL/glut.h>
#include <stdio.h> ///為了printf()
void mouse(int button, int state, int x, int y)
{
///printf("Hello Mouse!\n");
///printf("%d %d %d %d\n",button,state,x,y);
if(state==GLUT_DOWN)
printf("glVertex2f((%d-150)/150.0),(-(%d-150)/150.0);\n",x,y);
}
void display()
{
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03_mouse");
glutDisplayFunc(display);
glutMouseFunc(mouse);///註冊mouse函式
glutMainLoop();
}
3.
#include <GL/glut.h>
#include <stdio.h> ///為了printf()
void mouse(int button, int state, int x, int y)
{
///printf("Hello Mouse!\n");
///printf("%d %d %d %d\n",button,state,x,y);
if(state==GLUT_DOWN)
printf("glVertex2f((%d-150)/150.0),(-(%d-150)/150.0);\n",x,y);
}
void display()
{
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03_mouse");
glutDisplayFunc(display);
glutMouseFunc(mouse);///註冊mouse函式
glutMainLoop();
}
4.
#include <GL/glut.h>
#include <stdio.h> ///為了printf()
float teapotX =0 , teapotY = 0;
float angle =0;
int method =1;///1轉動 2移動
int oldX =0, oldY =0;///舊的座標
void mouse(int button, int state, int x, int y)
{
oldX = x;///teapotX =(x-150)/150.0 ;
oldY = y;///teapotY = -(y-150)/150.0 ;
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(teapotX, teapotY, 0);
glRotatef(angle,0,0,1);///對Z軸轉
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void motion(int x,int y)
{
if(method==1){
angle += x - oldX;
}else if(method==2){
teapotX += (x-oldX)/150.0;
teapotY -= (y-oldY)/150.0;
}
oldX = x;
oldY = y;
display();
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='e') method = 1;///轉動
if(key=='w') method = 2;///移動
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03_mouse_rotate");
glutDisplayFunc(display);
glutMouseFunc(mouse);///註冊mouse函式
glutMotionFunc(motion);///motion的細節
glutKeyboardFunc(keyboard);///按鍵
glutMainLoop();
}
沒有留言:
張貼留言