基于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。基于opengl动态三维地形设计论文
相关推荐
元都要进行一系列的逐个片元操作,这样最后的象素值 BZ 送入帧缓冲器实现图形的显示。 OpenGL 图形操作步骤 在上面说明了 OpenGL 的基本工作流程,根据这个流程可以归纳出在 OpenGL 中进行主要的图形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步骤: ( 1) 建立景物模型 根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述( OpenGL 中把:点、线、多边形
引擎解释执行程序代码的能力。 但 JSP 代码被编译成 Servlet 并由 Java 虚拟机解释执行,这种编译操作仅在对 JSP 页面的第一次请求时发生。 在 PHP、 ASP 、 JSP 环境下, HTML 代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。 普通的 HTML页面只依赖于 Web 服务器,而 PHP、 ASP 、 JSP 页面需要附加的语言引擎分析和执行程序代码。
GLfloat fogColor[4]= {, , , }。 //此处设置 雾的颜色 、//和系统的背景色一致,效果比较明显 fogMode = GL_LINEAR。 //采用、线性变化的雾化效果 glFogi (GL_FOG_MODE, fogMode)。 glFogfv (GL_FOG_COLOR, fogColor)。 //设置雾的颜色 , 与背景匹配 glFogf
测技术具有直观、可监视范围广、可获取更多种类的交通参 数以及费用较低等优点、因而可广泛应用于交叉路口和公路干线的交通监视系统中。 视频车辆检测技术未来趋势 ( 1)智能化 视频车辆检测技术经过多年的发展,检测精度、深度、范围等指标都有很大的提高,但系统的智能化程度还十分有限,距离“人脑”的判断能力还很远。 ( 2) 视觉检测立体化 体视觉是计算机被动测距方法中最重要的距离感知技术之一。
编程器。 在单芯片上,拥有灵巧的 8 位 CPU 和在系统可编程 Flash,使得 AT89S52 在众多嵌入式控制应用系统中得到广泛应用。 AT89S51 具有如下特点: 40 个引脚, 8k Bytes Flash 片内程序存储器, 256 bytes 的随机存取数据存储器( RAM), 32 个外部双向输入 /基于 nRF24L01 模块的无线通信系统设计 8 输出( I/O)口,
片封装,不利于焊接,需要 PCB制板,大大增加了成本和开发周期。 方案三 :采用宏晶科技有限公司的 STC12C5A60S2增强型 51单片机作为主控芯片。 此芯片内置 ADC和 SPI总线接口,且内部时钟不分频,可达到 1MPS。 而且价格适中。 考虑到此系统需要不用到 ADC,从性能和价格上综合考虑我们选择方案一,即用 AT89C51作为本系统的主控芯片。 无线通信模块方案 方案一:采用