著录项信息
专利名称 | 面向GoCAD软件的植入式三维立体显示方法 |
申请号 | CN200910027127.1 | 申请日期 | 2009-05-22 |
法律状态 | 权利终止 | 申报国家 | 中国 |
公开/公告日 | 2009-10-21 | 公开/公告号 | CN101561935 |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06T15/00 | IPC分类号 | G;0;6;T;1;5;/;0;0;;;G;0;9;G;5;/;0;0查看分类表>
|
申请人 | 南京师范大学 | 申请人地址 | 江苏省南京市宁海路122
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 南京师范大学 | 当前权利人 | 南京师范大学 |
发明人 | 周良辰;闾国年;温永宁;盛业华;吴明光 |
代理机构 | 南京知识律师事务所 | 代理人 | 樊文红 |
摘要
本发明公开了一种面向GoCAD软件的植入式真三维立体显示方法:在所述GoCAD软件采用的3D API调用和显卡显示之间采用植入式的渲染数据拦截技术,对原始的单通道颜色信号和深度信号、三维场景变换矩阵和投影变换矩阵进行捕获;对这些信息进行解析,重构栅格化的三维数据;基于立体视觉原理,自适应地将该场景重新变换到两个不同的视点位置,形成可供立体显示的双目视觉立体像对,驱动显卡对双目立体像对进行立体输出;利用偏振、红绿和闪闭式眼镜等进行真三维立体显示与观测。本发明可以对现有GoCAD软件在不改变其程序和操作模式的情况下实现真三维立体化的场景展示。
1.面向GoCAD软件的植入式三维立体显示方法,其特征是,该方法包括以下步骤:
步骤(1)针对GoCAD软件使用的3D API进行监控与渲染数据拦截:利用API拦截技术,获取三维绘制相关矩阵和三维渲染数据输出,提取实现三维透视变换的透视投影变换矩阵、视口宽高,作为三维场景重构的参数;利用3D API的函数,拦截三维渲染输出,提取显卡帧缓存中的颜色和深度数据,作为三维场景重构的基础;通过代码注入或/和钩子函数技术编写的拦截程序,在三维可视化程序的数据加载阶段,将3D API拦截程序加载到三维可视化程序的进程中,从而拦截和监控3D API调用;
步骤(2)利用透视投影变换矩阵重构栅格化的三维场景数据:通过步骤(1)提取的透视投影变换矩阵和视口宽高,解算出三维渲染控制参数;根据步骤(1)提取的颜色和深度数据,进而解算出每个像素在原始视空间中的三维坐标以及对应的颜色特性,重构目标视空间下栅格化的三维场景数据;
步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对,具体包括下列两种方法:调用3D API,渲染所述步骤(2)中获得的场景数据,在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对生成;或,采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系,将原始视空间下的像素直接变换到目标视空间下;在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对快速生成;
步骤(4)针对不同的立体观察设备进行三维观测,包括:
x.在支持立体显示的设备上,将立体像对分别输出到显卡左右两个通道,进行立体显示;或
y.在不支持立体显示的设备上,将立体像对中,一个图像提取红色通道,另一个图像提取绿色和蓝色通道,将提取的通道融合,形成一个互补色的立体图像,并支持红绿眼镜观察。
2.根据权利要求1所述的三维立体显示方法,其特征是,所述步骤(1)进一步包含以下步骤:
I.透视投影变换矩阵的识别:假设透视投影变换矩阵在一帧的渲染过程中保持一致,将透视投影变换矩阵拦截下来,将矩阵中的特征值作为判据,判断当前拦截的矩阵是否为透视投影变换矩阵;
所述步骤(2)进一步包含以下步骤:
II.建立视点为坐标原点的三维空间坐标系:以步骤I截获的透视投影变换矩阵为参数,建立以视点为坐标原点的视点坐标系:Z轴穿过近平面的中心,近平面的Y轴和X轴方向和该坐标系的Y轴,X轴方向一致,近平面位于近平面值对应的Z轴的刻度上;近平面上X的值域是[-width/2,width/2],Y的值域是[-height/2,height/2],width为透视投影的近平面的宽度,height为透视投影的近平面的高度;在该坐标系中,任意坐标点P(X,Y,Z)在近平面上投影点的坐标值P′(X′,Y′,Z′)由透视投影变换矩阵变换求得,其中Z′对应于帧深度缓存中的深度值,X′=width/2*X/Z;Y′=height/2*Y/Z;Z′=(Z-zNear)/Z*zFar/(zFar-zNear),其中zNear为近平面的Z轴刻度,zFar为远平面的Z轴刻度;
III.栅格化三维场景数据的重构:设视口的宽度为width′、高度为height′,任意三维渲染帧图像像素点的坐标P″′(X″′,Y″′)对应于近平面上的三维坐标Pn(xn,yn,zn),其中xn=(X″′-width′/2)*width/2,yn=(Y″′-height′/2)*height/2;根据对应的深度缓存中的值Z′和公式Z′=(Z-zNear)/Z*zFar/(zFar-zNear),计算出对应的视点坐标系下Z值,任意点坐标P在视点坐标系下的坐标为P(X,Y,Z),其中X=xNear/zNear*Z,Y=yNear/zNear*Z;将所有的三维坐标用三角形面片连接起来,就构成了一个可进行三维渲染的立体表面。
3.根据权利要求1所述的三维立体显示方法,其特征是,所述拦截的3D API函数包括:
(21)3D API创建三维显示环境的函数;
(22)3D API开始一帧场景渲染的函数;
(23)3D API改变当前渲染矩阵的函数;
(24)3D API结束一帧场景渲染的函数;
(25)3D API将渲染数据输出到当前屏幕上的函数。
面向GoCAD软件的植入式三维立体显示方法\n技术领域\n[0001] 本发明涉及三维可视化技术领域,具体涉及一种面向GoCAD软件的植入式三维立体显示方法。\n背景技术\n[0002] 随着计算机技术的发展,立体显示已经成为环境仿真、模拟训练以及规划设计等领域常用的技术手段,甚至开始与电影、电脑游戏等结合产生立体电影和三维游戏融入人们的日常生活。地质三维软件作为一种专业的三维应用软件,在城市地下工程、矿山开采、石油储量分析等方面具有重要的应用。GoCAD软件是一种在PC环境下运行的三维地质可视化软件,可以支持丰富的地质专业数据的分析与可视化。\n[0003] 在三维应用中实现立体视觉是一种潮流,在单一显示设备上观察到立体景物,需要将左、右眼所看到的影像各自独立分开,然后通过特定的外置设备使左右眼看到不同的影像而通过大脑的生理作用形成立体视觉。传统的立体显示需要专业的设备进行立体显示,包括支持左右缓存的显卡和支持双通道显示的立体显示设备。基于上述技术,产生了广为流行的虚拟现实技术,在机器仿真、战场模拟等领域得到了广泛的应用。但是,由于需要专业设备,成本高昂,也限制了立体显示技术的应用,所以立体显示的应用不能得到推广,大量的三维程序还是采用单通道技术进行显示,缺乏立体感,失去了三维程序应有的立体显示特性。同时,由于立体显示需要专门硬件,特殊的编程技巧,也造成了大量的程序在开发时没有考虑立体显示特性,没有在程序中实现支持立体显示的功能,使得这些程序即使在有立体显示功能的硬件上也不能显示立体。这些程序占据了现在三维显示程序的绝大部分,GoCAD也没有突破上述限制,其在建模过程中,用户还是只能看到单通道的透视三维,不能实现三维的立体显示,不能达到最佳的应用效果。\n发明内容\n[0004] 本发明所要解决的问题在于克服GoCAD(下简称GoCAD)软件在三维显示中存在的不足,实现对原软件不加修改的三维立体显示。本发明的核心是利用三维渲染的基本原理,通过拦截显卡结果帧图像中颜色数据和深度数据,解析生成结果帧图像的投影变换矩阵,应用三维渲染的基本原理以及重构栅格化的三维场景,在此场景基础上,应用立体视觉原理,生成立体像对,基于不同的立体显示模式,驱动显卡进行立体输出。\n[0005] 本发明依赖的技术基础是计算机图形学中关于三维渲染的基本模型,即GoCAD系列软件使用的3D API(当前在Windows下GoCAD系列软件均使用OpenGL)的三维渲染的基本模型,包括三维渲染流水线、顶点的变换流水线、Z缓冲区算法等。实现依据是OpenGL API和显卡,两者均是基于该基本模型进行工作的。本发明在不更改GoCAD源代码、二进制代码或计算机硬件结构的情况下,使该计算机软件实现双目视觉的立体三维显示与观测。\n[0006] 计算机三维显示的基本原理是将三维场景经过几何变换和光照处理以及栅格化之后,生成一幅二维栅格图像在输出设备上输出。三维场景中包含一系列的三维对象,三维对象是由一系列顶点构成的几何图元(包括点,线和三角形)组合而成。顶点是一个包含三维空间位置及其对应的渲染参数的坐标点。首先对顶点数据进行透视坐标变换和光照处理。在坐标变换阶段,描述物体几何形状的顶点被变换到视点为中心的坐标系下,再进行光照计算确定每个顶点应该具有的颜色和亮度。计算机图形学的基本显示单元是像素,这些几何对象被栅格化成像素,最后这些像素被送到帧缓存中等待显示,如图2所示。\n[0007] 在三维图形渲染中存在着一系列的坐标变换,最后将物体本身的坐标变换成二维屏幕上的像素坐标。这些坐标变换都是将上一步变换结果作为输出的,构成一个顶点坐标变换的流水线,如图3所示。所有三维对象的坐标均被统一到了同一个坐标系下,经过投影和裁剪形成规格化的坐标,通过栅格化变换形成图像像素。\n[0008] Z缓冲区算法又称深度缓冲算法。由于二维平面坐标在透视投影下可以对应无限多个三维坐标。所以栅格化的几何对象包含了每个像素对应的到视点称为深度值的参数,如果栅格化几何对象像素的深度值小于原来像素,就用这个像素的值代替原来位置的值,这就保证了总是距离视点最近的像素被保存下来。\n[0009] 针对以上原理,实现本发明目的的技术方案是:\n[0010] 面向GoCAD软件的植入式三维立体显示方法,该方法包括以下步骤:\n[0011] 步骤(1)针对GoCAD使用的3D API进行监控与渲染数据拦截;\n[0012] 步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;\n[0013] 步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;\n[0014] 步骤(4)针对不同的立体观察设备进行三维观测。\n[0015] 本发明的方法具体可用下列步骤实现,下列步骤不分先后:\n[0016] a.监控创建三维显示环境的函数,在该函数中加入调用3D API的系统检测函数功能,获取系统立体显示特性,根据相应的立体显示特性,更改原始设定的显示环境中的立体显示模式,在支持立体显示的硬件上开启三维立体显示支持,在不支持立体显示的硬件上,设置标志以便进行红绿立体显示。\n[0017] b.监控开始一帧绘制函数,在该函数中加入代码获取当前绘图帧的视口尺寸,根据渲染的像素格式为立体像对创建临时的缓冲区。\n[0018] c.监控改变当前绘制矩阵函数,在该函数中加入代码以获取三维应用软件对当前绘制矩阵的更改,通过矩阵参数识别场景渲染的投影类型,当是透视投影时,记录该矩阵,作为三维场景重构的关键参数;\n[0019] d.监控将帧缓存输出到显示设备的函数,在监控函数加入代码以获取整个帧中各像素的颜色和深度数据,基于步骤c获取的投影变换矩阵信息,反算每个像素在视点坐标系下的三维坐标,重建出基于像素的栅格化的三维场景;根据人眼睛的立体视觉模型,生成可供立体显示的立体像对。\n[0020] 所述步骤(1)中3D API的监控与渲染数据拦截进一步包括:利用API拦截技术,获取三维绘制相关矩阵和三维渲染数据输出,提取实现三维透视变换的投影矩阵、视口宽高,作为三维场景重构的关键参数;利用3D API的特定函数,拦截三维渲染输出,提取显卡帧缓存中的颜色和深度数据,作为三维场景重构的基础。\n[0021] 3D API拦截是指利用计算机编程技术,对GoCAD使用的3D API函数调用进行监控,并对3D API产生的渲染数据进行拦截在其中插入自定义代码,达到对原有API进行监控或重新实现的目的。API拦截技术成熟且应用广泛,如屏幕取词软件、反病毒软件、网络防火墙等等。本发明所指的3D API渲染拦截是指拦截特定功能的若干关键3D API函数。\n[0022] 所述步骤(1)中还进一步包括针对其实现3D API函数的拦截的具体步骤:针对GoCAD使用的3D API(OpenGL),通过代码注入或/和钩子函数技术编写特定的拦截程序,在三维可视化程序的数据加载阶段,将3D API拦截程序加载到三维可视化程序的进程中,从而拦截和监控3D API调用。本发明所指需要拦截的3D API关键函数如下:\n[0023] (21)3D API创建三维显示环境的函数;\n[0024] (22)3D API开始一帧场景渲染的函数;\n[0025] (23)3D API改变当前渲染矩阵的函数;\n[0026] (24)3D API结束一帧场景渲染的函数;\n[0027] (25)3D API将渲染数据输出到当前屏幕上的函数。\n[0028] 所述步骤(2)进一步包括利用3D API输出到显卡帧缓存中的颜色和深度数据,结合拦截3D API调用而获得的投影参数,来解析生成颜色图像和深度数据的三维空间信息。\n即,通过生成三维渲染输出的投影矩阵和视口宽高,解算出三维渲染关键控制参数(视点位置、近平面、远平面)以及三维渲染输出的颜色和深度数据,进而解算出每个像素在视空间中的三维坐标以及对应的颜色特性,重构视空间下栅格化的三维场景数据。它具体可以包含以下步骤:\n[0029] I.透视投影变换矩阵的识别。在一帧场景的渲染过程中,三维应用软件可能会多次更改投影变换矩阵,只有透视变换矩阵才可以产生透视三维效果。不失一般性,假设透视投影变换矩阵在一帧的渲染过程中保持一致,将透视投影矩阵拦截下来,将矩阵中的特征值作为判据,判断当前拦截的矩阵是否为透视投影变换矩阵。\n[0030] II.建立视点为坐标原点的三维空间坐标系(简称视点坐标系)。以步骤I截获的透视投影变换矩阵为参数,建立以透视点为坐标原点的视图坐标系:Z轴穿过近平面的中心,近平面的Y轴和X轴方向和该坐标系的X轴,Y轴方向一致,近平面位于近平面值对应的Z轴的刻度上。近平面上X的值域是[-width/2,width/2],Y的值域是[-height/2,height/2]。在该坐标系中,任意坐标点P(X,Y,Z)在近平面上的投影点的坐标值P′(X′,Y′,Z′)可以由透视投影变换矩阵变换求得,其中Z′对应于帧深度缓存中的深度值。可得:X′等于width/2*X/Z;Y′等于height/2*Y/Z;Z′等于(Z-zNear)/Z*zFar/(zFar-zNear),其中zNear为近平面的Z轴刻度,zFar为远平面的Z轴刻度。\n[0031] III.栅格化三维场景数据的重构。设视口的宽度为width′、高度为height′,可由OpenGL API相关函数获得。由视口和近平面的比例关系可知任意三维渲染帧图像像素点的坐标P″′(X″′,Y″′)对应于近平面上的三维坐标Pn(xn,yn,zn),其中xn=(X″′-width′/2)*width/2,yn=(Y″′-height′/2)*height/2。对应的帧深度缓存中的深度值Z′,由步骤II Z′等于(Z-zNear)/Z*zFar/(zFar-zNear)可知,对应的视点坐标系下Z值,可得像素点在视点坐标系下的坐标P(X,Y,Z),其中X等于xNear/zNear*Z,Y等于yNear/zNear*Z。\n[0032] 通过调用OpenGL API的读取显卡中颜色缓冲区函数和深度缓冲区函数,利用步骤II中建立的坐标系以及上述关系,可以获得视点坐标系下所有像素点的三维坐标。将所有的三维坐标用三角形面片连接起来,就构成了一个可进行三维渲染的立体表面,该表面通过三维流水线,在任意视角下进行渲染。\n[0033] 所述步骤(3)中“设定两个不同的视点位置并生成立体像对”是利用步骤(2)重构的三维场景,生成两幅影像,形成立体像对。本发明提出基于“立体像素”的三维场景的立体显示模型,所谓立体像素是指将步骤(2)重构的三维场景的每个像素与其对应视点空间的三维坐标一起组成序列[(X,Y,Z),(R,G,B)],构成的一个三维像素空间。针对该空间中的每个像素,按照透视变换原理,计算出其在新视点的像素位置点。\n[0034] 生成立体像对可采用下列两种方法:\n[0035] 方法一.调用3D API,渲染步骤(2)中获得的场景数据,在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对生成。\n[0036] 方法二.采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系,将原始视空间下的像素直接变换到目标视空间下。在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对快速生成。其中:\n[0037] 视点水平偏移,是指新视点距离原始视点在X轴方向上的改变量Dx。\n[0038] 视点垂直偏移,是指新视点距离原始视点在Z轴方向上的改变量Dz。\n[0039] 图像像素偏移,是指生成的图像像素水平方向的附加偏移Dpixel。\n[0040] 则在另一的视点坐标系下,对原始帧图像中点P(X,Y,Z)的像素标在左视点下的坐标X是Width′*(X-Dx)/(Z-Dz)+Dpixel,Y是Height′*Y/(Z-Dz)。该像素在对于右视点坐标系下,坐标按照上述方法计算,但Dx,Dz取负号。\n[0041] 将每个像素的颜色复制到目标位置。对两个视点都应用该方法从而获得立体像对。该方法具有不经过图形流水线,程序编制简单,优化容易等优点。\n[0042] 所述步骤(4)中“针对不同的立体观察设备进行三维观测”是指将步骤(3)生成的立体像对,通过显示设备输出并进行立体观察。本发明生成的立体像对通过如下方式进行三维显示:\n[0043] x.显卡支持的双目立体显示。如在支持立体显示的OpenGL API环境下,在创建设备句柄阶段启动OpenGL API的立体显示模式,将生成的立体像对分别输送到左右两个缓冲区中,实现立体显示。\n[0044] y.在不支持立体显示的显卡上,将立体像对合成为一幅红绿互补色立体图像,从左右立体像对中的一个图像提取红色通道,另一个图像中提取绿色和蓝色通道,将提取的通道融合,形成一个互补色的立体图像。并送回原始的图像缓冲区进行立体显示与观测。\n[0045] z.将立体图像或像对输送到其他支持立体显示设备上。\n[0046] 本发明旨在解决GoCAD程序不能支持立体显示的问题,依靠成熟的代码拦截技术拦截在GoCAD对于3D API的调用进行重新编排。通过监控投影矩阵,获取反算三维场景的关键参数,通过绘制的颜色图像和深度图像,逐象素的反求其三维坐标,并将像素值映射到对应的位置上,形成立体像对。通过各种显示模式进行立体显示,本发明也为现有的大量三维程序的直接立体化提供了一条可行的途径。本发明具有如下特色:\n[0047] (1)解决了在GoCAD不能进行立体显示的问题,提升了在GoCAD的交互和用户体验。\n[0048] (2)实现的算法新颖,通过帧缓冲区中的颜色图像数据和深度数据经过重新分配形成立体像对,算法原理简单,编程实现方便。\n[0049] (3)充分利用了现有的技术资源,由于基于工业标准的OpenGL API开发,具有良好的适应性,对于显卡没有特殊要求。支持多种显示模式,可以在任意显示环境下实现立体显示。\n附图说明\n[0050] 图1本发明实施例1的方法流程图\n[0051] 图2本发明采用的三维渲染的基本模式\n[0052] 图3本发明采用的三维图形的坐标变换流水线\n[0053] 图4本发明实施例1的透视投影与透视变换矩阵\n[0054] 图5本发明实施例1的以视点为中心的坐标系\n[0055] 图6本发明实施例1的立体像对的快速生成方法图\n具体实施方式\n[0056] 下面结合附图和实施例对本发明做进一步详细说明。\n[0057] 实施例1\n[0058] 如图2和图3所示,由于在建模阶段GoCAD均使用OpenGL API作为三维渲染API,故本实施例基于OpenGL API作为实施对象,操作系统平台为Windows XP进行实施。\n[0059] OpenGL API的拦截与监控基于Micorsoft Detours SDK开发。Detours是Microsoft提供的一套Windows平台下进行API调用拦截的开发包,支持Win32所有平台。\n[0060] 如图1所示,面向GoCAD软件的植入式三维立体显示方法,该方法包括以下步骤:\n[0061] 步骤(1)针对GoCAD使用的OpenGL API进行监控与渲染数据拦截;\n[0062] 步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;\n[0063] 步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;\n[0064] 步骤(4)针对不同的立体观察设备进行三维观测。\n[0065] 步骤(1)中OpenGL API的拦截与获取场景渲染数据进一步包括:利用3D API拦截技术,获取三维绘制相关矩阵和三维渲染数据,提取实现三维透视变换的投影矩阵、视口宽高,作为三维场景重构的关键参数;利用3D API的特定函数,拦截三维渲染输出,提取显卡帧缓存中的颜色和深度数据,作为三维场景重构的基础。\n[0066] 步骤(2)进一步包括利用OpenGLAPI输出到显卡帧缓存中的颜色和深度数据,结合拦截OpenGL API调用而获得的投影参数,来解析生成颜色图像和深度数据的三维空间信息。它进一步包含以下步骤:\n[0067] I.透视投影变换矩阵的识别。在一帧场景的渲染过程中,三维应用软件可能会多次更改投影变换矩阵,只有透视变换矩阵才可以产生透视三维效果。不失一般性,假设透视投影变换矩阵在一帧的渲染过程中保持一致。透视投影的各项控制参数与对应的矩阵关系见附图4所示。将透视投影矩阵拦截下来,将矩阵中的特征值作为判据,判断当前拦截的矩阵是否为透视变换投影矩阵。\n[0068] II.建立视点为坐标原点的三维空间坐标系(简称视点坐标系)。以a截获的透视投影变换矩阵为参数,建立以透视点为坐标原点的视图坐标系:Z轴穿过近平面的中心,近平面的Y轴和X轴方向和该坐标系的X轴,Y轴方向一致,近平面位于近平面值对应的Z轴的刻度上。近平面上X的值域是[-width/2,width/2],Y的值域是[-height/2,height/2]。\n在该坐标系中,任意坐标点P(X,Y,Z)在近平面的投影点的坐标值P′(X′,Y′,Z′)可以由透视投影矩阵变换求得,其中Z′对应于帧深度缓存中的深度值,如附图5所示。可得:\nX′等于width/2*X/Z;Y′等于height/2*Y/Z;Z′等于(Z-zNear)/Z*zFar/(zFar-zNear),其中zNear为近平面的Z轴刻度,zFar为远平面的Z轴刻度。\n[0069] III.栅格化三维场景数据的重构。设视口的宽度为width′、高度为height′,可由OpenGL API相关函数获得。由视口和近平面的比例关系可知任意三维渲染帧图像像素点的坐标P″′(X″′,Y″′)对应于近平面上的三维坐标Pn(xn,yn,zn),其中xn=(X″′-width′/2)*width/2,yn=(Y″′-height′/2)*height/2。对应的深度缓存中的值Z′,由步骤II可知,对应的视点坐标系下Z值,可得像素点在视点坐标系下的坐标P(X,Y,Z),其中X等于xNear/zNear*Z,Y等于yNear/zNear*Z。\n[0070] 通过调用OpenGL API的读取显卡中颜色缓冲区函数和深度缓冲区函数,利用步骤II中建立的坐标系以及上述关系,可以获得视点坐标系下所有像素点的三维坐标。将所有的三维坐标用三角形面片连接起来,就构成了一个可进行三维渲染的立体表面,该表面通过三维流水线,在任意视角下进行渲染。\n[0071] 步骤(3)利用步骤(2)重构的三维场景,生成两幅影像,形成立体像对。生成立体像对可采用下列两种方法:\n[0072] 方法一.调用3D API,渲染步骤(2)中获得的场景数据,在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对生成。\n[0073] 方法二.采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系,将原始视空间下的像素直接变换到目标视空间下。在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对快速生成。其中:\n[0074] 视点水平偏移,是指新视点距离原始视点在X轴方向上的改变量Dx。\n[0075] 视点垂直偏移,是指新视点距离原始视点在Z轴方向上的改变量Dz。\n[0076] 图像像素偏移,是指生成的图象像素水平方向的附加偏移Dpixel。\n[0077] 则在另一的视点坐标系下,对原始帧图像中点P(X,Y,Z)的像素标在左视点下的坐标X是Width′*(X-Dx)/(Z-Dz)+Dpixel,Y是Height′*Y/(Z-Dz)。该像素在对于右视点坐标系下,坐标按照上述方法计算,但Dx,Dz取负号。\n[0078] 将每个像素的颜色复制到目标位置。对两个视点都应用该方法从而获得立体像对。该方法具有不经过图形流水线,程序编制简单,优化容易等优点。\n[0079] 步骤(4)将步骤(3)生成的立体像对,通过显示设备输出并进行立体观察。本发明生成的立体像对通过如下方式进行三维显示:\n[0080] x.显卡支持的双目立体显示。如在支持立体显示的OpenGL环境下,在创建设备句柄阶段启动OpenGL的立体显示模式,将生成的立体像对分别输送到左右两个缓冲区中,实现立体显示。或\n[0081] y.在不支持立体显示的显卡上,将立体像对合成为一幅红绿互补色立体图像,从左右立体像对中的一个图像提取红色通道,另一个图像中提取绿色和蓝色通道,将提取的通道融合,形成一个互补色的立体图像。并送回原始的图像缓冲区进行立体显示与观测。或[0082] z.将立体图像或像对输送到其他支持立体显示设备上。\n[0083] 实施例2\n[0084] 一种面向GoCAD软件的植入式三维立体显示方法,包括对以下函数的拦截:\n[0085] a.创建三维显示环境的函数,监控该函数,在监控函数中加入调用3D API的系统检测函数功能,获取系统立体显示特性,根据相应的立体显示特性,更改原始设定的显示环境中的立体显示模式,在支持立体显示的硬件上开启三维立体显示支持,在不支持立体显示的硬件上,设置标志以便进行红绿立体显示。\n[0086] b.开始一帧绘制函数,监控该函数,在监控函数中加入代码获取当前绘图帧的视口尺寸,根据渲染的像素格式为立体像对创建临时的缓冲区。\n[0087] d.将帧缓存输出到显示设备的函数,监控该函数,在监控函数加入代码以获取整个帧中各像素的颜色和深度数据,基于c获取的投影变换矩阵信息,反算每个像素在视点坐标系下的三维坐标,重建出基于像素的栅格化的三维场景;\n[0088] e.基于c获取的投影矩阵信息,反算三维绘制中透视投影的各项参数,根据这些参数、重建栅格化的三维场景,根据人眼睛的立体视觉模型,生成可供立体显示的立体像对。\n[0089] 下面的实施过程是上述方法的具体软件编码过程。\n[0090] 1.基于Detours API,在Windows XP平台下基于Visual Studio 2005建立基于基于C++语言的Win32 DLL工程StereoDriver_CTech_OpenGL作为拦截代码框架。\n[0091] 2.在StereoDriver_CTech_OpenGL中定义一个数据结构OpenGL_Stereo,该数据结构包含如下内容:\n[0092] (1)Windows绘图上下文变量hDC,类型HDC;\n[0093] (2)OpenGL渲染上下文变量hGLRC,类型HGLRC;\n[0094] (3)记录当前硬件是否支持立体显示的变量IsStereoSupport,类型bool;\n[0095] (4)记录视口宽高的变量width,height,类型int;\n[0096] (5)缓存颜色数据的变量ColorBuffer,类型GLbyte*;\n[0097] (6)缓存深度数据的变量DepthBuffer,类型GLfloat;\n[0098] (7)记录当前变换矩阵模式的变量MatrixMode,类型GLMatrixMode[0099] (8)记录当前透视投影矩阵的变量Matrix,类型GLfloat[4][4]\n[0100] (9)创建一个全局的链表gOpenGL_Stereos保存OpenGL_Stereo结构的指针。\n[0101] (10)创建一个全局的OpenGL_Stereo指针ActiveOpenGL_Stereo,初始化为NULL。\n[0102] 3.基于Detours API实现对如下函数的监控:\n[0103] 1)wglCreateContext\n[0104] wglCreateContext根据应用程序的设置,创建一个相应的OpenGL的渲染上下文。\n创建监控函数My_wglCreateContext,在wglCreateContext中实现如下功能:\n[0105] 解析wglCreateContext的参数,判断用户程序是否使用PFD_STEREO标记启动双通道立体渲染支持,如果用户程序启动立体渲染支持,则说明用户程序本身支持立体渲染。\n[0106] 如果用户程序没有启动立体渲染支持,则表明用户程序不支持立体渲染,询问用户是否启动植入式立体支持。\n[0107] 如果用户选择启用植入是立体支持,创建OpenGL_Stereo结构,并保存在一个包含OpenGLStereo结构指针的全局列表中,并初始化。使用wglChoosePixelFormat函数和PF_STEREO标记查询当前显卡是否支持立体显示。如果支持立体显示则将OpenGLStereo的IsStereoSupport设置为true,否则设置为false。\n[0108] 使用原始的wglCreateContext创建HGLRC,并在OpenGLStereo中记录对应的HDC和HGLRC,将OpenGLStereo结构加入到gOpenGL_Stereos中。\n[0109] 2)wglMakeCurrent\n[0110] wglMakeCurrent在若干OpenGL渲染上下文中选择一个做为当前活动的,一般在wglMakeCurrent之后开始和结束一帧的绘制。创建监控函数My_wglMakeCurrent,在My_wglMakeCurrent中实现如下功能:当HDC参数和HGLRC参数不为NULL时,从gOpenGL_Stereos中用这两个参数查找对应hDC和hGLRC的OpenGL_Stereo结构,并赋值给ActiveOpenGL_Stereo变量。如果两个参数均为NULL,则将ActiveOpenGL_Stereo赋值为NULL。\n[0111] 调用原始的wglMakeCurrent。\n[0112] 3)glViewport\n[0113] glViewport将当前活动的OpenGL渲染上下文的视口设置到指定位置和尺寸。创建监控函数My_glViewport,在My_glViewport中实现如下功能:\n[0114] 如果ActiveOpenGL_Stere不为空,则判断新的视口宽高是否和ActiveOpenGL_Stereo中的width,height相等。如果不相等释放OpenGL_Stereo中原有的ColorBuffer和DepthBuffer内存;根据视口的宽高创建颜色缓存区ColorBuffer和深度缓存区DepthBuffer;记录新的width和height。\n[0115] 调用原始的glViewport。\n[0116] 4)glMatrixMode\n[0117] glMatrixMode设置当前活动OpenGL渲染上下文的活动矩阵模型。创建监控函数My_glMatrixMode,在My_glMatrixMode中实现如下功能:\n[0118] 如果ActiveOpenGL_Stereo不为空,则将ActiveOpenGL_Stere的MatrixMode设置为glMatrixMode的参数。\n[0119] 调用原始的glMatrixMode。\n[0120] 5)glLoadMatrixd,glLoadMatrixf\n[0121] glLoadMatrix为活动的OpenGL渲染上下的当前矩阵模式设置矩阵。创建监控函数My_g lMLoadMatrix,在My_glLoadMatrix中实现如下功能:\n[0122] 如果ActiveOpenGL_Stereo不为空,且其变量MatrixMode等于GL_PROJECTION,则记录该函数的m变量到ActiveOpenGL_Stere的Matrix中。\n[0123] 调用原始的glLoadMatrix函数。\n[0124] a.SwapBuffers\n[0125] 该函数将OpenGL渲染的一帧从显存输出到显示设备上。创建监控函数My_SwapBuffers,在该函数中实现如下功能:\n[0126] 如果ActiveOpenGL_Stereo不为空,调用glReadPixels函数,以GLRGB从颜色缓冲区中读取颜色到ActiveOpenGL_Stereo的ColorBuffer变量;调用glReadPixels函数以GL_DEPTH_COMPONENT参数,读取深度值到ActiveOpenGL_Stereo的DepthBuffer中。\n[0127] 从ActiveOpenGL_Stereo的Matrix变量中获得透视投影的近平面的宽度width,高度height,以及近平面的zNear和远平面zFar。\n[0128] 根 据ActiveOpenGL_Stereo 中 记 录 的 视 口 的 宽 度 ViewPortWidth 和ViewPortHeight,创建临时的颜色缓冲区,ColorBufferLeft和ColorBufferRight。\n[0129] 从用户设置中获得视点偏移Dx,深度偏移Dz和像素偏移Dpixel。建立一个循环,对每个ColorBuffer像素,取出对应的像素坐标iX,iY以及颜色RGB以及对应的DepthBuffer中的深度值。利用本发明设计的方法,像素对应的视点坐标系中的坐标P(X,Y,Z)。对左眼以Dx,Dz,Dpixel为参数。使用本发明设计的快速立体像对生成算法,计算P对应的像素坐标PLeft。对右眼以-Dx,-Dz,_Dpixel为参数,使用本发明设计的快速立体像对生成算法,计算P对应的右像素坐标Pright。\n[0130] 将 当 前 像 素 的 颜 色 分 别 赋 值 给ColorBufferLeft的 PLeft位 置,和ColorBufferRight的Pright位置。\n[0131] 判断ActiveOpenGL_Stere的 IsStereoSupport是否 为真。 如果 为真,调用glDrawPixels分别将ColorBufferLeft和ColorBufferRight中的内容拷贝到GL_BACK_LEFT和GL_BACK_RIGT中。否则,将ColorBufferRight中的G,B通道赋值到ColorBufferLeft对应像素的G,B通道上去,形成一幅红绿立体,将ColorBufferLeft的内容拷贝到GL_BACK中。\n[0132] 调用原始的SwapBuffer。\n[0133] 4.编译StereoDriver_CTech_OpenGL工程,生成StereoDriver_CTech_OpenGL.DLL文件\n[0134] 5.将StereoDriver_CTech_OpenGL.DLL文件通过detours SDK的withdll.Exe命令行启动相应程序。
法律信息
- 2016-07-06
未缴年费专利权终止
IPC(主分类): G06T 15/00
专利号: ZL 200910027127.1
申请日: 2009.05.22
授权公告日: 2012.09.05
- 2012-09-05
- 2009-12-16
- 2009-10-21
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2008-09-24
|
2008-03-31
| | |
2
| |
2008-12-31
|
2008-08-04
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |