2024年3月4日 星期一

Cyuu week03

 #week03


#mouse 滑鼠

1.安裝freeglut 拉到桌面 ,改lib 內檔名為libglut32.a

2.打開Codeblocks 新增專案 week03_mouse

3.10行程式貼上

4.加上mouse 的程式

5.執行程式就會出現茶壺,點滑鼠就會有Hello World





#程式碼
#include <GL/glut.h>
#include<stdio.h>///使用GLUT外掛
 void display()
 {
     glutSolidTeapot(0.3);
     glutSwapBuffers();
 }
void mouse(int button,int state,int x, int y)
{
    printf("Hello World\n");
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03_mouse");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);

    glutMainLoop();
}


6.將 printf("Hello World\n");
  更改成 printf("%d %d %d %d\n",button,state,x,y);
  執行 就會有滑鼠位子和座標

#程式碼
#include <GL/glut.h>
#include<stdio.h>///使用GLUT外掛
 void display()
 {
     glutSolidTeapot(0.3);
     glutSwapBuffers();
 }
void mouse(int button,int state,int x, int y)
{
    printf("%d %d %d %d\n",button,state,x,y);
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03_mouse");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);

    glutMainLoop();
}










7.將 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);
執行後 就可以利用滑鼠 點出所有座標程式

#程式碼
#include <GL/glut.h>
#include<stdio.h>///使用GLUT外掛
 void display()
 {
     glutSolidTeapot(0.3);
     glutSwapBuffers();
 }
void mouse(int button,int state,int x, int y)
{
    if(state==GLUT_DOWN){
        printf("glVertex2f(%d-150)/150.0,-(%d-150)/150.0);\n",x,y);
    }
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03_mouse");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);

    glutMainLoop();
}



                                     








#glTransformation 移動程式

1.開啟網址   https://jsyeh.org/3dcg10/
2.下載 windows data 檔案  操作模型試試



3. 新增glut專案 貼上剛剛茶壺程式
4.更改程式碼
#程式碼
#include <GL/glut.h>
#include<stdio.h>///使用GLUT外掛
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)
{
    teapotX=(x-150)/150.0;
    teapotY=-(y-150)/150.0;
    }

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week03_mouse_glTranslatef");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);

    glutMainLoop();
}

5.執行程式 使茶壺跟著滑鼠移動




#Rotatef 旋轉程式
1.了解 x,y,z的旋轉方向
2.新稱專案 貼上上一個程式
3.更改程式碼
4.執行程式 使茶壺可以旋轉

#程式碼
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 mouse(int button,int state,int x, int y)
{
    teapotX=(x-150)/150.0;
    teapotY=-(y-150)/150.0;
    }
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_glTranslatef");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);

    glutMainLoop();
}









#w e 旋轉
1新稱專案 貼上上一個程式
2.更改程式碼
3.執行程式 使茶壺可以旋轉

#程式碼
#include <GL/glut.h>
#include<stdio.h>///使用GLUT外掛
float teapotX=0,teapotY=0;
float angle=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();
 }
 int method=1;
 int oldX=0,oldY=0;
void mouse(int button,int state,int x, int y)
{
    oldX=x;
    oldY=y;
    ///teapotX=(x-150)/150.0;
    ///teapotY=-(y-150)/150.0;
    }
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_glTranslatef");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);

    glutMainLoop();
}


 















沒有留言:

張貼留言