2018年3月9日 星期五

Week02 點線面色彩,茶壺

2018.3.9電腦圖學
一、複習上週上課的兩個主要內容OpenGL和GLUT
二、無論是OpenGL畫一個彩色三角形還是GLUT畫的六個圖案都需要很多行的代碼


GLUT
OpenGL
                 









因此今天上課老師教我們用更少的程式碼來完成同樣的工作




以下開始寫程式
     (1)打開codeblock并創建一個GLUT project,創建過程詳細見week 01


    (2)將程式碼全部刪除開始自己準備

在開始寫代碼之前我們需要對codeblock的內部文件進行一些準備工作
     (1)找到我們之前下載過得freeglut文件夾,這裡我已經放在codeblock文件夾中
              根據路徑打開codeblock文件夾找到freeglut文件夾


     (2)打開文件夾freeglut中的bin文件夾看到一個叫做freeglut.dll的拓展文件並且複製


     (3)打開我們剛開創建的GLUT project的文件夾,找到bin->debug,將freeglut.dll粘貼進去

   (4)回到剛才打開的codeblock
               
           首先輸入一個GLUT的標頭檔,這是一個以前從來沒有接觸過的標頭檔,從我們剛才的擴展文件中的調用函數,是比較高級的GLUT(OpenGL User Toolkit)

   (5)首先我們構建我們的主程式
                *這裡我們在main()中加入的程式將作業系統的參數調用進來是一個很高級的寫法,同時也可以寫成 int main(int argc, char *argv[])

     (6)那麼接下來我們測試一下系統的參數,使用系統自己的小黑視窗(win+R開啟,輸入cmd)
                我們構建一個程式:
                #include <stdio.h>
                #include <GT/glut.h>                                   //OpenGL User Toolkit
                int main(int argc, char **argv)                      //把作業系統的參數塞進來
                {
                       for(int i=0;i<argc;i++){                          //有幾個參數
                              printf("argv[%d]:%s\n",i,argv[i]);     //參數字串的值
                       }
                }
         
測試結果會如圖類似,由於拿的老師的圖來做的
   (7)那麼我們測試成功後就可以開始寫程式了,我們先來做一個在資訊界有名的茶壺
            程式碼如下:
              #include <stdio.h>
              #include <GL/glut.h>         
              void display()
             {
                   glClear(GL_COLOR_BUFFER_BIT);//6、清除畫面
                   glutSolidTeapot(0.3);                 //7、做一個大小為0.3的茶壺
                   glutSwapBuffers();                    //8、交換double buffers來顯示畫出來的畫面
             }
              int main(int argc, char **argv)
             {
                   glutInit(&argc,argv);                  //1、初始化Initialize的glut參數設定
                   glutInitDisplayMode(GLUT_DOUBLE);
                                                                     //2、顯示模式是double buffers
                   glutCreateWindow("Week02 Hello World Triangle");
                                                                     //3、建立視窗
                   glutDisplayFunc(display);          //4、顯示函式display()用來畫圖的
                   glutMainLoop();                        //5,、主要的廻圈,用來控制程式
             }

程式執行的結果如圖所示
     (8)讓我們來讓茶壺顯得不那麼單調為它添加一些色彩
                1)我們只需要在void display()函式中添加一行glColor3d(1,0,0);就可以讓茶                         壺變成紅色,其中3表示三個參數,d表示double雙精度浮點數也可以使用f單                       精度浮點數,括號中的數字範圍是0-1之間分別是紅色、綠色、和藍色,當然                         我們也可以用RGB的數字/255.0來得到0-1之間的值
                2)我們也可以用glColor3ub(255,255,0)來直接用RGB使茶壺變色
                3)茶壺可以變色我們的背景當然也可以,我們同樣在display()裡面加入一行                         程式碼即可glClearColor(R/255.0 , G/255.0 , B/255.0 , 1);

              #include <stdio.h>
              #include <GL/glut.h>         
              void display()
              {
                   glClearColor(68/255.0 , 178/255.0 , 134/255.0 , 1);//讓背景變成綠色
                   glClear(GL_COLOR_BUFFER_BIT);//6、清除畫面
                   glColor3d(1,1,0);                    //讓茶壺變成黃色
                   glutSolidTeapot(0.3);                 //7、做一個大小為0.3的茶壺
                   glutSwapBuffers();                    //8、交換double buffers來顯示畫出來的畫面
              }
              int main(int argc, char **argv)
              {
                   glutInit(&argc,argv);                  //1、初始化Initialize的glut參數設定
                   glutInitDisplayMode(GLUT_DOUBLE);
                                                                     //2、顯示模式是double buffers
                   glutCreateWindow("Week02 Hello World Triangle");
                                                                     //3、建立視窗
                   glutDisplayFunc(display);          //4、顯示函式display()用來畫圖的
                   glutMainLoop();                        //5,、主要的廻圈,用來控制程式
              }
 

三、老師還給我們展示了製作平昌冬奧會會標的第一步
#include <GL/glut.h>
void display()
{
    glClearColor(68/255.0 , 278/255.0 , 134/255.0 , 1);
    glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_POLYGON);
        glColor3ub(51,97,161);
        glVertex2f((137-400)/400.0, -(467-400)/400.0);
        glVertex2f((177-400)/400.0, -(194-400)/400.0);
        glVertex2f((243-400)/400.0, -(245-400)/400.0);
    glEnd();
    glutSwapBuffers();
}
int main(int argc,char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week02 Hello World Triangle");
    glutDisplayFunc(display);
    glutMainLoop();
}













沒有留言:

張貼留言