基于OpenGL的三维油藏可视化模型

1 引言
    
通过地震、测井可得到关于油藏地层测试点孔隙度、渗透率等物性参数,但这些数据数量庞大,难以直接进行地质分析。为了解油层结构和分布,需要将油藏地层模型在计算机上再现,并对其进行一些交互式操作及初步处理。
    系统实现方法是:首先组织数据(几何顶点,物性参数值等)及提取可视面,并与所需要的目标结合,实现对模型的绘制。其次,提供对模型的分解和剖切方法,实现由数据驱动的对模型的操作控制。

2 数据处理与参数的颜色索引
2.1 系统的地质数据
    
系统读入的原始网格数据示例如下:


    第一行数据的前3个数据数据分别表示X,Y,Z轴方向上的网格个数,第4~6个数据分别表示X,Y,Z轴方向上的原点坐标,而第7~8个数据表示沿X,Y轴方向的网格间距大小。第二行数据"2"表示以下是两列数据,第一列数据(如940.700)表示深度值,第二列数据(如73.000)表示对应点的参数值。
    由于网格结点在xoy平面上是规则的顺序排列,给出已知的沿x,y方向的网格间距dx,dy,网格数Nx,Ny和几何坐标系原点坐标x0,y0,z0,则任一网格结点Node的空间坐标和参数为:

    
式中:i的范围为[O,Nx-1],j的范围为[0,Ny-1];k为结点Node(i,j)处深度的序数,其值与深度的排列方式有关。dpk,sk为第k点处的深度和物性参数。
2.2 处理原始数据
    
由于原始数据采用大地坐标,为方便绘图,应对数据进行坐标变换。将X,Y,Z上数据范围变换到-1~1之间,经过缩放变换,才能在视图区显示出图形。原始数据在测量时可能存在误差,因此在读入数据后需对数据进行有效性检验。
2.3 参数的颜色索引
    OpenGL的颜色索引模式通过建立一个颜色索引表(又称彩色表)确定所绘制物体的颜色。彩色表的建立可通过指定彩色表两端的基色和尾色,插值计算出中间其它颜色,分别赋予相应索引号。在给模型着色时,将读人数据点对应的参数值转化成彩色表上的索引号,便可确定参数的颜色。由于彩色表上的索引号对应的参数是离散的,应对参数值在彩色表中对应的位置作四舍五人以精确给出其索引号。设参数存储在数组parameter中,color_num为彩色表长度。将参数转化为颜色索引号p的代码段如下:

对应的索引号

    

    以上创建出来的颜色可能较单调,一些位于中间部分的参数值对应的颜色区别不明显。一种改进方法是将彩色表分成4段,每一段只控制一种颜色分量的变化,这样彩色表的颜色变化种类大大增加了,使位于中间部分的参数值颜色区分很明显,可更直观的反映出油藏情况。
    基色和尾色通常根据油藏描述的实际要求指定,例如类蓝色(表示水)和类红色(表示油),分别对应物性参数(如渗透率)的最小值和最大值。

3 建立三维地质数据模型
3.1 绘制三维地质模型的基本思想
    
实现三维地质模型绘制的关键步骤是对数据体建模。由对读入数据的排列结构分析可知,原始网格数据形成了一个三维地层模型。除了在垂直方向(Z方向)上的两个面有上下起伏外,其余的面均是平行于ZOY,面或ZOX面的平面。如图1所示。

    地层模型的可视面即底面、顶面、左面、右面、前面及后面,因此只画这6个面的外侧就可以绘制出整个6面体。问题便转化成提取这6个面上的数据,用OpenGL的绘图技术对每一个面分别进行绘制。
3.2 三维地质数据体模型的生成
    
模型立方体的6个面由很多小4边形组成,可采用OpenGL画连续4边形的方法将每一个面画出来。填充颜色则可采用OpenGL的平滑(SMOOTH)着色方式,定义出顶点的颜色后,OpenGL便自动地对4边形内的颜色插值计算,进行颜色渐变绘制。着色之前采用Z缓存(Z_buffer)技术通过对物体进行深度测试的方法实现消隐。
    以底面创建为例,考虑一般情况,设x轴上的网格个数为x_lenth,z轴的数据存储在数组z_data中,当前绘制的4边形片序数为循环变量j,各顶点的颜色值由参数值转化成颜色索引值确定,并由向量模式给出。自动提取底面数据并绘制底面的程序段为:

    
   其中,函数getparaindex()返回对应参数的颜色索引值。底面绘制完成后,以此类推,可提取其它可视面数据(顶点及其排列顺序),同样对其它可视面进行绘制、消隐和着色,由此生成三维油藏地质模型。

4 模型操作
4.1 数据体拨层
    
通过对数据体进行拨层,即沿Z轴分解数据体的层面,按层提取并绘制数据体的可视面,可以得到拨层面的图形,还可以得到拨层后数据块的图形。拨层面的绘制可通过绘制数据体被拨层后的顶面图形实现。在VC中使用Slider控件传递参数,确定"显示拨层面"操作的次数,这样可显示多个拨层面,通过旋转等操作,可清楚的看出拨层面之间的油藏情况,如图2所示。

4.2 切片和切块
    
通过对数据体切片,即切割数据体的X轴、Y轴,得到剖面或截面的图形。垂直于X轴、Y轴的一系列的切割点的位置由Visual C++中的鼠标响应程序得到,而切割点的颜色通过切割点两旁的网格数据点的颜色插值得到。这其中须注意两个问题:①Visual C++中数据和OpenGL中数据的转化。因通过双击鼠标左键选择切割点,得到的是VC中的响应坐标,需要把其转化成OpenGL中的坐标。由变换语句glFrustum();可知在OpenGL中窗口的宽和高,而且可知VC中窗口的大小,因此二者之间存在一个比例关系,再考虑X轴、Y轴的长度因素,可得到切割点在OpenGL中的坐标。②关于得到切割点颜色。OpenGL中采取平滑模式(GL_SMOOTH)时,给定多边形内各点的颜色是通过顶点颜色插值得到的。因此,当切割点选择在给定网格点之间时,切割点的颜色可通过颜色捕值得到。绘制时需注意顶点和颜色的对应关系。利用某油田数据绘制的切片图如图3所示。

    切块功能和切片功能类似,但得到的不是一个面,而是一个数据体。该功能的第一步和切片功能相似,要得到切割点在OpenGL中的坐标。第二步画数据体图形的时候,不再是只画其中的一个面,而是要画数据体的6个面,因此该功能和切片、旋转等功能综合使用时,要注意功能标志的设置问题。利用某油田数据绘制的切块图如图4所示。

5 结语
    提出了一种基于OpenGL建立三维油藏地质数据模型的简便方法,在根据实际要求创建彩色表并将原始物性参数转化为颜色索引值的基础上,可自动提取网格数据体可视面上的数据,然后利用OpenGL绘图技术对模型绘制。与传统的三维油藏可视化软件系统比较,这里提出的系统绘制效率更高,特别是对模型进行拨层、切片、切块等操作处理是该系统的特色。

猜你喜欢

转载自blog.csdn.net/eric_e/article/details/81160184