基于MFC和OpenGL的3D对象查看交互控件外文翻译资料

 2022-08-07 14:10:30

英语原文共 6 页,剩余内容已隐藏,支付完成后下载完整资料


基于MFC和OpenGL的3D对象查看交互控件

摘要 三维对象的构造及其可视化控制是三维可视化过程中的关键问题。根据面向对象的编程方法,提出了基于MFC和OpenGL的应用软件开发的通用程序,从而从CView类派生出了GLView类。采用球坐标来表征观测点的位置和观测方向。根据全局坐标与局部视图坐标的坐标变换规则,推导了扭转、平移、旋转和缩放的变换公式。开发了面向对象的算法,通过响应鼠标或键盘消息、对话框或计时器来完成这些转换。许多实例表明,该方法既能直观地控制三维物体,又能定量地控制三维物体。

关键词:MFC;可视化;观看;变换

  1. 介绍

随着计算机科学和技术的发展,三维图形技术得到了迅速的发展。高性能的硬件和功能强大的软件推动了三维可视化在科研、工程、军事、医疗、经济等领域的应用。虽然大多数的商业软件如3DMAX、AUTOCAD、MAYA等都提供了强大的构造三维对象的功能,但是对于特定的用途仍然需要专门的应用软件。为了实现三维图形编程,引入了OpenGL,并提供了一种非常方便的方法 。此外,还介绍了如何在WINDOWS系统中开发3D应用程序 ,常用的程序已被广泛采用。

三维对象的视景控制是三维可视化过程中的一项重要任务。一些作品对3D场景中的视点控制有贡献 。然而,由于调整观测点或观测对象的位置是一个复杂的转换过程,目前还缺乏描述观测控制的数学模型。很多研究都采用了三维坐标变换 ,它可以很好地描述位置。所以我们可以引入它来给出一个查看控制模型。

在这篇文章中,首先根据面向对象的编程方法,提出了基于MFC和OpenGL的应用软件开发的一般步骤,然后详细讨论了三维物体观测点的控制,实现了不同位置、不同方向的观测。最后通过一些案例演示了视觉控制的效果。

  1. 使用MFC和OPENGL构建3D对象

基于MFC (Microsoft Foundation Class Library)和OpenGL (open Graphics Library)的编程环境是构建基于WINDOWS操作系统的三维对象的必要和有利条件。

Visual C 结合MFC使得在WINDOWS操作系统下开发高效的应用软件变得更加容易。从vc6.0到VS 2010,用于开发WINDOWS软件的集成开发环境(IDE)变得越来越强大。利用MFC开发了大量的应用软件。虽然vide中已经引入了GDl和GDl ,而且越来越多的图像处理方法可以很容易地实现,但是仅仅依靠简单的绘图工具和MFC提供的命令来生成3D对象仍然很困难。实际上,MFC提供的主要是软件框架和消息处理,如鼠标操作、键盘按下和对话交互。

OpenGL是一个三维图形包,提供了硬件图形设备的软件接口。硬件设备和操作系统都对OpenGL提供了支持,因此它被大量platfonn广泛采用。一个由核心库和实用库组成的标准OpenGL,包括所有以gl和glu开头的函数。此外,还提供了一些以glx和wgl开头的函数来支持WINDOWS系统。为了改进操作,供过于求库提供了一些常见的绘制(球面、环面、圆锥、茶壶等)和操作。

将MFC和OpenGL相结合,可以方便地开发用于构造三维对象和三维场景的WINDOWS应用软件。使用MFC的详细OpenGL编程方法已经在其他地方介绍过了。在此基础上提出了面向对象的程序设计方法。

2.1 windows视图的简化

许多文献介绍了如何开发控制台软件,但这些都是面向过程的编程,而不是面向对象的编程。对于MFC应用程序,显示是在视图类中实现的。因此,应该构造View类的派生类,可以将其命名为GL View。GL视图类将提供构造3D对象和3D场景的属性和方法。

在GL视图头文件的开头,有两个头文件amp;lt; glgll .hamp;gt;和amp; lt; GLlglu.hamp;gt;通过更改构建选项或添加以下命令,应该包括相应的库:

#pragma comment( lib, 'opengI32.lib' )

#pragma comment( lib, 'glu32.lib' )

