2022年3月14日 星期一

09163051 上課筆記 week04

1下載windows.zip 以及data.zip

        1.1到 https://jsyeh.org/3dcg10/ 05/04 examples:裡下載  "win32","data"

2.開啟Transformation.exe

        2.1解壓縮windows.zip 以及 data.zip.

        2.2把data.zip 丟到 windows 資料夾裡面.

        2.3開啟Transformation.exe.



3.用glut做茶壺

        開啟glut後 把打出下列程式碼:

    ****glPushMatrix();備份matrix.

    ****glutTranslatef(x,y,0) 每更新一次就移動一次x、y

    ****glPopMatrix(); 跳出備份之matrix.

    #include <GL/glut.h>

void display(){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glTranslatef(0.2,0.1,0);

        glColor3f(1,0,0);

        glutSolidTeapot(0.3);

    glPopMatrix();

    glutSwapBuffers();

}

int main(int argc, char *argv[]){

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week04的視窗");

    glutDisplayFunc(display);

    glutMainLoop();


    return 0;

}

     多重茶壺

把glPushMatrix() 到 glPopMatrix() 移動到 新加的void小程式裡 再把 x,y 引入glTranslatef()裡.

再把 myTeapot() 引入到 display內.


#include <GL/glut.h>

void myTeapot(float x,float y){

    glPushMatrix();

        glTranslatef(x,y,0);

        glColor3f(1,0,0);

        glutSolidTeapot(0.3);

    glPopMatrix();

}


void display(){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    myTeapot(0.5,0.4);

    myTeapot(0.5,-0.4);

    myTeapot(-0.5,-0.4);

    myTeapot(-0.5,0.4);

    glutSwapBuffers();

}


int main(int argc, char *argv[]){

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week04的視窗");

    glutDisplayFunc(display);

    glutMainLoop();


    return 0;

}

4.滑鼠事件的應用

使用下列程式碼

        ****新增一個void mouse 函數, 當呼叫時引入並輸出

                1.滑鼠的使用鍵位 button(0左鍵/1中鍵/2右鍵)

                2.鍵位的使用狀態 state(0按下,1放開)

                3.滑鼠的位置x,y

        ****glutMouseFunc(mouse) 滑鼠事件 引入mouse函數. 

                形式為  void glutMouseFunc(void (*func)(int button, int state,int x, int y));

#include <GL/glut.h>

#include <stdio.h>

void mouse(int button,int state,int x,int y){

    printf("%d %d %d %d\n",button,state,x,y);

}

void display(){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    glutSwapBuffers();

}


int main(int argc, char *argv[]){

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week04的視窗");

    glutDisplayFunc(display);

    glutMouseFunc(mouse);

    glutMainLoop();


    return 0;

}

    滑鼠事件的應用二-利用滑鼠移動茶壺

使用下列程式碼:

        ****glTranslatef((mouseX-150)/150.0,-(mouseY-150)/150.0,0); 對於translatef來說(0,0)是mouse事件內的(150,150),轉換方式即為(mouseX-150)/150.0,-(mouseY-150)/150.0

        

#include <GL/glut.h>

#include <stdio.h>

int mouseX=0,mouseY=0;

void mouse(int button,int state,int x,int y){

    mouseX =x;mouseY=y;       //將mouse事件的 x,y 引入 mouseX,mouseY內

}

void display(){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glColor3f(1,0,0);

    glPushMatrix();

        glTranslatef((mouseX-150)/150.0,-(mouseY-150)/150.0,0);

        glutSolidTeapot(0.3);

    glPopMatrix();

    glutSwapBuffers();

}


int main(int argc, char *argv[]){

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week04的視窗");

    glutDisplayFunc(display);

    glutMouseFunc(mouse);

    glutMainLoop();


    return 0;

}

        滑鼠事件的應用三-利用滑鼠畫圖



        

#include <GL/glut.h>

#include <stdio.h>

int mouseX=0,mouseY=0,N=0;

int mx[100],my[100];

void display(){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(1,1,0);

    glBegin(GL_LINE_LOOP);

        for(int i=0;i<N;i++){

            glVertex2f((mx[i]-150)/150.0,-(my[i]-150)/150.0);

        }

    glEnd();

    glutSwapBuffers();

}

void mouse(int button,int state,int x,int y){

    mouseX=x;mouseY=y;

    if(state==GLUT_DOWN){

        printf("    glVertex2f( {%d-150}/150.0,-(%d-150)/150.0 );\n",x,y);

        N++;

        mx[N-1]=x;my[N-1]=y;

    }

}

int main(int argc, char *argv[]){

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week04 mouse");

    glutDisplayFunc(display);

    glutMouseFunc(mouse);

    glutMainLoop();

    return 0;

}











沒有留言:

張貼留言