日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机图形学 实验二 OpenGL简单动画

發布時間:2023/12/31 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机图形学 实验二 OpenGL简单动画 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、 實驗目的

  • 掌握OpenGL的閑置函數
  • 掌握OpenGL的時間函數
  • 掌握OpenGL的簡單動畫功能
  • 了解OpenGL裁剪窗口、視區、顯示窗口的概念和它們之間的關系
  • 進一步掌握OpenGL基本圖元的繪制
  • 二、 實驗環境

    操作系統:Windows 10 1909版本 64位 語言開發環境:Microsoft Visual Studio 2017 程序框架:Win32 桌面應用程序。

    三、 實驗要求與內容
    實驗步驟:

  • 閑置函數的使用與簡單動畫

  • 旋轉的六邊形如圖。
  • 觀察到六邊形按照程序視窗中心點逆時針旋轉,要更改旋轉速度,可通過更改myidle()閑置函數的屬性值theta大小實現。
    2) 添加多邊形模式設置與線寬設置觀看效果

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glLineWidth(2.0);

    觀察到旋轉的多邊形變成空心線框模式。
    回到多邊形填充模式修改代碼:

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  • 在圖形中增加字符“Hello”,代碼如下
  • glColor3f(1, 0, 0);glRasterPos2i(3, 2);glutBitmapCharacter(GLUT_BITMAP_8_BY_13, 'H');glutBitmapCharacter(GLUT_BITMAP_8_BY_13, 'e');glutBitmapCharacter(GLUT_BITMAP_8_BY_13, 'l');glutBitmapCharacter(GLUT_BITMAP_8_BY_13, 'l');glutBitmapCharacter(GLUT_BITMAP_8_BY_13, 'o');

    觀察到“Hello”字符串在設定的坐標點定位顯示

  • 變色技術。
    設置全局變量 int k = 0;
    在myidle函數添加代碼
  • if (k == 1) {glColor3f(1, 0, 0);k = 0;}else {glColor3f(1, 1, 0);k = 1;} 觀察到旋轉的六邊形圖案顏色紅黃閃爍。
  • 修改代碼,使六邊形保持靜止,以六邊形中心為起點直線,終點為六邊形某一頂點,使直線繞中心點旋轉
  • glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glColor3f(1, 1, 0); glBegin(GL_POLYGON);for (int i = 0; i < n; i++) { //繪制正六邊形glVertex2f(R*cos(theta + i * 2 * PI / n), R*sin(theta + i * 2 * PI / n));} glEnd(); glBegin(GL_LINES);glColor3f(1, 1, 1);glVertex2f(0, 0);glVertex2f(R*cos(theta_line + 2 * PI / n), R*sin(theta_line + 2 * PI / n));glEnd(); glutSwapBuffers();

    效果如圖:觀察到六邊形靜止,直線單獨旋轉

    思考:要使直線保持與及其時鐘秒針拍溫和,可在myidle函數中設置Sleep(1000)延時一秒,并設置theta=+= 6*PI/180; 使得每秒轉過6°,一分鐘轉一周。

  • 時間函數的使用和簡單動畫。
  • 在主程序中:glutTimerFunc(1000, mytime, 10); 注冊閑置回調函數,每隔1000ms調用一次mytime函數
  • 編寫mytime(t)函數:
    }
  • void mytime(int t) {theta += 6*PI/180;if (theta_line >= 2 * PI) theta_line -= 2 * PI;glutPostRedisplay(); //重繪函數glutTimerFunc(1000, mytime, 10); //回調函數,1000ms后回調自身 }

    觀察到時間函數的作用效果,即每隔1000ms變換一次圖形,使直線旋轉theta度。
    3.簡單時鐘設計
    1) 在程序頭部定義系統時間變量、時分秒變量

    SYSTEMTIME timeNow; //系統時間變量 float hh, mm, ss;

    2)定義PI變量

    #define PI 3.1415926

    3)引入數學文件、時間頭文件

    #include<cmath> #include<ctime>

    4)在初始化函數中獲取系統時間,分別獲取時分秒數據。

    void init() {GetLocalTime(&timeNow); //獲取系統時間hh = timeNow.wHour;mm = timeNow.wMinute;ss = timeNow.wSecond; }

    5)繪制函數display()中計算時、分、秒,確定繪制時分秒針的起始點坐標。

    //xc,yc為時針中心點坐標//xs,ys為秒針終止點坐標//xm,ym為分針終止點坐標float xs, ys, xm, ym, xh, yh;float xc = 0, yc = 0;//Calculatexs = xc + R * cos(PI / 2.0 - ss / 60 * 2 * PI);ys = yc + R * sin(PI / 2.0 - ss / 60 * 2 * PI);xm = xc + R * cos(PI / 2.0 - (mm + ss / 60.0) / 60.0*2.0*PI);ym = yc + R * sin(PI / 2.0 - (mm + ss / 60.0) / 60.0*2.0*PI);xh = xc + (R - 5)*cos(PI / 2.0 - (hh + (mm + ss / 60.0) / 60.0) / 12.0*2.0*PI); yh = yc + (R - 5)*sin(PI / 2.0 - (hh + (mm + ss / 60.0) / 60.0) / 12.0*2.0*PI); 6)以直線方式繪制時、分、秒針。glColor3f(1, 0, 0);glBegin(GL_LINES);glVertex2f(xc, yc);glVertex2f(xs, ys);glEnd();glColor3f(1, 1, 0);glBegin(GL_LINES);glVertex2f(xc, yc);glVertex2f(xm, ym);glEnd();glColor3f(0, 1, 1);glBegin(GL_LINES);glVertex2f(xc, yc);glVertex2f(xh, yh);glEnd();

    7)繪制靜止正六邊形

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glLineWidth(2.0);glColor3f(1, 1, 1);glBegin(GL_POLYGON);for (int i = 0; i < n; i++) { //繪制正六邊形glVertex2f(R*cos(theta + i * 2 * PI / n), R*sin(theta + i * 2 * PI / n));}glEnd();

    8)在時間函數mytime(t)中設置重復獲取系統當前時間。

    void idletime(int t) {GetLocalTime(&timeNow); //獲取系統時間hh = timeNow.wHour;mm = timeNow.wMinute;ss = timeNow.wSecond;glutTimerFunc(1000, idletime, 10);glutPostRedisplay(); //重繪函數 }

    觀察到簡單時鐘的顯示,時分針秒針以時鐘的形式呈現在視區中,并以當前的時間正確顯示。
    效果圖


    完整代碼:

    總結

    以上是生活随笔為你收集整理的计算机图形学 实验二 OpenGL简单动画的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。