在OnCreateO函数对应窗口WM_CREATE时,3d场景应该实现初始化,包括设置格式的像素设计PlXELFORMATDESCRlPTOR, 根据当前的DC对象创建一个RC对象,并为light, fog和其他OpenGL参数指定默认值。需要指出的是,GL视图类的每个对象都对应一个RC对象,因此当创建几个GL视图对象时,可能会存在几个不同的RC对象。在这种情况下,只有当前的RC对象可以响应OpenGL操作,而不是当前的DC对象。因此,应该定义一个属性参数m_hGLContext来表示每个GL视图对象的RC对象,并且需要一些判断来确定m_ hGLContext是否是OpenGL操作所需的对象。可以在OnSetFocusO函数中添加一些代码,以确保当前的RC与当前的有焦点视图的DC一致。此外,在退出应用程序之前,必须在OnDestroyO函数中销毁RC对象。

当窗口大小改变时,投影视图也要相应调整。因此,对应WM _SIZE窗口的OnSize()函数应该被编辑,以重新定义当前的视口。

2.2 三维场景渲染

3D场景的渲染应该在OnDraw()函数中实现,包括3D对象的绘制、光雾的设置、模型变换和投影变换。为了清除现场的闪光现象,通常采用双缓冲技术。对于复杂的三维场景,为了提高渲染速度,需要考虑顶点阵列和显示列表。如果需要自动移动,应该使用计时器。所有的转换,包括模型、位置、视口、光、雾等的变化都应该在OnTimer()函数中实现。

2.3模型视图和投影的转换

为了在2D屏幕上显示3D场景,OpenGL根据不同的视图方向使用了两种矩阵,即模型视图矩阵和投影矩阵。模型视图矩阵反映模型在屏幕视口位置的变化,投影矩阵反映模型的查看体积。

为了改变模型的位置,可以采用三种方法。第一种方法是直接更改模型视图矩阵,并在调用函数glMatrixMode(GL_MODELVIEW)之后调用glLoadMatrixO函数。这样就需要进行一系列的计算才能得到模型视图矩阵。第二种方式是调用模型转换函数,如glTranslateO、glRotateO和glScaleO。这是相对简单的方法比第一种方式,但它需要结合不同的转换。由于变换的顺序会影响最终的结果,所以变换序列的排列要慎重。第三种方法是通过确定眼睛的位置、场景中心和向上方向,调用视图转换函数gluLookAtO。

OpenGL支持透视投影和正投影。根据人眼观察手册,模拟三维物体时采用透视投影。在这种投影中,远处的物体似乎比近处的物体要小。在模拟三维物体时,不需要透视,采用正射影法。在大多数CAD和CAE软件中,更倾向于使用正投影,以保证投影屏幕上物体的大小不会随着眼与物体的距离而改变。图1显示了如何通过限制观看体积来定义OpenGL中的两种投影。glu透视图函数通过指定近、远剪辑平面、沿垂直方向的视场角e和视场的侧面来定义透视投影。glOrthoO函数通过指定左、右、下、上、近、远六个裁剪平面来定义正投影。根据一定的矩阵变换,将视体积内的所有物体投射到屏幕上。

图1所示。在OPENGL场景中查看不同投影的体积

在对象在屏幕上显示之前,glViewport()函数用于指定屏幕上的视口。为了避免对象被扭曲,视口的方面应该与观看体积的方面一致。

  1. 三维物体观测点控制

在三维物体被构造好之后,我们会从不同的方向和不同的位置观察它们。交互式观看控制是应用软件的重要组成部分。默认观测点位置为原点,默认观测方向为z轴负方向。因此,我们需要改变三维物体或观测点的位置和方向。

无论是物体的变形还是视点的变形都应符合人眼的观察手册。为了模拟不同观测方向和不同观测位置的三维物体,引入了球坐标,讨论了相应的平移、旋转和缩放变换。

3.1 笛卡尔坐标和球坐标

当我们在不同方向、不同位置观测三维物体时,用图2所示的球坐标可以很好地描述观测点。沿半径方向是指观测方向,半径和角度的值决定观测点的位置。

图2。在OPENGL场景中查看方向 图3。笛卡尔坐标和球坐标

一般定义笛卡尔坐标(x,y,z)如图3所示,定义球坐标(R,alpha;,beta;)如图3所示。两种坐标可以相互变换如下:

