2020年4月22日 星期三

公連免費10連送17天啦!!之week9

一.轉動

畫一個紅色的方形~~~

#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///備份矩陣
        glColor3f(1,0,0);///紅色
        glScalef(0.5,0.2,0.2);///調大小
        glutSolidCube(1);///正方塊
    glPopMatrix();///還原矩陣

    glutSwapBuffers();
}
int main (int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week9");

    glutDisplayFunc(display);

    glutMainLoop();

}
運行結果如下



再畫一個黃色,並將重複的程式碼用自訂函式替代

#include <GL/glut.h>
void mycube()///用自己的函式簡化程式碼
{
    glPushMatrix();///備份矩陣
        glScalef(0.5,0.2,0.2);///調大小
        glutSolidCube(1);///正方塊
    glPopMatrix();///還原矩陣
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glColor3f(1,0,0);///紅色
        mycube();

        glTranslatef(0.4,0.1,0);
        glColor3f(1,1,0);///黃色
        mycube();
    glPopMatrix();
    glutSwapBuffers();
}
int main (int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week9");

    glutDisplayFunc(display);

    glutMainLoop();

}

運行結果



畫面中只有紅色方塊,且會以中心點旋轉

#include <GL/glut.h>
void mycube()
{
    glPushMatrix();
        glColor3f(1,0,0);
        glScalef(0.5,0.2,0.2);
        glutSolidCube(1);
    glPopMatrix();
}
float angle=0;///轉動變數
void display()
{
    glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle, 0,0,1);///轉動
        mycube();

    glPopMatrix();
    angle+=1;///角度增加
    glutSwapBuffers();
}
int main (int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week9");
    glutIdleFunc(display);///CPU有空閒(idle)時,就重畫畫面
    glutDisplayFunc(display);

    glutMainLoop();

}

運行結果




把要轉動的中心點,放到畫面中心

#include <GL/glut.h>
void mycube()
{
    glPushMatrix();
        glColor3f(1,0,0);
        glScalef(0.5,0.2,0.2);
        glutSolidCube(1);
    glPopMatrix();
}
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle, 0,0,1);
        glTranslatef(0.22,0,0);///把要轉動的中心點,放到畫面中心
        mycube();

    glPopMatrix();
    angle+=1;
    glutSwapBuffers();
}
int main (int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week9");
    glutIdleFunc(display);
    glutDisplayFunc(display);

    glutMainLoop();

}

運行結果


二.TRT轉動

由於繪圖矩陣的計算方式,單個繪圖時,是由下往上喔!!!!

#include <GL/glut.h>
void mycube()
{
    glPushMatrix();
        glColor3f(1,0,0);
        glScalef(0.5,0.2,0.2);
        glutSolidCube(1);
    glPopMatrix();
}
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(0.3,0.3,0);///3.把整個在關節處轉動的方形移到想要的位置
        glRotatef(angle, 0,0,1);///2.轉動
        glTranslatef(0.22,0,0);///1.把要轉動的中心點,放到畫面中心
        mycube();

    glPopMatrix();
    angle+=1;
    glutSwapBuffers();
}
int main (int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week9");
    glutIdleFunc(display);
    glutDisplayFunc(display);

    glutMainLoop();

}

運行結果

沒有留言:

張貼留言