在使用Visual C++的MFC AppWizard建立应用程序框架后,生成了多个类,与OpenGL编程相关的类是视图类,主要的显示任务都在其中完成。

1、基于OpenGL绘图的基本设置

1.1 设置必要的编译链接环境

OpenGL的图形编程接口包括的主要函数和库函数被封装在动态链接库中,因此在项目中要添加 OpenGL32.dll、glu32.dll和glaux.dll三个库。同时在应用程序的视类头文件中加入OpenGL头文件说明:

#include"gl\gl.h"  #include "gl\glu.h"  #include "gl\glaux.h"

1.2 设置像素格式

该部分设置绘图所需的像素格式,Windows下采用PIXELFORMATDESCRIPTOR结构设置像素格式,该结构包含26个属性信息,包含了颜色位数、颜色模式、缓存的位数和操作方式,以及是否采用双缓存机制等。

1.3 创建着色描述表

OpenGL应用程序的设备描述表(DC)称为着色描述表,由它通知Windows在窗口中绘制图形。应用程序必须在绘图之前调用专用函数wglCreateContext()创建自己的着色描述表,调用wglMakeCurrent()使其当前化,退出OpenGL时使着色表非当前化。

1.4 创建三维曲面的观察场景

OpenGL一般用函数glFrustrum()和glViewport()实现投影变换和视口变换。glFrustrum()定义了一个容纳绘制对象的最大空间区域,即视景体,位于视景体以外的部分都会被剪切掉;glViewport()则定义了一个绘制场景的矩形区域,即视口,用来把场景中的点映射到绘图区。

glFrustrum(-1.0,1.0,-2.0,2.0,0.0,7.0);

//视景体上、下、左、右、前、后的坐标分别为-1.0,1.0,-2.0,2.0,0.0,7.0;

glViewport(0,0,200,300);

//视口区上、下、左、右坐标分别为0,0,200,300;

1.5 视类中OnDraw()成员函数的设置

在Windows的VC++编程中,所有窗口中的图形绘制代码都在视类的OnDraw成员函数中实现,采用OpenGL绘制三维曲面之前需要进行必要的环境设置。

glClearColor(1.0f,1.0f,1.0f,1.0f);//设置背景颜色为白色

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除颜色缓存和深度缓存

glColor3f(1.0f,1.0f,1.0f);//设置绘图颜色为红色

2、创建绘制三维曲面的显示列表

在显示列表中定义用户绘制三维曲面图形所需数据以及数据之间显示连接方式。文中实例中显示列表包括三维曲面图形的数据点的显示列表;坐标轴的显示列表;显示坐标数据的显示列表。显示列表采用线段连接的方式。

3、三维曲面图形动态显示程序主框架

在视类中产生Onhuitu()作为绘图的主程序。三维曲面图形动态显示子程序drawsurbs()包括初始化,读数据文件,数据插值,投影变换,消隐,绘图显示列表设置(坐标轴绘制显示列表、三维曲面绘制显示列表),强制绘图操作,缓存拷贝,切换前后缓冲区等几个主要部分。初始化程序myinit()中设置双缓存模式,是实现动态显示的前提。drawsurbs()中缓存拷贝auxSwapBuffers()、切换缓存SwapBuffers (wglGetCurrentDC())、缓冲区的清除glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)是实现动态显示的必不可少的操作。

voidCNurbsView::Onhuitu()
{
 HWND hWnd=GetSafeHwnd();
 HDChDC=::GetDC(hWnd);
 wglMakeCurrent(hDC,hglrc);//设置当前着色表
 drawsurbs();//动态显示三维曲面子程序
 wglMakeCurrent(NULL,NULL);//着色表非当前化
 SwapBuffers(hDC);//交换缓存
}
{
 ……
 myinit();//初始化子程序
 jixu=20;//动态显示帧数
 While(jixu)
 {
readdata();//读数据文件子程序
interplator();//数据插值子程序
orthoprojection();//投影变换子程序
xiaoying();//消隐子程序
glPushMatrix();
glColor3f(0.0f,1.0f,1.0f);//颜色设置
glLineWidth(2.0);//线宽设置
glNewList(axis_list,GL_COMPILE);//坐标轴显示列表
……
glEndList();
glNewList(sufer_list,GL_COMPILE);//三维曲面绘制显示列表
……
glEndList();
glCallList(axis_list);
glCallList(sufer_list)
glFlush();//强制绘图
glPopMatrix();
auxSwapBuffers();//缓存拷贝
SwapBuffers(wglGetCurrentDC());//切换缓存
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//为绘下帧曲面清除缓冲区
jixu--
deley();//延时子程序
 }
} void CNurbsView::myinit()
{
 glClearColor(0.03,0.4,0.4,0.4);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);//设置成双缓存模式
}

