2022年3月21日 星期一

你的筆記_week05


 1-1.先去下載windows.zip跟data.zip然後把data放進windows 並開啟transformation

1-2 找到下方glrotatef的選項,第一個代表旋轉度數,後面三個分別是XYZ軸,根據XYZ軸的設定會有不同的旋轉方式。

X軸正常比讚,Y軸橫著比讚,Z軸橫著朝外比讚


2-1.把上周的程式碼搬過來 並修改成顛倒的茶壺
程式碼:

#include<GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotated(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 Rotate");

    glutDisplayFunc(display);
    glutMainLoop();
}

 

 

2-2 新增angle 以及motion函式,把程式修改成可以用滑鼠調整角度
程式碼:
#include<GL/glut.h>
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotated(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 Rotate");

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



2-3增加mouse函數讓滑鼠拖完可以固定
程式碼:
#include<GL/glut.h>
float angle=0,oldX=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotated(angle,0,0,1);
        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);
    oldX=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();
}
3-1複習上週的程式碼,可以利用點擊畫面上的位置來畫出線條,並可以在小黑視窗中顯示座標點的XY位置
程式碼:
#include <GL/glut.h>
#include <stdio.h>
int N=0;
int x[100],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)
{
    //printf("%d %d %d %d\n",button,state,x,y);

    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();
}


3-2修改掉if跟motion讓執行起來可以連續畫圖
程式碼:#include <GL/glut.h>
#include <stdio.h>
int N=0;
int x[100],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 motion(int mouseX,int mouseY)
{
    //printf("%d %d %d %d\n",button,state,x,y);

//  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);
    glutMainLoop();
}









沒有留言:

張貼留言