2022年3月21日 星期一

學習筆記 week05

上禮拜會移動物件了,這次我們要來試試看旋轉他。

打開transformation.exe,裡面的數值可以調整攝影機的狀態。
紅色範圍內點右鍵可以切換角色。

本週的重點是rotate。
新增一個OpenGL專案,將main.cpp的程式碼全刪掉,換成以下的:

#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();
    return 0;
}
幾乎是上週的東西,只不過重點在這裡:
加入滑鼠的程式,就可以讓茶壺隨著滑鼠選轉(目前是依照滑鼠的X數值)
有了angle,glRotatef(angle,0,0,1)這行就可以讓茶壺360轉動了。

#include <GL/glut.h>
int angle;
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();
    return 0;
}

雖然說可以360度旋轉,但是要找相對應的座標也太需要精準度了...感覺有點麻煩。不妨試試看用向量,讓轉動更順暢?

#include <GL/glut.h>
int angle, 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();
    return 0;
}

新增的變數oldX為累積量,會根據上次的位置計算出茶壺要轉動的角度。
例: X50>X100 =轉50度 X-20>X70 =轉90度

今天放學前還寫了多邊形的程式,也許是下週用的?

#include <GL/glut.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;
    }
    display();
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05_1");

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


沒有留言:

張貼留言