某数据场三维曲面动态显示仿真系统实例

  根据以上思想,利用OpenGL双缓存及显示列表技术,基于某数据场数据,开发了三维曲面图形动态显示仿真系统,该实例中视窗中三维曲面图形随数据场的数据的改变而动态显示,图2为程序运行中某一时刻的显示结果。

  结束语

  在微机平台上,利用VC6.0的OpenGL根据数据场的分布进行三维曲面的动态显示是切实可行的,尤其采用双缓存及显示列表技术可以得到很好的三维曲面生成速度,这种动态显示技术可以推广应用在需要进行实时动态显示的数据处理方面。

基于OpenGL的三维曲面动态显示原理

1、基于OpenGL三维曲面图形显示原理
OpenGL是独立于操作系统的开放式三维图形软件接口。其主要功能是将三维曲面通过顶点序列或像素点进行描述,并进行相应的透视、光照、纹理操作,最终转换成帧缓存中的图像数据,利用该图像数据进行三维曲面图形的着色。三维曲面图形显示归纳为以下几个步骤:

(1)在三维场景中建立曲面绘制的模型。选用插值方法、参数曲面函数,计算曲面控制点,进行曲面重构;
(2)设置视点和透视方式;
(3)进行消隐、光照、纹理、明暗处理;
(4)绘制场景,输出到屏幕窗口。

  图2 三维曲面图形显示基本流程

2、利用双缓存实现动态显示原理

三维曲面动态显示需要连续地绘制三维曲面并显示场景,用不同的曲面数据刷新屏幕视窗。

在OpenGL中利用双缓存技术,分配两个帧缓存区,在连续显示三维曲面时,一个帧缓冲区中的数据执行绘制曲面命令的同时,另一个帧缓存区中的数据进行图形显示。当前可见视频缓存称为前台视频缓存,不可见的正在绘图的视频缓存称为后台视频缓存。当后台视频缓存中的数据要求显示时,OpenGL就将它拷贝至前台视频缓存,显示硬件不断地读可见视频缓存中的内容,并把结果显示在屏幕上。

应用双缓存,每一帧三维曲面只在绘制完成之后才显示出来,所以观察者可以看到每一帧完整三维曲面,而不是曲面的绘制过程。

使用双缓存实现三维曲面动态显示的步骤如下:

 (1)设置OpenGL窗口显示属性为双缓存机制:auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);

(2)利用OpenGL基本绘图命令绘制三维曲面;

(3)一帧曲面绘图结束后缓存拷贝,切换缓存:auxSwapBuffers();

SwapBuffers(wglGetCurrentDC());

3、利用显示列表提高程序运行效率

显示列表是一组预先存储起来留待以后调用的函数语句。调用显示列表时就按次序执行其中的函数。显示列表将反复执行的绘图操作以编译好的命令方式进行存储,设计成命令的高速缓存,而不是动态的数据库缓存,所以可以优化程序运行性能。

实现和调用显示列表的方法:

(1)创建列表:

voidglNewList(Gluint list,Glenm mode);

voidglBegin(Glenum mode);

voidglEnd(void);

voidglEndList();

(2)调用列表:

voidglCallList(Gluint list);

CSDN 2015-05

