【图像处理】小谈体绘制可视化

  我过去三年的三维图像处理工作,涉及到了不少领域。为了提升处理速度,我大力学习C++和并行化;为了快速调试查看结果,我学习了计算机三维可视化,把面绘制和体绘制都研究了一遍。这里我把我所学的体绘制可视化知识,粗略说一下。
  计算机在进行可视化时,在不考虑物体内部信息的情况下,为了节约资源,会建立物体表面轮廓的面模型数据并显示出来,而不会绘制物体内部。现代计算机绘制三角面片十分高效,可以实时绘制由几亿个三角面片组成的面模型。然而随着技术发展和现代科学研究的需要,我们开始需要获取物体整体数据信息,这就需要使用计算机体绘制来绘制出完整的物体。
  我们常用的三维数据,是抽象意义上的三维数组。计算机显示屏幕是二维的,因此我们实际看到的是三维数组,经过处理之后投影在屏幕上的像。体绘制的目标就是计算投影在屏幕上的图像。
  根据投影方法,体绘制一般可分为合成体绘制、最值投影绘制、等值面绘制等。合成体绘制方法,需要建立称为传递函数的映射表,将不同位置的不同像素,用传递函数映射后,再把视线方向上的平行的像素混合起来投影到屏幕上。最值投影和合成体绘制类似,只不过投影的值,直接取视线方向上的像素最值。等值面绘制,则是从屏幕出发沿着视线向前搜索,直到抵达等于给定阈值的像素,然后只将该像素投影到屏幕;也可以在获取指定像素点后,在该点处用marching cube方法建立基于三角面片的面模型,然后用三角面片简化算法,在尽量不降低可视化效果的情况下减少三角面片数量,并绘制出来。现有面片简化算法,最高可以简化90%以上的三角面片。
  根据实际的贴图方法,体绘制可粗略分为简单二维切片绘制、实时二维切片绘制和raycasting光线投影绘制。绘制的物体可看作空间中的长方体。在体绘制操作中,我们将三维数据变为三维纹理数据,贴到长方体中,即执行一次体绘制操作。简单二维切片绘制方法,根据视线的主方向判断出沿着x/y/z轴,对绘制物体进行切片,然后在切片上贴图;缺点是,当我们斜向绘制物体时,屏幕上可以明显看到切片痕迹,效果很假。实时二维体绘制,沿着视线方向,对长方体逐层进行垂直切割,长方体切片形状从三角形到六边形均有可能,因此获取每一层的切片是计算难点。raycasting方法,从屏幕每个像素点,开始沿着视线方向向前发出射线,射线穿过需要绘制的物体,其相交部分线段的像素信息,经过映射处理反向投影到屏幕,即可完成绘制。
  为了方便、快速地获取屏幕每个点发出的射线与待绘制物体的交点,raycasting方法会预先进行离屏渲染来计算交点。离屏渲染指计算机正常绘制物体,但是并不显示在屏幕,而是输出到内存中进行其它处理。离屏渲染流程中,raycasting方法绘制一个彩色长方体,其表面(x,y,z)处的颜色值是归一化的位置值。绘制一次frontface,离屏渲染图像中的长方体表面的颜色给出了视线与长方体物体正面相交的位置;绘制一次backface,离屏渲染图像中的长方体的表面颜色给出了视线与长方体物体背面相交的位置。这样我们获取屏幕上每个点发出的射线,与待绘制的长方体物体相交的线段两端,也即获取了视线方向上,屏幕上每个点对应的需要进行投影处理的数据位置范围。我们对每个像素点经过同样的投影处理得到二维投影图像,之后贴到屏幕即可显示体绘制结果。
  【图像处理】小谈体绘制可视化_第1张图片

你可能感兴趣的:(图像处理,综合算法,C++)