2022年3月14日 星期一

TC*(˙Ⱉ˙ฅ​)學習日誌-week04

課堂範例

一.

1.先去老師提供的網址: https://jsyeh.org/3dcg10/,下載data和win32的檔案


2.將下載好的壓縮檔data.zip和windows.zip進行解壓縮(data和windows為解壓縮過後的檔案)


3.將壓縮好的data檔案移入windows裡面


4.點開Transformation.exe(注意data資料夾是否有放入windows資料夾裡面,這樣才能開啟視窗)


二.矩陣的備份和還原

1.建立一個GLUT檔案(記得之前freeglut裡面的檔案libglut32.a要設定好喔,否則會無法開啟),並命名為week04_translate

如果圖片每拖曳一次視窗就會移動怎麼辦?(像是設定成glTranslatef(0.3,0.2,0),每拖曳一次視窗,裡面的紅色茶壺就會往0.3,0.2,也就是右上角的方向移動耶)

#include <GL/glut.h>
 void display()
 {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glTranslatef(0.3,0.2,0);///右上角
        
        glColor3f(1,0,0);///紅色
        glutSolidTeapot(0.3);///0.3實心茶壺
    glutSwapBuffers();///交換兩倍的buffer
 }

int main(int argc,char**argv)
{///進階的main函式
    glutInit(&argc, argv);///初始化
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
    glutCreateWindow("HW2 bonus");///建立視窗

    glutDisplayFunc(display);///用來畫圖的函式

    glutMainLoop();///主要的迴圈
    return 0;
}


(可以看見明顯的移動痕跡)


可是我們不想要移動圖片,所以要進行矩陣的備份和還原喔
在開頭先設定備份矩陣glPushMatrix();
然後在結束前在放一個還原矩陣glPopMatrix();
這樣子只要移動視窗的話,茶壺也就不會亂跑了喔

#include <GL/glut.h>
 void display()
 {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///push備份矩陣
        glTranslatef(0.3,0.2,0);///右上角
        ///就不會一直偷偷移動,因為移動會累積
        glColor3f(1,0,0);///紅色
        glutSolidTeapot(0.3);///0.3實心茶壺
    glPopMatrix();///pop還原矩陣
    glutSwapBuffers();///交換兩倍的buffer
 }

int main(int argc,char**argv)
{///進階的main函式
    glutInit(&argc, argv);///初始化
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
    glutCreateWindow("HW2 bonus");///建立視窗

    glutDisplayFunc(display);///用來畫圖的函式

    glutMainLoop();///主要的迴圈
    return 0;
}


2.如果想要四個視窗都擺放茶壺要怎麼做呢?
我們要先設定茶壺茶壺的座標值(myTeapot(float x,float y)那一段),並使用備份矩陣和還原矩陣以避免茶壺亂跑
而要展示出來的茶壺(display()會印出來)
可以先設定茶壺顏色glColor3f()
然後要印出來的茶壺(x座標,y座標)ex:myTeapot(+0.5,+0.5);
寫了四個myTeapot(x,y),所以會有四個茶壺

#include <GL/glut.h>
void myTeapot(float x,float y)
{
    glPushMatrix();///push備份矩陣
        glTranslatef(x,y,0);
        glutSolidTeapot(0.3);///0.3實心茶壺
    glPopMatrix();///pop還原矩陣
}
 void display()
 {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,0,0);///紅色
    myTeapot(+0.5,+0.5);
    myTeapot(+0.5,-0.5);
    myTeapot(-0.5,-0.5);
    myTeapot(-0.5,+0.5);

    glutSwapBuffers();
 }

int main(int argc,char**argv)
{///進階的main函式
    glutInit(&argc, argv);///初始化
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
    glutCreateWindow("HW2 bonus");///建立視窗

    glutDisplayFunc(display);///用來畫圖的函式

    glutMainLoop();///主要的迴圈
    return 0;
}




三.mouse滑鼠設定

#include <GL/glut.h>
#include <stdio.h>///printf()
 void display()
 {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSwapBuffers();///交換兩倍的buffer
 }
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)
{///進階的main函式
    glutInit(&argc, argv);///初始化
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
    glutCreateWindow("week04 mouse");///建立視窗

    glutDisplayFunc(display);///用來畫圖的函式
    glutMouseFunc(mouse);///mouse滑鼠
    glutMainLoop();///主要的迴圈
    return 0;
}







#include <GL/glut.h>
#include <stdio.h>///printf()
int mouseX=0,mouseY=0;
 void display()
 {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1,1,0);///黃色的
    glPushMatrix();///口訣:減一半、除一半、y還倒過來
        glTranslatef((mouseX-150)/150.0,-(mouseY-150)/150.0,0);
        glutSolidTeapot(0.3);///茶壺
    glPopMatrix();
    glutSwapBuffers();
 }
void mouse(int button,int state,int x,int y)
{
    //printf("%d %d %d %d\n",button,state,x,y);
    mouseX=x; mouseY=y;
}
int main(int argc,char**argv)
{///進階的main函式
    glutInit(&argc, argv);///初始化
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
    glutCreateWindow("week04 mouse");///建立視窗

    glutDisplayFunc(display);///用來畫圖的函式
    glutMouseFunc(mouse);///mouse滑鼠
    glutMainLoop();///主要的迴圈
    return 0;
}

#include <GL/glut.h>
#include <stdio.h>///printf()
int mouseX=0,mouseY=0,N=0;///N個點
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)
{///進階的main函式
    glutInit(&argc, argv);///初始化
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
    glutCreateWindow("week04 mouse");///建立視窗

    glutDisplayFunc(display);///display顯示
    glutMouseFunc(mouse);///mouse滑鼠
    glutMainLoop();///主要的迴圈
    return 0;
}










沒有留言:

張貼留言