马媛 王英 王晓波
摘要:现实中,所有的物体都是三维的。但是在计算机中,所有的三维物体必须以二维平面图像的形式表现出来。将物体的三维坐标转换到计算机的像素位置,需要经过几何变换、投影变换、裁剪变换、视口变换等操作,才能正确显示出储层的三维图像。
关键词:OpenGL;三维图形显示;精细油藏描述
中图分类号:TP37 文献标识码:A 文章编号:1009-3044(2014)36-8764-02
1 模块描述
对经随机模拟模块和网格粗化模块处理后的数据体进行三维显示,将所有数据以图形的方式来表示。并显示经过模拟后的相模型,以及网格粗化后的物性参数模型。
2 设计方法
2.1 OpenGL环境和视景体设置
程序运行时,从Display3D类中进入,调用CmainFrame类和CDoc文档类以及Cview视图类。设置OpenGL环境和视景体:
1) 调用CDisplay3DView::OnCreate(LPCREATESTRUCT lpCreateStruct)函数,设置象素格式和OpenGL描述表。
2) 调用CDisplay3DView::OnSize(UINT nType, int cx, int cy)函数设置视景体。
3) 在程序运行将要完成后要销毁OpenGL描述表。
2.2 加载数据
消息函数
void OnFileOpen()
调用对话框类
CLoadDateDlg
调用函数
BOOL CStratum.ReadFile(CString filename)
BOOL CStratum.ReadColorFile(CString filename)
void rdfl(CString filename)
设计思路:
1) 打开对话框,利用对话框中的不同控件来确定打开的文件,利用对话框类中变量记录下需要的变量;
2) 调用函数CStratum.ReadColor(CString filename),读取颜色值和取值范围;
3) 调用CStratum类中的函数ReadData(CString filename),读取文件中的数据;
4) 调用SearchViewBox()为多层显示寻找合适的视见体;
5) 利用DrawScence(),调用CStratum中的绘图函数绘制三维图形;
6) 利用DrawScence(),调用DrawCoord()绘制坐标轴线和WriteScale()标注刻度;
7) 利用DrawScence(),最后绘制色表,并在界面上显示图形的属性,地质层面。
2.3 地质层
利用布尔变量m_bDraw3D 和m_bDrawCoord来控制“地质层”和“坐标”的显示和不显示。
“剥层显示”,利用“剥层显示”对话框实现用户交互,得到要显示的地质层和地质小层。通过函数CStratum::DrawStratum(BOOL Atrr,BOOL flag,int z,BOOL init,float thick,bool m_bBoundary)传递到CStratum类中。再利用DrawScence(),依赖布尔变量m_bDrawDivLayer调用CStratum中的绘图函数绘制只要求显示的地质面的三维图形。
2.4 井位
利用CWell类的成员函数读取测井文件中的井名,在“加载井位”对话框中显示,让用户选择要显示的井位(包括地质层、井位)、井柱长度、井柱半径、井柱颜色、是否显示井名以及井位显示模式。再利用CWell类中的成员函数来绘制图形。
2.5 色表
以布尔变量m_bDrawColorList来控制是否显示色表。对于色表设置,以“色表设置”对话框来实现人机交互,修改色表颜色,色表表示的属性值界限,保存修改后的值到rgb文件中。
2.6 边界
“边界裁减”调用CStratum类中的成员函数ReadIndexFile(CString filename),再以布尔变量m_bDrawBoundary3D来控制调用CStratum对象的成员函数DrawIndices(m_bAttr,m_bDef,m_DivLayer,0,m_fThick,m_bBoundary)来绘制三维图形,这时的三维图形是以三角形为图元来绘制的。
“边界线绘制”,用m_bBoundary来控制是否显示。
“绘制侧面”,用四边形图元来绘制出这个边界侧面,用GL_SMOOTH函数进行插值,得到插值后的侧面。
2.7 变换
主要是对地质层图形进行模型变换得到用户想要的视觉效果,包括两个层次。一是多个地质层间的模型变换,以地质层为单位。一是对地质小层进行模型变换。
2.8 剖切
操作流程:“开始剖切”——“X方向剖切”“Y方向剖切”“任意方向剖切”。
“开始剖切”操作利用OpenGL的矩阵压栈功能,对模型矩阵压入单位矩阵,实现矩阵的初始化。这样就使图形的旋转平移操作失效,保证了剖切时的的精度。
“X方向剖切”,只有点击了“开始剖切”按钮这一项才有效,这时菜单项“X方向剖切”才会有效。这里用布尔变量g_bMenu来控制菜单项的是否变灰。
函数GetSectionX(m_xcut,m_ycut) 得到每个地质层的切面数据的具体算法如下:endprint
1) 得到鼠标点的世界坐标(m_xcut,m_ycut);
2) 判断这一点在Y方向的第几个网格节点上;
3) 沿X方向剖切,剖切面的上的所有点的y坐标就是m_ycut;
4) 剖切面上的所有点的x坐标就是这一行网格节点的x坐标;
5) 剖切面上的所有点的z坐标是经过线性插值而得到( (m_ycut-mesh.y)/dy*((mesh+1).z-mesh.z)+mesh.z);
剖切面上的所有点的属性经过线性插值而得到( (m_ycut-mesh.y)/dy*((mesh+1).attr-mesh. attr)+mesh. attr)。
3 程序流程图
图1 地质层三维显示的程序流程图
4 结束语
目前为止,OpenGL依然是行业领域中最为广泛的2D/3D 图形 API,是一个针对图形硬件开放的三维图形软件包,独立于硬件设备、窗口系统和操作系统,可以很方便在各种平台上移植。它提供了120多个函数,开发者可以用这些函数来建立三维模型和进行三维实时交互。技术人员可以根据其三维显示来完成油气储层的建模工作,以此指导精细油藏描述。
参考文献:
[1] 曾新平, 杨自安, 刘碧虹,等. 地质体三维可视化建模的技术方法研究[J]. 地矿与地质, 2005, 19(107): 103-106.
[2] Liu J,Yang F.Analyzing structural evolution and the significance of oil-gas geology in Xixuan area of Shiwu Fault depression by using 3D seismic data Jianghan Shiyou Xueyuan Xuebao/Journal of Jianghan Petroleum Institute,2005(27).
[3] 吴健生,王仰麟,曾新平,等.三维可视化环境下矿体空间数据插值[J].北京大学学报,2004,40(4) :635-642.
[4] 刘祚秋,周翠英,赵旭升,等.三维地层模型及可视化技术研究[J].中山大学学报,2003,42(4) :41-44.
1) 得到鼠标点的世界坐标(m_xcut,m_ycut);
2) 判断这一点在Y方向的第几个网格节点上;
3) 沿X方向剖切,剖切面的上的所有点的y坐标就是m_ycut;
4) 剖切面上的所有点的x坐标就是这一行网格节点的x坐标;
5) 剖切面上的所有点的z坐标是经过线性插值而得到( (m_ycut-mesh.y)/dy*((mesh+1).z-mesh.z)+mesh.z);
剖切面上的所有点的属性经过线性插值而得到( (m_ycut-mesh.y)/dy*((mesh+1).attr-mesh. attr)+mesh. attr)。
3 程序流程图
图1 地质层三维显示的程序流程图
4 结束语
目前为止,OpenGL依然是行业领域中最为广泛的2D/3D 图形 API,是一个针对图形硬件开放的三维图形软件包,独立于硬件设备、窗口系统和操作系统,可以很方便在各种平台上移植。它提供了120多个函数,开发者可以用这些函数来建立三维模型和进行三维实时交互。技术人员可以根据其三维显示来完成油气储层的建模工作,以此指导精细油藏描述。
参考文献:
[1] 曾新平, 杨自安, 刘碧虹,等. 地质体三维可视化建模的技术方法研究[J]. 地矿与地质, 2005, 19(107): 103-106.
[2] Liu J,Yang F.Analyzing structural evolution and the significance of oil-gas geology in Xixuan area of Shiwu Fault depression by using 3D seismic data Jianghan Shiyou Xueyuan Xuebao/Journal of Jianghan Petroleum Institute,2005(27).
[3] 吴健生,王仰麟,曾新平,等.三维可视化环境下矿体空间数据插值[J].北京大学学报,2004,40(4) :635-642.
[4] 刘祚秋,周翠英,赵旭升,等.三维地层模型及可视化技术研究[J].中山大学学报,2003,42(4) :41-44.
1) 得到鼠标点的世界坐标(m_xcut,m_ycut);
2) 判断这一点在Y方向的第几个网格节点上;
3) 沿X方向剖切,剖切面的上的所有点的y坐标就是m_ycut;
4) 剖切面上的所有点的x坐标就是这一行网格节点的x坐标;
5) 剖切面上的所有点的z坐标是经过线性插值而得到( (m_ycut-mesh.y)/dy*((mesh+1).z-mesh.z)+mesh.z);
剖切面上的所有点的属性经过线性插值而得到( (m_ycut-mesh.y)/dy*((mesh+1).attr-mesh. attr)+mesh. attr)。
3 程序流程图
图1 地质层三维显示的程序流程图
4 结束语
目前为止,OpenGL依然是行业领域中最为广泛的2D/3D 图形 API,是一个针对图形硬件开放的三维图形软件包,独立于硬件设备、窗口系统和操作系统,可以很方便在各种平台上移植。它提供了120多个函数,开发者可以用这些函数来建立三维模型和进行三维实时交互。技术人员可以根据其三维显示来完成油气储层的建模工作,以此指导精细油藏描述。
参考文献:
[1] 曾新平, 杨自安, 刘碧虹,等. 地质体三维可视化建模的技术方法研究[J]. 地矿与地质, 2005, 19(107): 103-106.
[2] Liu J,Yang F.Analyzing structural evolution and the significance of oil-gas geology in Xixuan area of Shiwu Fault depression by using 3D seismic data Jianghan Shiyou Xueyuan Xuebao/Journal of Jianghan Petroleum Institute,2005(27).
[3] 吴健生,王仰麟,曾新平,等.三维可视化环境下矿体空间数据插值[J].北京大学学报,2004,40(4) :635-642.
[4] 刘祚秋,周翠英,赵旭升,等.三维地层模型及可视化技术研究[J].中山大学学报,2003,42(4) :41-44.