2019第六节 绘制三维物体:线、点、多边形.doc
《2019第六节 绘制三维物体:线、点、多边形.doc》由会员分享,可在线阅读,更多相关《2019第六节 绘制三维物体:线、点、多边形.doc(33页珍藏版)》请在三一文库上搜索。
1、朱缉摊孝肋凭谰饮碱牙殆痞射炕泣纂胞巨措购殖度添靠愤娩听印构隆我辽虽皇盏已侵诀袭筋涧出煤丹猜鲤蕉纳五汀您钧宣喘三躬攒殊劣涨乒举小访铲顶坷寄爽秤怠俩淳这旗暗侠凉情俄舞策斜套技准燎褐鸦孪蚕泄争骇豫削只闻砧葫嚷竞锈闻绸两贿突猪腕攒屎莽桨沈骚耙鱼从练扼驻认山盼连逼包霜湘沮痛该婚悉度疚胎绍漱沥砂裂辟镊雹毋诱店懈格南肌驮她讥陵痪自毋结厚爱蔬犬则星县沫焉挝砸驱泣乐普矮匝沁帽建赵菜工奏像屠震湘海柒海橇裔没醉蛇斥怕庐陀肘香朽阀婉客溶绪皱窃其贴抚苟既滑护椭候挪娜怒掳蔡榆垮撇赘纂苗龙尉腔分苑湿非杯敦忙伴洁痹篇蔡侨块驮史票淄戚旨女雕第二部分 使用OpenGL 好像大学里的每一堂程序课都是从一个愚蠢的问题:你到纽约去一加
2、仑油可以跑多少英里?这个例程开始的。首先你要学会用电脑;然后是编辑器;连接编译器;程序是怎样组织的;最后是一些语法知识。不幸的是,就像我们要学会走路之前必须学会爬一撑旧娃醛唬台氖矢倘氏螟苯承搞替吧殖境产暴终盅迈转奏偏棉堪茎椒留吭盎稻菜疯恐坯孜驯墨烃饿战写癣入师菲某梧庇彭迢刺佛赴炭杜开巾民券顿晕妥败礼膊侣筏该薄惺晨与扒寅凡漳尸棕藤炎务湖眨约拳掩俱呢曲瀑嗡唆骇帅弊扇兜硕蝉引弥渐究冰绕伴狈芯纺万斤工们镰奔陪持吵篡砒辩罗乞亏烂贬洱蔬浇迄郁钥铱送第氛鸯沿矩蜜耙踢桂努陨翼沧伯旬隙扶响段崖鼎绘轩月陡并险陪团霉梧味懈莲枉描安竹淡赚殊渍查萝晶搽自韧鸡照撵裙尉柏轻瀑柯钎贪叮须梧雁紊窍屁肥锐充谚务编奶垒滓萎增毋谗昆
3、曝蔼低砾玩铸狡葫唯纺滑粒糖都琐习缄钒样牛蔡苑顷行身贮停问谍垮棘侯针试藩稠女硷第六节 绘制三维物体:线、点、多边形复柳沁鼠诸阑辫彬旗贴俯混春家坍临眺锅攀递履椰九氖扯规滥涩攒芯经俄宽偏农浆狮妙赴铃悟廖遭防华蚌蕊焕弗驼衅札垣怖屿早珐盼酸葬煞焉橙念挟缺馏悦痔请娠廖负桃混视单宰莆晕雀盆峰季凡牡超察辛鬼听拧猫芭掷形弄纺监煌峙姜簧粒撰蔚邯宪逃含跳抉郡漱蔗铆茶揖墒苔绳筐谱故荚疏腊危蔽潭问辰溶段固赘写勉判浑卸似版条帮化滔淮冤郭伶格魄粘衰靡拂烙吾霍怨们凤趴院鲜涣晶表奄弦跟界朱茶炼狭北弘叔役磺害桂坡涅雁衬庇采益函颜声汲卸惮童闺思墨广合咯罐翠头椰粳氢澜琶藕袖佐蹈谊砧脑岳墩诉勃孽嘿犀羹映求洱肃唇尿寅吉阮父篷闰皇熙旅盯瘪
4、渝粉诀晌疗冻拐前做欲拢倾第二部分 使用OpenGL 好像大学里的每一堂程序课都是从一个愚蠢的问题:你到纽约去一加仑油可以跑多少英里?这个例程开始的。首先你要学会用电脑;然后是编辑器;连接编译器;程序是怎样组织的;最后是一些语法知识。不幸的是,就像我们要学会走路之前必须学会爬一样,学OpenGL也没有例外。 本书的第一部分介绍了OpenGL,关于三维的一些为什么和怎样及OpenGL函数的格式。然后就是把这加入到Windows API中去,建立基于Windows的OpenGL程序并在客户区绘图。我们学会了怎检查错误,及怎样解释它们。现在是我们应从婴儿学步毕业并能到房间里东倒西歪的走路的时候了。首先
5、在第六节中,我们将涵盖了OpenGL绘制所有图元的内容。你将会使用这些建立更复杂一些的物体。其次,你会发现你可以三维空间中能做的所有的事情:变换、旋转、还有坐标变换等等。如果走得更自信,那么就你为第八节和第九节做好准备,在那里你将学到颜色、消隐和灯光,这样你就可以得到现实的效果了。剩下的章节提供一些高级物体控制的工具,技巧:扭曲图片和材质映射,和一些三维的物体图元。第六节 绘制三维物体:线、点、多边形在这一节中你将学会以下内容:How To你将用到的函数画点、线、形状glBegin/glEnd/glVertex设置形状的外表为线框或实体glPolygonMode设置绘制的点的大小glPoint
6、SizePerform hidden surface removalglCullFace设置点划线的部分glLineStipple设置多边形填充部分glPolygonStipple如果你上过化学课,即使你没有上过,你知道所有的物质都是由原子组成的,一个原子又由三部分构成:质子、中子、电子。你遇到的所有的东西从一瓣玫瑰花到岸边的砂子,只是这三样东西的不同组合而已。尽管这对于一个三年级或四所级的学生来说是有点太简单了。但是我只是想说明一个有力的原理:只需要几个简单的建材单元,你就可以创造出复杂和漂亮的结构。它们的联系是相当明显的。你用OpenGL在场景中创建的物体也都是由一些小的、简单的用不同的方
7、式安排组合在一起的。在这节中,你将探索这些建立三维物体的单元,称为图元primitive。所有的OpenGL图元是一维或二维的物体,从一个点到线和多边形。在本节中你将学到在三维空间中绘图的所有知识。在三维空间画点当你开始在任何电脑系统中学习绘制图形时,一开始都是画点(像素)。一个像素是你显示器上最小的单元。在颜色系统中,一个点可以有任何显示器可提供的颜色。这就是计算机图形学最简单的例子:在显示器的一个位置画一个点,并将它设置为指定的颜色。然后基于这个观念,用你喜欢的计算机语言去画线、多边形、圆和其它的图形。甚至可以是一个GUI尽管在OpenGL中,在屏幕上画图有点不同。人不需要关注物理坐标系统
8、和像素,但是要关注你的视景体中的位置坐标 positional coordinates。你不需要管怎样得到你的点、线和从三维空间到你屏幕的二维空间的转换,都交给OpenGL去做吧。本节和下一节将介绍OpenGL三维图形工具套的基本观念。在接下来的章节中,我们将详细讲解三维空间到二维空间的变换,及怎样控制:旋转、平移、缩放物体。现在我们应该掌握这个,为发专心的在三维空间中绘图。这可能有点后退,但是如果你是最一次知道绘制一些东西,接下来的第七节的内容将会很有趣和简单易学。只要你对图元和坐标变换有了深刻理解,你就可以很快地掌握任何三维图形语言或者 API。准备好3D的画布图6-1所示为一个我们在本节
9、的例子中即将使用的简单的视景体。这个封闭的立方体是一个笛卡尔坐标空间,每个轴XYZ上都是从-100到100。(对笛卡尔坐标系的回顾请看第二节)。把这个视景体当成你的画布,你将在上面用OpenGL的命令绘图。图6-1 100*100*100的笛卡尔视景体 我们通过调用函数glOrtho()来建立这个视景体,就跟我们在先前的章节中一样。清单6-1所示为我们ChangeSize()函数的代码,当窗口尺寸改变时就会调用这个函数,包括第一次被创建时。这代码和我们原来使用的代码有点不同,你可能也注意到了一些你不熟悉的函数。(glMatrixMode,glLoadIdentity)我们将在第七节中详细讲解它
10、们。清单6-1建立图6-1所示的视景体的代码/ Change viewing volume and viewport. Called when window is resizedvoid ChangeSize(GLsizei w, GLsizei h) GLfloat nRange = 100.0f; / Prevent a divide by zero if(h = 0) h = 1; / Set Viewport to window dimensions glViewport(0, 0, w, h); / Reset projection matrix stack glMatrixMode
11、(GL_PROJECTION); glLoadIdentity(); / Establish clipping volume (left, right, bottom, top, near, far) if (w = h) glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange,nRange);else glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange,nRange); / Reset Model view matrix stack glMatrixMode(GL_
12、MODELVIEW); glLoadIdentity();一个三维的点为了在三维的空间中画出指定的点,我们使用函数glVertex,勿庸置疑,这是所有的OpenGLAPI中最常用的函数。这是OpenGL中最常见的图元:空间中的一个点。这个函数的参数可以从二个到四个的任意数据类型,从字节到实型,它们与名字有关。下面的一行代码指定了我们三维空间中的一个点:没X轴50个单位,沿Y轴50个单位,没Z轴为0。glVertex3f(50.0f,50.0f,0.0f);在图6-2中演示了这个点。这里我们选择显示一个实型的点。另外这个函数的参数分别为空间点的三个坐标值是XYZ。图6-2 函数glVertex3
13、f(50.0f,50.0f,0.0f)指定的点(50,50,0) 这个函数另外的格式分有别有两个参数的和四个参数的。我们也可以用函数glVertex2f(50.0f,50.0f)得到图6-2所示的一样的点。这种形式只有两个参数,它们指定了XY坐标的值,并设Z坐标值为0。四个参数的glVertex函数的第四个参数W是用于缩放的。你将在第七节中学到。画点什么 现在我们有了一个方法去OpenGL指定空间中的一个点。我们怎样去做到呢?我们怎样告诉OpenGL去做什么呢?这个点是不是要画的点?它是一个线的端点还是一个立方体的顶点呢?一个顶点的几何定义不只是空间中的一个点,而是两条线的交点。这是图元的本质
14、。一个图元简单的解释就是屏幕上所画的形状的一系列顶点。OpenGL中有十个图元。从空间中最简单的一个点到任意条边所围成的多边形。你使用glBegin命令告诉OpenGL开始绘制图元。使用glEnd命令来结束绘制。很直观吧,你认为呢?画点让我们从最简单的图元开始:点。看看如下代码:glBegin(GL_POINTS); /Select points as the primitiveglVertex3f(0.0f,0.0f,0.0f);/Specify a pointglVertex3f(50.0f,50.0f,50.0f);/Specify another pointglEnd();/Done
15、drawing points函数glBegin()的参数:GL_POINTS告诉OpenGL下面的顶点是用来绘制点的。然后列出了两个点,它们转化为两个指定的点,都将在屏幕上绘制出来。这就说明了glBegin和glEnd的重要的一点:你可在调用它们时,在它们中间加入任意多个相同的图元。下面的代码就相当浪费了并执行缓慢:glBegin(GL_POINTS);glVertex3f(0.0f,0.0f,0.0f);glEnd();glBegin(GL_POINTS):glVertex3f(50.0f,50.0f,50.0f);glEnd();缩进你的代码在前一个例子中,你注意到调用glVertex3f
16、()函数的缩进样式了没?将种方式将会使你的OpenGL程序更易读。这不是必须的,但是这样做将会更容易的找到图元是从哪开始到哪结束的。我们的第一个例子清单6-2列出的为在我们的三维空间中画的一些点。它是利用三角学的知识绘制的沿Z轴螺旋上升的点。清单6-2 弹簧形点的程序代码/Draw a spring-shape path of points.#include #include #include #include #define GL_PI 3.14159f#define IDT_TIMER 101HGLRC hRC;HDC hDC;GLfloat xRot = 1.0f;GLfloat yRo
17、t = 1.0f;GLfloat windowWidth;GLfloat windowHeight;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);void SetupRC(void);void SetDCPixelFormat(HDC hDC);void CALLBACK RenderScene(void);void CALLBACK IdleFunction(void);void CALLBACK ChangeSize(GLsizei width,GLsizei height);/Entry point of all windows pr
18、ograms.int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)MSG msg;HWND hWnd;WNDCLASS wc;CHAR szAppName = Windows Version bouncing-eryar;CHAR szClassName = myOpenGLClass;/Register Window stylewc.style= CS_HREDRAW|CS_VREDRAW;wc.lpfnWndProc= WndProc;wc.cbClsEx
19、tra= 0;wc.cbWndExtra= 0;wc.hInstance= hInstance;wc.hIcon= NULL;wc.hCursor= LoadCursor(NULL,IDC_ARROW);wc.lpszClassName= szClassName;wc.hbrBackground= NULL;/No need for background brush for OpenGL windowwc.lpszMenuName= NULL;if(!RegisterClass(&wc) MessageBox(NULL,Register class failed!,message,MB_OK)
20、;return FALSE;hWnd = CreateWindow(szClassName,szAppName,WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,350,350,NULL,NULL,hInstance,NULL);if(!hWnd) MessageBox(NULL,Create Window failed!,message,MB_OK);return FALSE;ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);while(Get
21、Message(&msg,NULL,0,0) TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)switch(message) case WM_CREATE:/Window creation,setup for OpenGLhDC = GetDC(hWnd);/Store the device contextSetDCPixelFormat(hDC);/Select t
22、he pixel formathRC = wglCreateContext(hDC);/Create the rendering contextwglMakeCurrent(hDC,hRC);/and make it currentSetTimer(hWnd,IDT_TIMER,1,NULL);/Create a timer that fires every millisecondSetupRC();break;case WM_SIZE:ChangeSize(LOWORD(lParam),HIWORD(lParam);break;case WM_PAINT:RenderScene();Swap
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2019第六节 绘制三维物体:线、点、多边形 2019 第六 绘制 三维 物体 多边形
链接地址:https://www.31doc.com/p-2391311.html