2022年3月21日 星期一

Xcweek05的上課筆記

 1.至https://jsyeh.org/3dcg10/下載 WIN32跟data.zip後解壓縮,並把data丟進去windows裡面。
2.至windows資料夾裡開起transformation.exe 執行他
    2.1右上角可以切換模型
 3根據修改glRotatef的數據,使他跟著座標軸選轉。(這裡採用(0,-1,0)去選轉
   是根據像安培右手定則的方式去選轉)
    3.1這裡用更特殊的座標(1,1,0)去做旋轉軸讓他轉
4加入glrotatef使茶壺旋轉

#include <GL/glut.h>
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();
        glRotatef(180, 0,0,1);
        glColor3f( 1, 1, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week05-1");
    glutDisplayFunc( display );
    glutMainLoop();
}
    4.1新增一個angle再寫一個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);
            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-1");
        glutDisplayFunc( display );
        glutMotionFunc(motion);
        glutMainLoop();

    }



    5.新增一個oldx去讓他轉
#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);
        glColor3f( 1, 1, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void mouse(int button, int state, int x, int y)
{
    oldx = x;
}
void motion(int x, int y)
{
    angle += (x-oldx);
    oldx = x;
    display();
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week05-1");
    glutDisplayFunc( display );

    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

6.複習舊的mouse事件(按下去顯示座標)
#include <GL/glut.h>
#include <stdio.h>
int N=0;
int x[1000], y[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 mouse(int button,int state, int mouseX, int mouseY)
{
    if(state==GLUT_DOWN){
        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 複習mouse");

    glutDisplayFunc( display );
    glutMouseFunc(mouse);
    glutMainLoop();
}

6-1 進階mouse事件可以劃出任意樣式 跟隨滑鼠移動尋找座標


#include <GL/glut.h>
#include <stdio.h>
int N=0;
int x[1000], y[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 mouse(int button,int state, int mouseX, int mouseY)
void motion(int mouseX, int mouseY)
{
    //if(state==GLUT_DOWN){
        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 複習mouse");

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






    








沒有留言:

張貼留言