基于OpenGL的三维曲面动态显示实现的更多相关文章

  1. 基于OpenGL三维软件开发

    实验原理: OpenGL在MFC下编程原理---- Windows操作系统对OpenGL的支持 在Windows下用GDI作图必须通过设备上下文(DeviceContext简写DC)调用相应的函数:用 ...

  2. 学习基于OpenGL的CAD程序的开发计划(一)

    本人目前从事的工作面对的客户中很多来自高端制造业,他们对CAD/CAE/CAM软件的应用比较多.公司现有的软件产品主要是用于渲染展示及交互,但面对诸如CAD方面的应用(比如基于约束的装配.制造工艺的流 ...

  3. MATLAB三维曲面

    今天终于测试了,发下来第一张试卷中只会做一小题.我蒙了!!! 所以呢,我现在再做一下,总结总结! 作函数 f(x)=2(x1-1)4+2x22 的三维图. 这道题要用到的知识点有函数meshgrid. ...

  4. Matlab绘图基础——一些标准三维曲面

    标准三维曲面 t=0:pi/20:2*pi; [x,y,z]= cylinder(2+sin(t),30);     %[x,y,z]= cylinder(R,n),其中R为圆周半径,n为组成圆周的点 ...

  5. Matlab绘制三维曲面(以二维高斯函数为例)

    原文地址为:Matlab绘制三维曲面(以二维高斯函数为例) 寒假学习了一下Python下的NumPy和pymatlab,感觉不是很容易上手.来学校之后,决定继续看完数字图像处理一书.还是想按照上学期的 ...

  6. 基于WebGL的三维的物联网平台技术

    参加工作三年了,从一个搞调试的民工进阶为程序员,收获还是有那么一点的.慢慢讲一些. 去年在网上发现了https://hightopo.com/cn-index.html图扑软件的基于WebGL的三维j ...

  7. 基于OpenGL编写一个简易的2D渲染框架-05 渲染文本

    阅读文章前需要了解的知识:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 简要步骤: 获 ...

  8. 基于SceneControl的三维GIS开发

    在ArcGIS体系中,三维开发包括两种:基于Scene的三维开发和基于Globe的三维开发. 由上图可以看出,两种开发的接口都很相似,掌握了Scene开发会相对容易的过渡到Globe开发中. 正如上图 ...

  9. 基于Opengl的太阳系动画实现

    #include <GL\glut.h> float fEarth = 2.0f;//地球绕太阳的旋转角度float fMoon = 24.0f;//月球绕地球的旋转角度 void Ini ...

随机推荐

  1. 解决samba共享虚拟机第二块磁盘的难题

    linux下使用samba共享文件到window下已经实现过了   点此链接 但是共享时磁盘空间是有限的,如果空间使用完了该怎么处理呢?这是个头疼的问题,不知道samba支持不支持共享第二个文件夹,由 ...

  2. wordpress调用自定义post_type文章

    前面我们讲了wordpress添加post_type自定义文章类型,我们现在来讲一下如何把自定义文章调用出来,我们以product为例,虽然我们自定义好了 Post Type 同时也编写了一些内容,但 ...

  3. sublime text3中Package Control的安装

    手动安装Package Control,亲测有效成功 1.点击https://github.com/wbond/package_control去github下载Package Control安装包下载 ...

  4. zzulioj - 2558 数字的差值

    首先感谢抱抱熊dalao的题解,提供了一种比较简单的思路.[抱抱熊dalao的题解](https://note.youdao.com/ynoteshare1/index.html?id=52f087d ...

  5. centos 升级openSSH7.81

    1.下载相关依赖包 [root@Log ~]# yum install -y gcc openssl-devel pam-devel rpm-build 2.下载安装包 wget http://ftp ...

  6. 第02组 团队Git现场编程实战

    目录 1. 组员职责分工(2分) 2. github 的提交日志截图(1分) 3. 程序运行截图(3分) 4. 程序运行环境(1分) 5. GUI界面(5分) 6. 基础功能实现(10分) 7. 鼓励 ...

  7. 动态的src路径怎么写

    错误写法 <div class="icon--wrapper" @click="before"> <img class="icon- ...

  8. db服务器参数优化

    1.swap分区 swap作用是在系统内存不够的情况下,当做临时的内存使用. swap是在硬盘上,性能肯定没有再内存好,当系统内存使用超过40%的时候, swap会可能被使用,而系统一旦使用swap会 ...

  9. Salesforce 开发整理(五)代码开发最佳实践

    在Salesforce项目实施过程中,对项目代码的维护可以说占据极大的精力,无论是因为项目的迭代,还是需求的变更,甚至是项目组成员的变动,都不可避免的需要维护之前的老代码,而事实上,几乎没有任何一个项 ...

  10. 关于.ipynb文件

    一.简介: .ipynb文件即为Jupyter Notebook,是一个交互式笔记本,支持运行 40 多种编程语言. Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文 ...