当前位置:文档之家› 关于光线投射算法的OpenGL高效实现

关于光线投射算法的OpenGL高效实现

Key words 3D reconstruction; OpenGL; ray casting algorithm; transform matrix; tri-linear interpolation; visualization; volume rendering
可视化技术[1]将数据中的信息以图像的方式直 观表达出来,使很多抽象的、难于理解的原理和规 律变得容易理解。直接体绘制算法是诸多可视化算 法中重要的一种,它将三维空间的离散数据直接转 换成二维图像,而不必生成中间几何图元,以反映 数据场中各种信息的综合分布情况。
因此,体数据场的精确投影区域就可以被确定,
从 Bounds[height][2] 区域发出的每条光线几乎都会
与体数据场相交,既避免了无效的光线投射,又不
会出现有效光线的遗漏。
612
电子科技大学学报
第 37 卷
2 数据场的法线编码和明暗表计算
为了提高光线投射算法的交互性和减少每束光
线的计算量,将数据场每个体素的光照计算作为预
第 37 卷 第 4 期 2008年7月
电子科技大学学报 Journal of University of Electronic Science and Technology of China
Vol.37 No.4 Jul. 2008
关于光线投射算法的OpenGL高效实现
解 梅,景孝凯
(电子科技大学电子工程学院 成都 610054)
影坐标,将投影和规范化合并。该变换矩阵为:
⎡ ⎢ ⎢
cot
⎛ ⎜⎝
θ 2
⎞ ⎟⎠
⎢A

M v2n
=
⎢ ⎢
0

⎢0

⎢⎣ 0
0
cot
⎛ ⎜⎝
θ 2
⎞ ⎟⎠
0
0
0
0
Znear + Zfar Znear − Zfar
−1


0⎥


0⎥


2Znear Zfar
⎥ ⎥
Znear − Zfar ⎥
0
⎥⎦
(2)
函数void glViewport(GLint x, GLint y, GLsizei w,
GLsizei h)设置观察窗口,即建立规范化坐标到屏幕
坐标的变换矩阵。该变换矩阵为:
⎡ x1 − x2
⎢ ⎢
2
0
0
x1 + x2 ⎤
2
⎥ ⎥

