2022年3月21日 星期一

week05

 1.




https://jsyeh.org/3dcg10/



將data檔案移進windows裡,Transformation.exe就能打開了
用安培右手能知道東西如何轉動


2.


#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///備份矩陣
        glRotatef(180, 0, 0, 1);///轉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");
    glutDisplayFunc(display);
    glutMainLoop();
}

3.
滑鼠可控制茶壺轉動


#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度,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");
    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutMainLoop();
}

4.

#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度,0,0,1->旋轉軸
        glColor3f(1, 1, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();///還原矩陣
    glutSwapBuffers();
}
void mouse(int button, int state, int x, int y)
{///按下mouse、放開mouse
    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");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutMainLoop();
}

5.
#include <stdio.h>
#include <GL/glut.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();
}

6.




#include <stdio.h>
#include <GL/glut.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 motion(int mouseX, int mouseY)
{

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








沒有留言:

張貼留言