2022年3月21日 星期一

RH的學習筆記٩(ˊᗜˋ*)و week05

1.1 先到 https://jsyeh.org/3dcg10/ 網站下載data、win32兩個壓縮檔



1.2 將兩者解壓縮後,把data丟入window資料夾裡


1.3 接著執行Transformation.exe檔案


1.4 右鍵可以更換模型


1.5 根據修改glrotatef裡的數據並利用安培右手得知模型旋轉的方向,第一個數字是選轉的角度、第二個數字是x軸、第三個數字是y軸、第四個數字是z軸



1.6 將之前黃色茶壺的程式去做改寫,將其轉180度


1.7 先新增一個變數angle,接著寫一個motion函式讀入angle,最後再設定寫一個glutMotionFunc(motion);,讓黃色茶壺根據鼠標按下的位置去做移動

#include <GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix(); ///備份矩陣
        glRotatef(angle,0,0,1); ///轉180度
        glColor3f(1,1,0);
        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_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05 Rotate");///建視窗

    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutMainLoop();

}

1.8 因為前一個程式不完整,所以再加入一些東西來做修正
先新增oldx用來記錄一個滑鼠位置,建立一個mouse函式來確認滑鼠能放開、按住,最後再設定寫入 glutMouseFunc(mouse);

#include <GL/glut.h>
float angle=0,oldx=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix(); ///備份矩陣
        glRotatef(angle,0,0,1); ///轉180度
        glColor3f(1,1,0);
        glutSolidTeapot(0.3);
    glPopMatrix();///還原矩陣
    glutSwapBuffers();
}
void mouse(int buttom,int state,int x,int y)
{
    oldx=x;
}
void motion(int x,int y)
{
    angle+=(x-oldx);
    angle=x;
    display();
}
int main(int argc,char**argv)
{///進階的內函式
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05 Rotate");///建視窗

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

}



2.1 複習上次的通過點擊畫面得到座標的程式,

#include <GL/glut.h>
#include <stdio.h>
int N=0;///一開始無頂點
int x[1000],y[1000];///最多可以有1000個頂點
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_LINE_LOOP);
    for(int i=0;i<N;i++)    ///用迴圈,畫N個頂點
    {
        glVertex2f((x[i]-150)/150.0,-(y[i]-150)/150.0);
    }        ///減一半,除一半,Y加上負號
    glEnd();
    glutSwapBuffers();
}
void mouse(int button,int state,int mouseX,int mouseY)
{
    if(state==GLUT_DOWN) ///如果按下MOUSE
    {
    N++;    ///就多一個頂點
    x[N-1]=mouseX;    ///最後一個新增的X座標
    y[N-1]=mouseY;    ///最後一個新增的Y座標 
    printf("現在按下滑鼠,得到新座標 %d %d\n",x[N-1],y[N-1]);
    }
    display();
}

int main(int argc,char**argv)
{///進階的內函式
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05 複習");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMainLoop();

}


2.1 將程式優化,使滑鼠可以按住移動,小黑上也會跟著顯現出移動座標
#include <GL/glut.h>
#include <stdio.h>
int N=0;///一開始無頂點
int x[1000],y[1000];///最多可以有1000個頂點
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_LINE_LOOP);
    for(int i=0;i<N;i++)
    {
        glVertex2f((x[i]-150)/150.0,-(y[i]-150)/150.0);
    }
    glEnd();
    glutSwapBuffers();
}
void motion(int mouseX,int mouseY)
{
    N++;
    x[N-1]=mouseX;
    y[N-1]=mouseY;
    printf("現在按下滑鼠,得到新座標 %d %d\n",x[N-1],y[N-1]);
    display();
}

int main(int argc,char**argv)
{///進階的內函式
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05 複習");
    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutMainLoop();
}




 




沒有留言:

張貼留言