M n2s
=
⎢ ⎢
0
y1 − y2 2
0
y1 + y2 ⎥
2
⎥ ⎥
XIE Mei and JING Xiao-kai
(School of Electronic Engineering, University of Electronic Science and Technology of China Chengdu 610054)
Abstract The paper use mainly ray casting algorithm to convert the 2D image to 3D image. We use tri-linear interpolation algorithm to calculate the color and opacity of the sampling in order to improve the accuracy of 3 D reconstruction. The algorithm caculates the accurate projective region of 3D regular data field based on the OpenGL library and its 3D view matrices. Consequently it reduces the amount of rays in ray casting algorithm. This method also computes shading tables for the data field in advance according to the light of phone illumination model. In addition, the regular implementation codes of the algorithm are optimized. These stategies work together to speed up the ray casting volume rendering algorithm effectively. The algorithm improve not only the accuracy of 3D reconstruction but also the effective of 3D reconstruction.
能较好地反映数据场的整体结构,通过适当调节参 数,可以很好地显示局部细节。它的主要缺点是计 算量较大,影响图像质量的因素多且相互关联,难 以实现和用户的实时交互。本文利用OpenGL矩阵快 速计算数据场在屏幕空间的精确投影,避免了无效 区域的光线投射;采用预先为数据场计算明暗表的 方法来减少算法实现中的大量计算;在程序实现的 常规代码上给予有效的优化。实验表明,上述措施 能有效地提高光线投射算法的效率,使直接体绘制 可以在当前主流PC机接近实时显示。
示。对于无穷远光源,L是常量,而观察方向V在通
常情况下也为常量。因此Phone光照模型在物体表面
特性一致和光源特性不改变的情况下,仅存在一个
变量,即物体表面单位法向量N,这也是可以作为
数据场生成明暗表的依据。
N L
V P
图2 Phone光照模型示意图
2.2 数据场体素的法向量计算和法线编码
一般采用中心差分法为体素计算法向量,对体
体绘制[2-5]有物空间绘制、像空间绘制和频域绘 制等多种方法,基于像空间的光线投射算法是体绘 制中最常用的算法,其基本思想是从图像平面的每 个像素点发出一条采样光线穿过体素空间,按照一 定的采样步长进行采样;由各种内插算法计算每个 采样点的颜色值和不透明度,然后由前至后进行图 像合成,直到光线穿过体数据场或者被完全吸收。 算法过程包括梯度计算、物质分类、明暗度计算、 重采样和图像合成。光线投射算法[6-10]的主要优点是
处理部分,这样投射光线或者改变传递函数时,甚
至在模型旋转过程中,都只需要作简单的合成运算
即可,而不需要为相关体素重新计算光照。
2.1 Phone光照模型
本文采取最常用的Phone光照模型为每个体素
计算光照,Phone模型的明暗度为:
S (v)
=
Ia Ka
+
Ip
Kd (L ⋅
N ) + Ks (N r+k
【摘要】采用光线投射算法对二维(2D)图片实现三维(3D)重建,用3线性插值算法计算每个采样点的颜色值和不透明度,
提高三维重建图像后的精度。该算法实现主要借助于OpenGL函数库及其三维观察矩阵,以其精确计算规则三维数据场在观察
方向上的二维投影区域,减少了光线投射算法中投射光线数量。根据Phone光照模型为数据场预先计算和保存明暗表,并通过
e1 − c1, e2 − c2 ) ;V = (u0 ,u1,u2 ) ; P0 为世界坐标系中
原点到观察坐标系原点的向量,一般有 P0 =
(e0 , e1, e2 ) 。
MC
建模变换
WC
观察变换
VC
投影变换 窗口变换
PC
规范化/裁剪
NC
D
图1 一般的三维变换流水线
函 数 void gluPerspective(GLdouble θ , GLdouble A, GLdouble Znear ,GLdouble Zfar )建立了 一个透视投影矩阵,即将观察坐标转换为规范化投
步加以限制,首先建立一个以屏幕矩形的高度为大
小 的 二 维 数 组 Bounds[height][2] , 其 中 ,
Bounds[i][0] 和 Bounds[i][1] 分别存储体数据场的
精确投影区域在第 i 行屏幕处的起始坐标和结束坐
标。该数组的计算方法如下:
(1) 计算体数据场的12条棱在屏幕上的投影直

H )n
(6)
式中 Ia为环境光;Ka为环境光因数;Ip为光源强度; Kd为漫反射系数;L为入射光单位法向量的反方向; N为表面单位法向量;Ks为镜面反射系数;H为镜面 反射方向向量, H = (L +V ) / | L +V | ;V为观察方
向单位向量的反方向;n为光洁度因子;r为物体离
观察点的距离;k为常数。明暗度计算模型如图2所
景孝凯(1981 − ),男,硕士
第4期
解 梅 等: 关于光线投射算法的OpenGL高效实现
611
察操作,将模型坐标系中的点变换到屏幕上的像素, 一般的三维变换流水线如图1所示。
在图1中,MC、WC、VC、PC、NC、DC分别 为模型坐标、世界坐标、观察坐标、投影坐标、规 范化坐标和设备坐标。OpenGL中的坐标变换都是通 过与相应的矩阵相乘来实现,OpenGL中的重要观察 函数为:
换矩阵为:
⎡ux uy uz −u ⋅ P0 ⎤
M w2v
=
⎢ ⎢
vx
⎢ ⎢
nx
vy ny
vz nz
−v

P0
⎥ ⎥
−n

P0
⎥ ⎥
(1)
⎣0 0 0 1 ⎦
式 中 n = N / | N |= (nx , ny , nz ) ; u = V × N / |V |=
相关主题