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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OpenGL 基础图形绘制与投影变换

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL 基础图形绘制与投影变换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文參考《Computer Graphics Using OpenGL》,第一個例子繪制了

1. 參數定義的House

2.?a flurry of filled rectangles

3.?Sierpinski曲線

含有鼠標和鍵盤響應函數onmouse和onkeyboard。


[cpp]?view plain?copy
  • /************************************************************************/??
  • /*?CreateTime:2013-2-18?
  • **Author:@Rachel?Zhang?
  • **Discription:?Draw?Parameter?House,?Flurry?and?Sierpinski?
  • **3rd-party:OpenGL*/??
  • /************************************************************************/??
  • ??
  • #include?"GL/glut.h"??
  • #include?"stdlib.h"??
  • #include?<iostream>??
  • using?namespace?std;??
  • #define?screenHeight?480??
  • ??
  • class?GLintPoint{??
  • public:???
  • ????GLint?x,?y;??
  • };??
  • ??
  • //?Create?a?number?between?0?and?m(a?number?which?will?be?given)??
  • //?the?input?m?must?be?less?than?32767?according?to?P49?in?<Computer?Graphics?Using?OpenGL>??
  • int?random(int?m)??
  • {??
  • ????return?rand()%m;??
  • }??
  • ??
  • void?drawDot?(GLint?x,?GLint?y)??
  • {??
  • ????glPointSize(3);??
  • ????glBegin(GL_POINTS);??
  • ????glVertex2i(x,y);??
  • ????glEnd();??
  • }??
  • ??
  • typedef?struct??
  • {??
  • ????GLfloat?r,?g,?b;??
  • }?GLfloatRGBColour;??
  • ??
  • GLfloatRGBColour?colour[8]?=?{?{0.0f,?0.0f,?0.0f},?{0.0f,?0.0f,?1.0f},??
  • {0.0f,?1.0f,?0.0f},?{1.0f,?0.0f,?0.0f},??
  • {0.0f,?1.0f,?1.0f},?{1.0f,?0.0f,?1.0f},??
  • {1.0f,?1.0f,?0.0f},?{1.0f,?1.0f,?1.0f}};??
  • ??
  • void?setPenColour(GLfloatRGBColour?newColour)??
  • {??
  • ????glColor3f(newColour.r,?newColour.g,?newColour.b);??
  • }??
  • ??
  • /************************************************************************/??
  • /*????????????????????????????????Draw?Functions??????????????????????????????????????*/??
  • /************************************************************************/??
  • void?parameterizedHouse(GLintPoint?peak,?GLint?width,?GLint?height)??
  • ????//?the?top?of?house?is?at?the?peak;?the?size?of?house?is?given??
  • ????//??by?height?and?width??
  • {??
  • ????glBegin(GL_LINE_LOOP);??
  • ????glVertex2i(peak.x,?????????????peak.y);??//?draw?shell?of?house???
  • ????glVertex2i(peak.x?+?width?/?2,?peak.y?-?3?*?height?/8);??
  • ????glVertex2i(peak.x?+?width?/?2,??peak.y?-?????height);??
  • ????glVertex2i(peak.x?-?width?/?2,?peak.y?-?????height);??
  • ????glVertex2i(peak.x?-?width?/?2,?peak.y?-?3?*?height?/8);???
  • ????glEnd();??
  • }??
  • ??
  • void?drawFlurry(int?num,?int?Width,?int?Height)??
  • ????//?draw?num?random?rectangles?in?a?Width?by?Height?rectangle???
  • {??
  • ????for?(int?i?=?0;?i?<?num;?i++)???
  • ????{??
  • ????????GLint?x1?=?random(Width);???????????//?place?corner?randomly???
  • ????????GLint?y1?=?random(Height);??
  • ????????GLint?x2?=?random(Width);???????//?pick?the?size?so?it?fits???
  • ????????GLint?y2?=?random(Height);??
  • ????????GLfloat?lev?=?random(10)/10.0;??????//?random?value,?in?range?0?to?1???
  • ????????glColor3f(lev,lev,lev);?????????//?set?the?gray?level???
  • ????????glRecti(x1,?y1,?x2,?y2);????????????//?draw?the?rectangle??
  • ????}??
  • ????glFlush();??
  • }????
  • ??
  • void?drawSierpinski(GLintPoint?corner[3])??
  • {???
  • ????int?i,?index,?tcolour=0;??
  • ????GLintPoint?point;??
  • ????point?=?corner[random(3)];??
  • ????drawDot(point.x,?point.y);??
  • ??
  • ????for?(i?=?0;?i?<?1000;?i++)??
  • ????{??
  • ????????index?=?random(3);??
  • ????????point.x?=?(point.x?+?corner[index].x)/2;??
  • ????????point.y?=?(point.y?+?corner[index].y)/2;????
  • ????????tcolour?=?(++tcolour)%7;???????//?col?=?(col?+?1)?mod?7;??
  • ????????setPenColour(colour[tcolour]);??
  • ????????drawDot(point.x,?point.y);??
  • ????}??
  • }??
  • ??
  • /************************************************************************/??
  • /*?????????????????????????Mouse?Listener?and?keyboard?Listener????????????????????*/??
  • /************************************************************************/??
  • void?myMouse(int?button,?int?state,?int?x,?int?y)??
  • {??
  • ????static?GLintPoint?corners[3];??
  • ????static?int?numCorners;??
  • ??
  • ????if?(button?==?GLUT_LEFT_BUTTON?&&?state?==?GLUT_DOWN)??
  • ????{??
  • ????????corners[numCorners].x?=?x;??
  • ????????corners[numCorners].y?=?screenHeight?-?y?-?1;??
  • ????????if?(++numCorners?==?3)??
  • ????????{??
  • ????????????drawSierpinski(corners);??
  • ????????????numCorners?=?0;??
  • ????????}??
  • ????}??
  • ????else?if?(button==GLUT_RIGHT_BUTTON)??
  • ????????glClear(GL_COLOR_BUFFER_BIT);??
  • ????glFlush();??
  • }??
  • ??
  • void?onKeyBoard(unsigned?char?key,int?mousex,?int?mousey)??
  • {??
  • ????switch?(key)??
  • ????{??
  • ????case?'q':??
  • ????????exit(0);??
  • ????case?'r':??
  • ????????static?GLintPoint?corners[3];??
  • ????????for?(int?i=0;i<3;i++)??
  • ????????{??
  • ????????????corners[i].x?=?random(640);??
  • ????????????corners[i].y?=?random(screenHeight);??
  • ????????}??
  • ????????drawSierpinski(corners);??
  • ????default:??
  • ????????break;??
  • ????}??
  • }??
  • ??
  • //?Initialization???
  • void?Init(void)???????
  • {??
  • ????glClearColor(1.0,1.0,1.0,0.0);?//?Set?white?background?color??
  • ????glColor3f(0.0f,0.0f,0.0f);????//?Set?the?drawing?color??
  • ????glMatrixMode(GL_PROJECTION);??
  • ????glLoadIdentity();??
  • ????gluOrtho2D(0.0,640.0,0.0,480.0);??
  • }??
  • ??
  • void?myDisplay()??
  • {??
  • ????glClear(GL_COLOR_BUFFER_BIT);???????//clear?the?screen??
  • ????GLintPoint?Mypoint?=?{200,100};??
  • ????parameterizedHouse(Mypoint,100,100);??
  • ????drawFlurry(4,100,100);??
  • ????glFlush();??
  • }??
  • ??
  • void?main(int?argc,char?*argv[])??
  • {??
  • ????glutInit(&argc,?argv);??//?Initialize?the?toolkit??
  • ????glutInitDisplayMode(GLUT_RGB?|?GLUT_SINGLE);??//?Set?display?mode??
  • ????glutInitWindowPosition(100,?150);??//?Set?window?pozition?on?screen??
  • ????glutInitWindowSize(640,?480);??????//?Set?window?size??
  • ????glutCreateWindow("parameterizedHouse,?Flurry?and?drawSierpinski");?//?Open?the?screen?window??
  • ????glutDisplayFunc(myDisplay);?//?Register?redraw?function???
  • ????glutMouseFunc(myMouse);??
  • ????glutKeyboardFunc(onKeyBoard);??
  • ????Init();??
  • ????glutMainLoop();??//?Go?into?a?perpetual?loop??
  • }??

  • 效果圖:



    第二個例子繪制了這樣一系列圖形:


    在其中有空間投影變換,主要應用了三個函數:

    投影變換函數glViewport(), 矩陣平移函數glTranslated() 和正射投影函數?glOrtho()

    上圖實現代碼參考《計算機圖形學-用OpenGL實現第2版》:

    [cpp]?view plain?copy
  • #include?<windows.h>??//suitable?when?using?Windows?95/98/NT??
  • #include?<gl/Gl.h>??
  • #include?<gl/Glu.h>??
  • #include?<gl/glut.h>??
  • //<<<<<<<<<<<<<<<<<<<?axis?>>>>>>>>>>>>>>??
  • void?axis(double?length)??
  • {?//?draw?a?z-axis,?with?cone?at?end??
  • ????glPushMatrix();??
  • ????glBegin(GL_LINES);??
  • ????glVertex3d(0,?0,?0);?glVertex3d(0,0,length);?//?along?the?z-axis??
  • ????glEnd();??
  • ????glTranslated(0,?0,length?-0.2);???
  • ????glutWireCone(0.04,?0.2,?12,?9);??
  • ????glPopMatrix();??
  • }?????
  • //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?displayWire?>>>>>>>>>>>>>>>>>>>>>>??
  • void?displayWire(void)??
  • {??
  • ????glMatrixMode(GL_PROJECTION);?//?set?the?view?volume?shape??
  • ????glLoadIdentity();??
  • ????glOrtho(-2.0*64/48.0,?2.0*64/48.0,?-2.0,?2.0,?0.1,?100);//正射投影函數??
  • ????glMatrixMode(GL_MODELVIEW);?//?position?and?aim?the?camera??
  • ????glLoadIdentity();??
  • ????gluLookAt(2.0,?2.0,?2.0,?0.0,?0.0,?0.0,?0.0,?1.0,?0.0);//define?viewpoint?transformation??
  • ??
  • ????//Draw?axis??
  • ????glClear(GL_COLOR_BUFFER_BIT);?//?clear?the?screen??
  • ????glColor3d(0,0,0);?//?draw?black?lines??
  • ????axis(0.5);???????????????????//?z-axis??
  • ????glPushMatrix();???
  • ????glRotated(90,?0,1.0,?0);??
  • ????axis(0.5);??????????????????//?y-axis??
  • ????glRotated(-90.0,?1,?0,?0);??
  • ????axis(0.5);??????????????????//?z-axis??
  • ????glPopMatrix();????
  • ??
  • ????//Draw?Cube??
  • ????glPushMatrix();??
  • ????glTranslated(0.5,?0.5,?0.5);?//?multiply?by?a?translation?matrix,?define?center?(0.5,?0.5,?0.5)??
  • ????glutWireCube(1.0);??
  • ????glPopMatrix();??
  • ??
  • ????//Draw?Sphere??
  • ????glPushMatrix();???
  • ????glTranslated(1.0,1.0,0);????//?sphere?at?(1,1,0)??
  • ????glutWireSphere(0.25,?10,?8);??
  • ????glPopMatrix();????
  • ??
  • ????//Draw?Cone??
  • ????glPushMatrix();???
  • ????glTranslated(1.0,0,1.0);????//?cone?at?(1,0,1)??
  • ????glutWireCone(0.2,?0.5,?10,?8);??
  • ????glPopMatrix();??
  • ??
  • ????//Draw?Teapot??
  • ????glPushMatrix();??
  • ????glTranslated(1,1,1);??
  • ????glutWireTeapot(0.2);?//?teapot?at?(1,1,1)??
  • ????glPopMatrix();??
  • ??
  • ????//Draw?Torus??
  • ????glPushMatrix();??
  • ????glTranslated(0,?1.0?,0);?//?torus?at?(0,1,0)??
  • ????glRotated(90.0,?1,0,0);??
  • ????glutWireTorus(0.1,?0.3,?10,10);??
  • ????glPopMatrix();??
  • ??
  • ????//十二面體??
  • ????glPushMatrix();??
  • ????glTranslated(1.0,?0?,0);?//?dodecahedron?at?(1,0,0)??
  • ????glScaled(0.15,?0.15,?0.15);??
  • ????glutWireDodecahedron();??
  • ????glPopMatrix();??
  • ??
  • ????glPushMatrix();??
  • ????glTranslated(0,?1.0?,1.0);?//?small?cube?at?(0,1,1)??
  • ????glutWireCube(0.25);??
  • ????glPopMatrix();??
  • ??
  • ????glPushMatrix();??
  • ????glTranslated(0,?0?,1.0);?//?cylinder?at?(0,0,1)??
  • ????GLUquadricObj?*?qobj;??
  • ????qobj?=?gluNewQuadric();??
  • ????gluQuadricDrawStyle(qobj,GLU_LINE);??
  • ????gluCylinder(qobj,?0.2,?0.2,?0.4,?8,8);??
  • ????glPopMatrix();??
  • ????glFlush();??
  • }??
  • ??
  • //<<<<<<<<<<<<<<<<<<<<<<?main?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??
  • void?main(int?argc,?char?**argv)??
  • {??
  • ????glutInit(&argc,?argv);??
  • ????glutInitDisplayMode(GLUT_SINGLE?|?GLUT_RGB?);??
  • ????glutInitWindowSize(640,480);??
  • ????glutInitWindowPosition(100,?100);??
  • ????glutCreateWindow("Transformation?testbed?-?wireframes");??
  • ????glutDisplayFunc(displayWire);??
  • ????glClearColor(1.0f,?1.0f,?1.0f,0.0f);??//?background?is?white??
  • ????glViewport(0,?0,?640,?480);//投影變換函數??
  • ????glutMainLoop();??
  • }??




  • Reference:

    http://www.oocities.org/uniq_friq/c_files/openGL/1lab/dots.htm


    from:?http://blog.csdn.net/abcjennifer/article/details/8587466

    總結

    以上是生活随笔為你收集整理的OpenGL 基础图形绘制与投影变换的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 亚洲综合视频网 | www麻豆视频| 亚洲系列 | 国产视频一区二区在线 | 精品一区二区三区视频在线观看 | 免费一级欧美 | 奇米影视狠狠干 | 欧美在线精品一区 | 1000部拍拍拍18勿入免费视频 | 欧美成人免费在线观看视频 | 久久国产免费看 | 亚洲人和日本人hd | 日韩免费视频一区二区视频在线观看 | 四虎一级片 | 国产黄色片在线免费观看 | 在线亚洲自拍 | 美女交配 | 国产主播专区 | 欧美成人一区二免费视频软件 | 久久小视频 | 欧美大尺度视频 | 亚洲AV无码成人片在线观看 | a黄视频| 免费视频久久 | 成人黄色一区二区三区 | 国产大片aaa | 色婷婷yy| 在线xxxx | 青娱乐在线视频免费观看 | 国产在线视频你懂的 | 亚洲精品一级二级 | 小宵虎南在线观看 | 精品视频网站 | 日本视频在线观看免费 | 国产亚洲午夜 | 亚洲伊人精品 | 日韩免费小视频 | 97国产在线视频 | av在线资源站 | 日本高潮网站 | 成人漫画网站 | 岛国精品资源网站 | 色综合中文| av中文字 | 99精品亚洲 | 日韩一级片免费观看 | 精品一区二区三区中文字幕 | 99久久精品无免国产免费 | 人人妻人人澡人人爽久久av | 日韩在线视频看看 | 成人超碰在线 | 黄色片中国 | 国内自拍区 | 欧美裸体网站 | 欧美自拍一区 | 性色av一区二区三区在线观看 | 久久久久久久久久久久久久久久久久久 | 亚洲mv一区| 自拍偷拍在线播放 | 飘花影院伦理片 | 国产精品99一区二区三区 | 欧美毛片在线观看 | 三级av在线播放 | 一本一道久久综合狠狠老精东影业 | 最新色站 | 日韩精品高清在线观看 | 99精品视频免费观看 | 国产偷人妻精品一区二区在线 | 精品久久不卡 | 亚洲日本国产精品 | 国产综合久久久久久鬼色 | 懂色中文一区二区在线播放 | 国产精品一区一区三区 | 播放一级黄色片 | 久久久青草 | 强行糟蹋人妻hd中文字幕 | 国产伦精品一区二区三区高清版禁 | 成人午夜视频在线观看 | 久久精品国产一区二区 | 久久成人av | 天天摸日日 | 久久久久一区二区三区四区 | 精品久久中文 | 亚洲乱码国产乱码精品精 | 欧美一级免费在线观看 | 男女插插插视频 | 综合99| 伊人久久成人网 | 亚洲www久久久 | 精品午夜一区二区三区 | 午夜爽爽爽 | 亚洲精品视频在线观看视频 | 肥熟女一区二区三肥熟女 | 日韩在线国产精品 | 欧美精品一区二区三区蜜臀 | 三级全黄做爰龚玥菲在线 | 亚洲美女视频网站 | 欧美日本一区二区三区 | 欧美日韩中文国产 |