week03_mouse
1.桌面安裝 freeglut , 把 lib 的 libfreeglut.a 複製成 libglut32.a
2. File-New-Project , GLUT 專案 week03_mouse 記得目錄(桌面) , GLUT目錄(桌面/freeglut)
3. 貼上10行程式碼
4. 加3行 mouse
#include <GL/glut.h>
#include <stdio.h>///為了printf
void mouse (int button, int state, int x, int y)
{
printf("Hello Mouse!\n");
}
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);///(1) 註冊mouse函式
glutMainLoop();
}
#include <stdio.h>///為了printf
void mouse (int button, int state, int x, int y)
{
printf("Hello Mouse!\n");
}
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);///(1) 註冊mouse函式
glutMainLoop();
}
5. 修改第5行 printf 程式碼 , 讓他點下去變成座標
6. 會有四個顯示結果
第一個是滑鼠鍵 0=滑鼠左鍵 1=滑鼠中鍵 2=滑鼠右鍵
第二個滑鼠點下去會顯示 0 滑鼠反彈上來會顯示 1
第三個是x座標
第四個是y座標
#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);
}
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);///(1) 註冊mouse函式
glutMainLoop();
}
7. 再修改第6行程式碼 改成在小黑裡面隨意亂點會出現程式碼
#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);///(1) 註冊mouse函式
glutMainLoop();
試著了解glRoatatef(角度x,y,z)的參數
2. 將兩個檔案解壓縮 把data拉進windows裡面
4. 滑鼠右鍵點右上角模型可以改模型
5. 下面滑鼠右鍵可以還原到初始數值
6.數值轉動可以利用右手比讚來理解
7.轉動軸 , 就是讚的那個拇指 , 轉動方向 , 就是其他手指的轉動方向
8.對y軸轉 , 簡單比個讚 , 完成
9.對x軸轉 , 要把拇指向右 , 也可以轉
10.對-y軸轉 , 就是比個倒讚 , 也可以理解
week03_mouse_glTranslatef
1.新增新專案名稱week03_mouse_glTranslateef
2.修改mouse的程式碼就可以用滑鼠移動茶壺了
///程式從 week03_mouse 拿來用
#include <GL/glut.h>
#include <stdio.h>
float teapotX = 0, teapotY = 0;
void mouse (int button, int state, int x, int y)
{
teapotX = (x-150)/150.0;
teapotY = -(y-150)/150.0;
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(teapotX, teapotY, 0);
glutSolidTeapot( 0.3 );
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03_mouse");
glutDisplayFunc(display);
glutMouseFunc(mouse);///(1) 註冊mouse函式
glutMainLoop();
}
week03_mouse_glRoatef
1.File-New-Project , GLUT專案 week03_mouse_glRotatef
2.修改程式碼就能轉動茶壺了
///程式從 week03_mouse 拿來用
#include <GL/glut.h>
#include <stdio.h>
float teapotX = 0, teapotY = 0;
float angle = 0;
void mouse (int button, int state, int x, int y)
{
teapotX = (x-150)/150.0;
teapotY = -(y-150)/150.0;
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0, 0, 1);
glutSolidTeapot( 0.3 );
glPopMatrix();
glutSwapBuffers();
}
void motion(int x, int y)
{
angle = x;
display();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week03_mouse");
glutDisplayFunc(display);
glutMouseFunc(mouse);///(1) 註冊mouse函式
glutMotionFunc(motion);///(3) motion的細節
glutMainLoop();
}
week03_mouse_translate_rotate
1.File-New-Project , GLUT專案 week03_mouse_translate_rotate
2.修改程式碼案w可以移動茶壺
3.按e可以選轉茶壺
///程式從 week03_mouse 拿來用
#include <GL/glut.h>
#include <stdio.h>
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);
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");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);///按鍵
glutMainLoop();
}
沒有留言:
張貼留言