基于WPF的油藏模型三维可视化解决方案
2021-01-26刘珊珊赵亦朋
刘珊珊,赵 庆,曹 豹,赵亦朋
(1.中国石油大学(北京) 石油工程学院,北京 102249;2.中国石油集团 工程技术研究院有限公司,北京 102200;3.东北石油大学 提高油气采收率教育部重点实验室,黑龙江 大庆 163318)
引 言
三维可视化是石油地质研究一个重要的技术手段,对于油藏数据的可视化已有很多研究。1991年Bui-Tran Van等人[1]研究了基于Iris工作站和OpenGL技术的HERESIM油藏可视化软件; 1995年Craig Sinclair等人[2]研究了基于SGI GL的面向对象油藏地质三维可视化软件;2012年Stein Inge Dale等人[3]研究了基于OpenGL的ResInsight软件,可实现大规模油藏网格的可视化; 2013年刘昱博[4]研究了基于OpenGL的油藏可视化系统; 2014年申皓[5-6]研究了基于开源三维图形渲染引擎OSG(OpenSceneGraph)的多源异构油藏模型三维可视化系统。
在石油行业的地质、勘探等领域,2007年李艳华等人[7]进行了基于Java 3D导向钻井信息三维可视化研究;.NET和WPF微软公司提供的基于GPU加速的桌面应用开发技术,开发效率远高于C++等传统工具,并且WPF具有大量高水平的开源及商业化第三方控件,能够实现高水平的界面效果,所有界面支持Direct 3D硬件加速,WPF已在行业软件得到一定程度的应用[8-10]。
本文提出一种基于WPF技术和MVVM设计模式的高性能三维可视化解决方案,研究了eclipse油藏模型可视化方法,包括油藏网格数据与钻井轨迹可视化,基于此方法开发了一种新的油藏地质模型和井轨迹三维可视化软件。不仅在显示效率和效果上能够满足需求,同时通过应用MVVM模式[11-13],使得三维控件的易用性得到较大提高,能够方便地嵌入WPF应用当中,为油藏地质的三维可视化提供了全新的技术思路。
1 WPF技术与MVVM设计模式
.NET是微软公司为了对抗Java技术阵营推出的一套技术体系,与Java具有相似的概念,.NET程序被编译为中间语言,运行在一个安全的托管环境,天生具有安全和垃圾自动收集的特性,较传统的Windows环境更为安全,.NET运行环境甚至可完全脱离Windows系统。
.NET适用于开发各种应用程序,包括Windows桌面Web和移动应用等,在.NET刚刚推出时,微软提供了Windows Form技术用于开发桌面应用,但是该技术基于GDI Plus,属于传统的CPU渲染技术,随着GPU技术的发展,使用GPU进行渲染能够实现更为炫酷的软件界面,WPF技术应运而生。
WPF(Windows Presentation Foundation)是微软在.NET 3.0中推出的基于Windows 的用户界面框架,它基于Direct 3D,能够利用GPU进行渲染,与此同时还推出了基于XAML的界面描述语言,真正做到了用户界面与应用逻辑的分离。MVVM(Model-View-ViewModel)是MVC 的改进版,旨在利用WPF中的数据绑定函数,通过从视图层中几乎删除所有GUI代码(代码隐藏),更好地促进视图层开发与模式其余部分的分离。同时利用数据绑定的优势和通过绑定数据的框架尽可能接近纯应用程序模型。WPF配合MVVM设计模式,使得图形界面应用软件无论在界面效果还是开发效率方面都上升到了一个新的高度。
2 基于WPF的三维可视化技术
WPF技术本身就基于Direct 3D,因此它内置了一套三维可视化技术——WPF 3D,使用WPF 3D可以快速建立三维场景,但是WPF 3D对于Direct 3D的封装,具有较大的性能损失,只能满足一般的应用需求,而不能满足地质油藏这一类拥有大数据体的可视化需求。
除此之外,还可以在WPF中通过SharpDX和OpenTK进行三维开发,它们分别封装了Direct 3D和OpenGL,但是它们属于较为底层的技术,开发难度较大、效率较低。
Helix Toolkit是.NET中较为高级的三维开发技术,它在图形性能和开发效率方面具有较好的平衡,能够满足绝大多数应用的需求。Helix Toolkit具有WPF和SharpDX两个版本,都能够与WPF实现完美的融合,其功能对比见表1,可根据应用需求进行选择。
经过功能和性能对比,Helix SharpDX能够更好地满足油藏地质三维可视化的需求。
3 油藏模型
实现地质油藏数据的可视化,首先要加载模型文件,主要包括网格和属性数据,一般情况下网格为六面体网格,单元格定义如图1所示。图1中说明了顶点和面的顺序。不同的软件使用的格式有所不同,Eclipse是应用最广泛的油藏数值模拟软件,以下主要讨论该软件的数据格式。
表1 WPF和WPF.SharpDX功能对比Tab.1 Comparison of functions of WPF and WPF.SharpDX
图1 六面体单元格定义Fig.1 Definition of hexahedral cell
Eclipse模型的数据格式主要有文本格式(FGrid)和二进制格式(EGrid)两种,其中文本格式较为直观,但是数据量较大,解析效率较低;二进制格式存储效率较高,数据量小,数据加载较快,使用更为方便。
Eclipse的二进制格式(简称EGrid格式)有.EGRID和.INIT两个重要文件,分别记录了网格数据和属性数据,文件格式基本相同。EGrid数据由一系列数据段组成,每个数据段具有自描述性,包括段头记录(表2)和数据体记录(表3)。
表2 EGrid数据段头记录内容Tab.2 Section header record of EGrid
表3 EGrid数据段数据体记录内容Tab.3 Section body record of EGrid
表2中DataType是一个字符串,代表数据类型(表4)。
表4 EGrid数据类型Tab.4 Data types of EGrid
读取EGrid文件就是一个循环的过程,每次读取一个数据段,根据数据段的关键字,确定该数据段记录的内容,进行不同的处理,直到所有数据段读取完毕。
以下列出几个重要的关键字:
GRIDHEAD——网格的维度,NX、NY、NZ
MAPAXES——网格的坐标范围
COORDS——坐标
ZCORN——ZCORN坐标
ACTNUM——有效网格
通过上述文件格式和解析方法,即可提取网格和属性数据进行三维图形绘制。
4 油藏模型的绘制
油藏网格的绘制过程包括:①通过数据绘制几何形状,包括网格、井轨迹;②确定单元格参数与颜色之间的关系,即单元格着色;③三维对象的控制,如旋转、平移及缩放[14]。
4.1 网格绘制
油藏模型的显示,关键在于网格的处理和显示。一般来说,油藏模型的数据量非常大,在显示之前必须进行预处理。网格由一系列六面体组成,其中大量的单元格是连续的,存在相互遮挡关系,即许多单元格的表面因为重叠而不可见。在可视化过程中,显示这些重叠的面是没有意义的,只会增加显示的负担而影响性能。预处理过程需要根据单元的拓扑关系消除所有隐藏点和面[15],减少显示数据量。
以一个中型模型为例,模型大小为132×92×45=546 480个单元格,其中有效单元格182 104个,有效单元格有1 456 832个点和1 092 624个面,通过预处理,可见点减少到171 611,可见面减少到153 616,相对原有数据量减少85%以上(表5)。
表5 预处理结果Tab.5 Preprocessing results
油藏模型组件通过继承MeshGeometryModel3D类来实现,其中最重要的是Geometry对象。通过MeshBuilder类构造Geometry实例时,关键属性是顶点位置(Positions)、三角形定点索引(TriangleIndices)、三角形法向量(Normals)和材质坐标(TextureCoordinates)。油藏网格由一系列四边形构成,单一的四边形如图2所示。
图2 单一四边形Fig.2 Single quadrangle
三维图形的基本元素是三角形,因此将一个四边形划分为两个三角形(p0,p1,p2)和(p2,p3,p0),法向量为
Normal=((p1-p0)×(p3-p0))。
(1)
材质采用ColorStripeMaterial,材质坐标
(u,v)=((V-Vmin)/(Vmax-Vmin),0)。
(2)
其中:V为单元格属性值;Vmin为属性值最小值;Vmax为属性值最大值。
4.2 网格着色
色标模块是整个三维可视化模块的基础,色标模块设计的好坏直接决定可视化效果。在可视化过程中,人们已经习惯用不同的颜色表示油藏模型的相应属性,因为使用不同的颜色可以更好地显示整个地层的趋势以及属性的分布情况,并且更容易判断当前工区的状态,所以设计一套好的色标系统非常重要。本文使用色标的方式进行网格着色,通过选择不同的色标,可以对网格进行不同效果的着色。色标的基本概念是使用一组颜色值代表数值。例如常用的彩虹色标,即模仿彩虹的颜色使用红、橙、黄、绿、蓝、靛蓝、紫罗兰色组成,同时还建立了其他多种色标,用以满足不同的需求,效果见表6。
表6 本软件的色标Tab.6 Color code of this software
4.3 井轨迹的绘制
井轨迹是油藏模型三维可视化中重要的一部分,轨迹数据主要包括测量深度MD,井斜角Inc和方位角Azi,见表7。通过计算获得轨迹的空间坐标:垂深TVD、北坐标NS和东坐标EW,分别代表轨迹上某一点相对于井口的南北方向,东西方向和垂直方向的位移。
表7 井轨迹数据Tab.7 Well trajectory data
计算过程为:将井口作为坐标原点,从井口开始依次递推计算相邻两个测量点,通过假设两测点间井段的三维曲线形状,计算测量井段垂向上增量ΔD、南北向增量ΔN及东西向增量ΔE,再将其累加,即可得到TVD、NS、EW,将这些数据连线,即形成井轨迹。在某些情况下,如果井轨迹数据比较稀疏,直接连线会出现折线,可以采用空间圆弧插值或三次样条插值的方式[16]获得平滑的井轨迹。
对于单井,TVD、NS、EW都是相对于其井口坐标的。对于不同的井,其井口在地图上的北坐标、东坐标及井口海拔均不同,将多井数据放在同一坐标系下,必须将所有井数据校正到统一的坐标系(TVDu,NSu,EWu)。
(3)
式中:Wbh为补心高;Wmap-N为井口地图北坐标;Wmap-E为井口地图东坐标。
在实际开发中,为减少运算可以采用相对坐标,通过平移变换将井轨迹移动到井口位置,这样可以更充分地利用GPU运算。
4.4 三维变换
平移、旋转、缩放是基本的三维变换,虽然可以使用公式表示每一种变换,但是在表示多种连续变换时,使用公式会变得非常复杂,利用坐标变换矩阵,可以更为方便地实现各种基本变换及组合变换。
透视变换与照片成像相似,是将空间的三维几何体投影到二维平面,透视图很接近人类的视觉,例如人眼看一条路,远方的路看起来变窄了。油藏模型的可视化,经常使用透视变换,能够得到更为逼真的显示效果。
通过设置“摄像机”的参数:包括位置、上方向、朝向、视角、近平面及远平面,用户可以从不同角度和距离查看三维场景,实现整个场景的旋转、缩放及平移,如图3所示。
图3 透视示意图Fig.3 Perspective schematic diagram
4.5 MVVM模式的应用
MVVM模式将用户界面按照不同职责划分为 Model、View和View Model等3部分,使得代码层次分明,易于维护和移植。本文严格按照MVVM模式进行开发,使得可视化功能与用户界面、数据模型完全解耦合,易用性和可维护性达到了新的高度。下面简述其中关键的设计。
4.5.1 Model设计
为了使可视化代码与具体的数据模型进一步解耦,定义了油藏属于接口,任何实现该接口的网格数据,都可以与可视化代码进行对接,接口定义如下:
public interface IReservoirData:
INotifyPropertyChanged
{
string ColorMap { get;set;}
bool IsReverseColorMap { get;set;}
Vector3D Offset{ get;set;}
Point3D Position{ get;set;}
Vector3D Origin{ get;}
GridValues VisibleValues { get;set;}
int VisibleFaceCount { get;}
Point3D GetVisiblePoint(int Index);
int GetVisibleFacesIdx(int Index);
}
4.5.2 View设计
ReservoirModel3D类负责显示油藏模型,在用户界面,只需要在XAML中绑定数据接口即可。
Camera="{Binding Camera}" EffectsManager="{Binding EM}" ShowCoordinateSystem="True"> ReservoirData="{Binding Data}" />
ReservoirModel3D会与Data绑定,自动监听Data的变化,当Data发生变化时,自动重新绘制三维油藏模型。通过WPF的绑定机制,无需编写任何额外的代码,即可将三维可视化控件集成到三维场景中。
4.5.3 ViewModel设计
在ViewModel中,代码与具体的界面完全无关,只需要操作Camera和Data对象,View中即可立即更新。
public Camera Camera { get;}
public IEffectsManager EM { get;}
public ReservoirData Data { get;}
public ReservoirViewModel()
{
Camera= new PerspectiveCamera();
EM= new DefaultEffectsManager();
Data= new ReservoirData();
}
5 应用效果
开发的三维油藏可视化软件应用界面如图4—图6所示。图4为224×147×29的油藏模型,包括224口井,总单元数为954 912。图5为208×73×99的油藏模型,单元数为1 503 216,图4—图6为软件不同的展示方式。
图4 油藏模型与井组的三维显示Fig.4 3D display of reservoir model and wells
图5 油藏模型单独显示Fig.5 3D display of reservoir model
图6 油藏模型放大并显示格线Fig.6 Display of grid lines in reservoir model
通过以上应用实例,证明了本文开发的软件在性能和功能方面能够满足大规模油藏数据的展示需求。
6 结 论
本文提出了一种基于WPF的油藏模型三维可视化解决方案,采用SharpDX和MVVM模式开发的三维组件。WPF 对 3D 开发相关技术的封装,使得系统的开发更加便利,能有效缩短开发周期,在性能、功能、易用性和可维护性方面,相比传统的开发方式有了很大的提高。应用表明:系统能够准确实时地对油藏模型数据及井轨迹进行可视化,且运行流畅,具有较高的实用价值,同时采用的技术全部为开源技术,不需要任何额外费用,为石油行业数据可视化应用提供了一个新的经济、高效的解决方案。