基于OpenGL的三维图形的绘制_吴爱兰
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PSLIBLINGS|WS_CLIPCHILDREN;(2)OnCreate
为了使OpenGL能在绘图表面(窗口或位图)上绘制图象,必须先对绘图表面进行初始化,既通过对象素格式的描述(分配并填充PIXELFORMATDESCRIPTOR结构)、选择(通过ChoosePixelFormat函数)和设置(通过SetPixelFormat函数),规定绘图表面的某些属性。此外,只有在OpenGL环境中,OpenGL命令才能被接受并执行,所以我们必须创建OpenGL绘制环境(由函数wgCreatContext完成)。在必要的情况下,还将进一步创建调色板。我们选择视图类消息句柄OnCreate作为完成这些工作的恰当场所。
(3)OnSize
窗口大小变动时会触发消息句柄,OnSize在此函数中,我们的目的是建立3D OpenGL坐标与2D屏幕坐标之间的映射,体现为做三件事:
获取当前的绘制环境。这个使用wgMakeCurrent函数来完成,函数如下所示,BOOL bResult=wgMakeCurrent(dc.m_Hdc,m_hrc);
设置映射方式。OpenGL大量使用矩阵运算,因为场地景到屏幕的变换,以及3D图形的3D旋转、平移和缩放都是采用矩阵变换实现的。在OnSize函数中,我们使用投影栈来设置我们观察物体的方法,总共用到四个函数,如下所示,
GLdouble gldAspect=(GLdouble)cx/(GLdouble)cy;
GlMatrixMode(GL_PROJECTION);//指定所使用的矩阵栈
GlLoadIdentity(); //清空矩阵栈GlPerspective(45.0,gldAspect,1.0,10.0);//设定用户的可见区域
GlViewport(0,0,cx,xy); //设置在用户区上的绘制区域
激活当前绘制环境。在使用多个绘
基于OpenGL的三维图形的绘制
吴爱兰1 楼建列2
1、浙江公路机械技工学校 310014
2、浙江经济职业技术学院教育技术中心 310018
一、OpenGL的简介
目前OpenGL是工业界公认的先进而强大的三维图形编程接口(3D API)。它有着功能完备的二维和三维图形处理能力,是理想的三维应用程序开发工具。它包含将近120个绘制点、线和多边形等3D图形原语的绘制命令,及其他众多的功能函数,能处理各种图形基本元素及图形特征效果,如明暗度、纹理贴图、Z缓冲、反走样、光照模型等。
OpenGL是Visual C++中附带的SDK(Software Development Kit)。它直接使用绘制环境,间接使用设备环境,因此设备环境中的当前画笔、画刷、颜色、字体等均对OpenGL绘制无任何影响。甚至GDI映射模式都对OpenGL不起作用。所以,使用MFC开发应用程序并采用OpenGL进行绘制,必须遵循一定的规范,先建立OpenGL绘制环境,然后才能使用OpenGL命令。
二、OpenGL绘图环境的设置
2.1 准备工作
为了能够使用OpenGL命令,必须要在预编译头文件中加入两个库函数,openggl32.lib、glu32.lib,如果还需要使用辅助库中所定义的函数,则需要再加入 glaux.lib 库函数。
2.2 消息句柄
(1)PrecreateWindow
为了使用OpenGL绘制,必须先在有关窗口的客户区中进行OpenGL初始化,即需要重载消息句柄PrecreateWindow并将窗口风格规定为:cs_style|=WS_SLI
制环境的情况下,即将离开时,应调用wglMakeCurrent来激活当前绘制环境,wglMakeCurrent(NULL,NULL);
(4)OnDraw
此函数真正负责绘制3D图象,包括以下步骤:
在DC中选择并实现调色板;
调用wglMakeCurrent使绘制环境成为当前的;
调用OpenGL命令绘制场景;
如果使用双缓存像素格式,交替绘制缓存;
重新为DC选择原始的调色板。经过上述一系列步骤以后,OpenGL的绘图环境就已经设置完成,下面就可以通过OpenGL的绘图命令进行图形的绘制。
三、三维图形的绘制
设置完成OpenGL的绘图环境后,就可以在VC++中使用OpenGL三维函数库进行图形的绘制。函数的使用如下:
glPolygonMode函数是用来选择多边形光栅化模式的。它的原型是voidglPolygonMode(Glenum face ,Glenummode),其中,参数face用来指定mode应用的多边形,对于正面多边形,必须为GL_FRONT,对于反面多边形,必须为GL_BACK,对于正面和反面多边形,必须为GL_FRONT_AND_BACK。参数mode用来指定多边形光栅化的方式,可以选择的值为GL_POINT、GL_LINE和GL_FILL。
glBegin和glEnd函数用来限定一组或多组图原的顶点定义。OpenGL绘制的所有复杂的三维物体都是由一定数量的基本图形元素(点、线、多边形)构成。曲线和曲面分别是由一系列直线段和多边形近似得到。基本图元类型由glBegin的参数设定,它的参数只有一个变量,该
remoteEP);
其中的参数remoteEP是一个IPEndPoint类的实例,用于表示发送数据的远程主机。Receive方法的典型应用如下所示。
UdpClient receivingUdpClient =new UdpClient(11000);
IPEndPoint RemoteIpEndPoint =new IPEndPoint(IPAddress.Any, 0);
Byte[] receive = receivingUdpClient.
为了实时接收远程主机发送的数据,可以在应用程序中创建一个单独的线程执行相应的功能。其流程如图3所示。
在接收线程中,使用了循环来接收已传输的数据。当不需要接收数据时,需要在应用程序中结束该线程。
4 结束语
针对UDP协议的编程在计算机网络中有着较为广泛的应用。本文介绍的实例在.NET Framework 2.0下测试通过,运行正常,这对于将现有的网络应用程序移植到.NET平台有一定的借鉴作用。
图2 发送数据流程图图3 接收数据流程
变量指定了顶点可以绘制的10种方式,有GL_POINTS、GL_LINES、GL_LINE_STRIP、GL_QUADS和GL_POLYGON等。而glBegin和glEnd之间为组成基本图元的顶点序列,这就是说,OpenGL通过一定顺序的顶点序列来构造几何元素。glColor3f函数主要是对顶点坐标赋颜色值,使得程序可以对面进行颜色渲染。顶点的绘制是由
glVertex3f函数来负责,它有三个参数,这就代表了一个顶点的三个坐标值。
四、举例说明
下面的图形就是使用VC++和OpenGL,通过上面的步骤得出的一个简单的三维图形。在图a中的三维图形是一个六面体的线框盒子;而图b中的三维图形是在表面上被涂了不同颜色的六面体。
五、总结
本文阐述了利用VC++的MFC类库和OpenGL来绘制三维图形的原理和过程,
图 a图 b
Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receive);
Console.WriteLine("接收到的数据为:"+returnData.ToString());
3 点对点即时通信功能的实现
在实现点对点即时通信功能时,主要解决数据的发送和接收两个方面的问题。
3.1 发送数据
发送数据可以在应用程序中完成,其流程如图2所示。
3.2 接收数据
并举列说明。但OpenGL除了图形的绘制以外,还能进行动画的设计,利用VC++的强大功能,还可以进行人机交互功能的实现。这些在以后的工作中将会进一步得到实现。