基于opengl动态三维地形设计论文内容摘要:

{ if(bActive()) { ()。 DrawGLScene()。 ::SwapBuffers(wglGetCurrentDC())。 } else { ShowWindow(m_hWnd,SW_SHOWMINIMIZED)。 WaitMessage()。 } } } 使用 PeekMessage 而不是 GetMessage,这样当消息队列中没有消息时便不会等待而是返回一个 FALSE 值,这样我们就可能知道当前应用程序处理空闲状态了。 另外值得注意的是,如果得到的消息是 WM_QUIT, PeekMessage 一样会返回 FALSE 值,所以我们需要做一些特殊处理。 当允许 Active 运行时,调用 CScene 类中的 CheckForMovement()。 以及DrawGLScene()函数。 函数 InitInstance(HINSTANCE hInstance,int nCmdShow)其中改动比较大,并且将注册窗口类融入其中。 即定义的注册窗口类 wc,其中参数如下: = CS_HREDRAW | CS_VREDRAW | CS_OWNDC。 //刷新屏幕,添加句柄 = (WNDPROC) WndProc。 //窗口句柄消息 = 0。 //无特别窗体数据 = 0。 = GetModuleHandle(NULL)。 //设置实例 = LoadIcon(NULL, IDI_WINLOGO)。 //读取默认图标 = LoadCursor(NULL, IDC_ARROW)。 //读取箭头指针 = NULL。 //无 GL 必需的背景 = NULL。 //无菜单 = OpenGL。 //设置类 名 该函数中定义窗口默认大小为 1024*800,像素格式为 16 位。 构建 Windows 窗口则使用函数 CreateWindowEx( dwExStyle, //继承 windows 窗口风格 szWindowClass, //类名 13 szTitle, //窗口标题 dwStyle | //定义窗口风格 WS_CLIPSIBLINGS | //必需的窗口风格 WS_CLIPCHILDREN, //必需的窗口风格 0, 0, //窗口位置 , //窗口宽 , //窗口高 NULL, //没有父窗口 NULL, //没有菜单 GetModuleHandle(NULL), //实例 NULL) 用来设置一个匹配的像素格式 static PIXELFORMATDESCRIPTOR pfd= { sizeof(PIXELFORMATDESCRIPTOR), // 像素格式描述的大小 1, // 指定像素格式的数据结构 PFD_DRAW_TO_WINDOW | // 格式支持 window PFD_SUPPORT_OPENGL | // 格式支持 OpenGL PFD_DOUBLEBUFFER, // 支持双缓冲 PFD_TYPE_RGBA, // 要求 RGBA 格式 bits, // 选择颜色深度 0, 0, 0, 0, 0, 0, // 忽视色位 0, // 无 Alpha 缓冲 0, // 忽视位转移 0, // 无堆缓冲 0, 0, 0, 0, // 忽视堆位数据 16, // 16 位 Z 缓冲深度 0, // 无模版深度 0, // 无辅助缓冲 PFD_MAIN_PLANE, // 主绘图层 0, // 保留的参数 0, 0, 0 // 忽略修饰层 }。 出错处理: 判断注册窗口类是否建立。 判断是否 获取你需要在上面绘图的设备环境。 判断是否获得匹配的环境设备的像素格式。 判断是否设置像素格式。 判断创建 OpenGl 设备是否成功。 判断 OpenGl 设备是否启动。 判断初始化是否成功。 设置 窗口的消息相应: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM 14 wParam, LPARAM lParam) WM_ACTIVATE 监视 Avtivate 消息。 WM_SYSCOMMAND 用来截获系统消息。 WM_CLOSE 关闭消息。 WM_COMMAND 控制消息。 IDM_EXIT 关闭窗口。 WM_KEYDOWN 键盘响应消息 设置 L 键,切换三角形填充模式与接线框模式。 WM_SIZE 调整窗口大小,重新刷新屏幕。 其他情况下, DefWindowProc(hWnd, message, wParam, lParam)。 不然 GDI 的绘图会与 OpenGL 冲突,并且阻止程序空闲。 函数 ReSizeGLScene(GLsizei width, GLsizei height)用于调整窗口大小时刷新屏幕。 函数 KillGLWindow(GLvoid)用于释放窗口,其中判断是否能够释放 DC 与 RC 设备,判断是否能够删除 RC,判断是否能够释放 DC 设备,是否能够删除窗口,是否成功能够注册 OpenGL 类 . 各个类( Class)、结构体( struct)详细设计说明: 4. 3. 1 结构体 CVector3 任何像素点在三维空间内都存在着他自己的坐标值,该结构体用来定义空间点的存在。 在该结构体定义的头文件中,重载了一些基本的运算符操作。 定义出计算点到原点距离的成员函数 ComputeLength()。 在 中,定义给出了计算两个点乘积的函数 DotProduct(); 计算向量积,也就是交叉乘积的函数 CrossProduct(); 计算向量大小的函数 Magnitude(); 单位规格化向量的函数 Normalize(); 判断两点是否同一边的函数 SameSign(); 判断点是否在射线上的函数 PntFrontOrBack(); PntFrontOrBack2(); 计算两点之间距离的函数 Dist(); 以上列出的成员函数,一些并没有被用到,只是作为完善,不时之需。 4. 3. 2 类 CTexture 该类用来控制纹理的映射。 该类定义如下: class CTexture { GLuint m_nTxt。 public: 15 inline GLint GetTxtID(){return m_nTxt。 } int LoadGLTextures(char *Filename)。 CTexture() { m_nTxt = 1。 } ~CTexture() { if(m_nTxt!=1) glDeleteTextures(1,amp。 m_nTxt)。 } }。 其中主要包括了,读取 bmp 纹理文件的函数 LoadGLTextures( char *Filename) 实现步骤如下: 设置一个 file 型指针,以及指向内存纹理数据的指针 AUX_RGBImageRec *pImage 出错判断, Filename 为空的情况,文件没有能够读取到的情况。 读取 bitmap 在 中使用的辅助存储函数 auxDIBImageLoad(Filename); 确认读入了有效的图像数据 通过结合存储在数据队列中的纹理 ID 产生一个可用纹理 语句: glGenTextures(1, amp。 m_nTxt)。 放置从起点开始每一行的像素点的队列需求 . 语句: glPixelStorei (GL_UNPACK_ALIGNMENT, 1)。 从纹 理索引中确定纹理,并初始化它们 语句: glBindTexture(GL_TEXTURE_2D, m_nTxt)。 建立 Mipmaps (纹理的目标,纹理中颜色数量的成分,纹理图像的宽,纹理图像的高,像素点数据格式,内存中指向数据的指针 ) 语句: gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pImagesizeX, pImagesizeY, GL_RGB, GL_UNSIGNED_BYTE, pImagedata)。 分配 映射地图和纹理信息 语句: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST)。 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)。 释放内存纹理数据 4. 3. 3 类 CText 该类控制字体产生并显示输出。 该类定义如下: class CText { typedef struct tagINFO { float x,y,z。 16 char sInfo[128]。 }INFO。 UINT m_fontLstID。 public: void EditItem(int nID,float x,float y,float z,char *str)。 int AddText(float x,float y,float z,char *str)。 void Draw()。 CText()。 virtual ~CText()。 bool InitRasterText()。 void PrintString(char* string)。 void CreateOpenGLFont(LPSTR strFontName, int height)。 void glDrawText(int x, int y, const char *strString, ...)。 private: bool makeRasterFont()。 unsigned int fontOffset。 int m_nInfo。 INFO m_Info[MAXINFO]。 }。 其中设置光栅显示的字体的函数 makeRasterFont(); 初始化光栅字符文档 InitRasterText();主要就是确定字体是否读入。 显示串的函数 PrintString(); 通过调用 PrintString()在指定的光栅位置显示串的函数 Draw() 创建 OpenGL 字体的函数 CreateOpenGLFont(); 由于一般情况下,字体是不可能存在在三维的空间中,所以通过转换来设置字体的显示位置的函数 PositionText(); 将字符串在屏幕 上显示的函数 glDrawText(); 实现的运行情况如图 41 图 41 屏幕显示 fps 值与绘制的三角形数量 4. 3. 4 类 CFrustum 17 用来控制视野,也就是可见范围的确定 [6] 该类定义如下: enum FrustumSide { RIGHT = 0, // 截体右面 LEFT = 1, // 截体左面 BOTTOM = 2, // 截体底面 TOP = 3, // 截体顶面 BACK = 4, // 截体背面 FRONT = 5 // 截体前面 }。 enum PlaneData { A = 0, // X B = 1, // Y C = 2, // Z D = 3 // 平面到原点距离 }。 class CFrustum { friend class CTerrain。 //声明友类 public: void CalculateFr。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。