将观测点的球坐标(R,alpha;,beta;)定义为GL视图类的属性,由成员变量m_ IDistance (R)、m_ fAzimuth (alpha;)和m_ ffilevation (beta;)定义。当我们需要在OpenGL函数如gluLookAtO中使用它们时,我们可以根据Eq.(1)对它们进行变换,得到笛卡尔坐标(x,y, z)的值

3.2 全局世界坐标和局部视图坐标

为了便于观看,在半径为R的球体内构造三维物体,球体的中心仅位于原点o。尽管半径R的真实大小是不同的,但可以通过glScaleO函数归一化为1。这个坐标XYZ或Ralpha;beta;在0点处被称为全局坐标,它总是保持不变。当观测点C在0点围绕物体移动时,可以在C点defmed一个局部视图坐标x*y*z*,其中z*轴沿着OC表示视图方向,y*轴表示视图域向上方向。如图4所示,默认的局部视图坐标为Co,这是通过将观测点trom的默认原点位置0转换为点Co位置来定义的。先将A绕Y轴旋转,再将fJ绕X轴旋转,得到在C(R,alpha;,beta;)处的局部视图坐标。因此,局部视图坐标C(R,alpha;,beta;)点的全局世界坐标可以计算为:

图4。全局世界坐标和局部视图坐标 图5。视场向上方向的扭转

3.3 向上扭转

默认的视场向上方向平行于y轴的正方向。向上方向的变化可以用扭转角和倾斜角来描述,如图5所示。扭转角y表示绕z*轴向上旋转,从y*轴旋转到y*轴,倾斜角1]表示向上倾斜x* cy*平面,即绕x*轴旋转。通常向上的方向是用一个垂直于视图方向z*轴的单位向量来表示的,因此它可以仅仅用扭转角度来表示。如果考虑向上扭转方向,则公式(2)应更新为:

用球坐标的形式表示出来。

对于带有扭转的局部视图坐标,每个轴的方向可以用单位向量表示。视图方向z*为r =[xc Yc zc],向上方向y*为它=[Xu Yu Zu],横向方向x*为t =[Xt Yt ztl]. 由于[xc Yc Zc]是单位向量,因此xc、Yc、zc也是其方向余弦,分别表示z*轴与整体x、y、z轴夹角的余弦。[Xu Yu Zu]和[Xt Yt Zt]类似。因此,局部视图坐标中一个点的全局世界坐标可以计算为:

也就是笛卡尔坐标的形式。

3.4 转换

当我们在屏幕上观察对象时,如果我们想要平移对象,我们需要沿着局部视图坐标轴的方向移动观测点,而不是全球坐标轴的方向。观测点的平移可分为水平移动和垂直移动。水平移动是沿着x*轴而不是x轴,垂直移动是沿着y*轴而不是y轴。图6为C观测点平移的水平方向和垂直方向。

(a)在观测点移动方向 (b)沿水平方向移动 (c)沿垂直方向移动

图6。沿水平和垂直方向移动一个观测点

平移方向可以用矢量的叉乘来计算。在给定观测点,坐标为(xc,Yc,zc)或根据公式(l)由(R,alpha;,beta;)计算得到,垂直平移方向与向上平移方向 相同,水平平移方向 = x。若观测点沿水平方向平移Delta;x,沿垂直方向平移Delta;y,则fmal平移方向为

为了使物体沿着屏幕平面移动,需要同时改变观测点和视场中心点。改变新的视图方向后Oe或O C 平行于原视图方向DC,如图6所示。

3.5 旋转

如果我们沿着全球坐标轴的方向旋转观测点,我们可以观察不同视图方向的对象,如前、后、上、下、左、右等。在这种情况下,需要做的只是改变观察点的位置,根据(1)式。方位增量Delta;alpha;和高程增加 Delta;beta;应该添加到原始方位和原始高程beta;,然后新的方位和仰角计算以确定观察点的新坐标。

(a)根据视图方向在一个视点上旋转方向 (b)沿水平和垂直方向旋转<!--

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[260007],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

发小红书推广免费获取该资料资格。点击链接进入获取推广文案即可: Ai一键组稿 | 降AI率 | 降重复率 | 论文一键排版