面向GoogleEarth与SketchUp的真三维立体显示方法

文档序号:6481521阅读:325来源:国知局
专利名称:面向Google Earth与Sketch Up的真三维立体显示方法
技术领域
本发明涉及三维可视化技术领域,具体涉及一种面向Google Earth与Sketch Up软件 的植入式真三维立体渲染方法。
背景技术
随着计算机技术的发展,立体显示已经成为环境仿真、模拟训练以及规划设计等领域 常用的技术手段,甚至开始与电影、电脑游戏等结合产生立体电影和真三维游戏融入人们 的日常生活。虚拟地球软件作为一种重要的三位应用系统,以期丰富的数据,友好的用户 体验受到了广泛的关注,Google Earth软件就是其中之一,Google Sketch Up是配合Google Earth推出的一个三维快速建模软件,为Google Earth提供地物建模工具。
在三维应用中实现立体视觉是一种潮流,在单一显示设备上观察到立体景物,需要将 左、右眼所看到的影像各自独立分开,然后通过特定的外置设备使左右眼看到不同的影像 而通过大脑的生理作用形成立体视觉。传统的立体显示需要专业的设备进行立体显示,包 括支持左右缓存的显卡和支持双通道显示的立体显示设备。基于上述技术,产生了广为流 行的虚拟现实技术,在机器仿真、战场模拟等领域得到了广泛的应用。但是,由于需要专 业设备,成本高昂,也限制了立体显示技术的应用,所以立体显示的应用不能得到推广, 大量的三维程序还是采用单通道技术进行显示,缺乏立体感,失去了三维程序应有的立体 显示特性。同时,由于立体显示需要专门硬件,特殊的编程技巧,也造成了大量的程序在 开发时没有考虑立体显示特性,没有在程序中实现支持立体显示的功能,使得这些程序即 使在有立体显示功能的硬件上也不能显示立体。这些程序占据了现在三维显示程序的绝大
部分,Google Earth与Sketch Up也没有突破上述限制,其在建模过程中,用户还是只能 看到单通道的透视三维,不能实现真三维的立体显示,不能达到最佳的应用效果。

发明内容
本发明所要解决的问题在于克服Google Earth与Sketch Up软件(下简称Google软 件)在三维显示中存在的不足,实现对原软件不加修改的真三维立体显示。本发明的核心 是利用三维渲染的基本原理,通过拦截显卡结果帧图像中颜色数据和深度数据,解析生成 结果帧图像的投影变换矩阵,应用三维渲染的基本原理以及重构栅格化的三维场景,在此 场景基础上,应用立体视觉原理,生成立体像对,基于不同的立体显示模式,驱动显卡进
5行立体输出。
本发明依赖的技术基础是Google软件使用的3D API (0penGL和Direct3D)的三维渲 染的基本模型,包括三维渲染流水线,顶点的变换流水线,Z缓冲区算法,在不更改Google 软件源代码、二进制代码或计算机硬件结构的情况下,使该计算机软件实现双目视觉的立 体真三维显示与观测。
计算机三维显示的基本原理是将三维场景经过几何变换和光照处理以及栅格化之后,
生成一幅二维栅格图像在输出设备上输出。三维场景中包含一系列的三维对象,三维对象 是由一系列顶点构成的几何图元(包括点,线和三角形)组合而成。顶点是一个包含三维 空间位置及其对应的渲染参数的坐标点。首先对顶点数据进行透视坐标变换和光照处理。 在坐标变换阶段,描述物体几何形状的顶点被变换到视点为中心的坐标系下,再进行光照 计算确定每个顶点应该具有的颜色和亮度。计算机图形学的基本显示单元是像素,这些几 何对象被栅格化成像素,最后这些像素被送到帧缓存中等待显示,如图2所示。
在三维图形渲染中存在着一系列的坐标变换,最后将物体本身的坐标变换成二维屏幕 上的像素坐标。这些坐标变换都是将上一步变换结果作为输出的,构成一个顶点坐标变换 的流水线,如图3所示。所有三维对象的坐标均被统一到了同一个坐标系下,经过投影和 裁剪形成规格化的坐标,通过栅格化变换形成图像像素。
Z缓冲区算法又称深度缓冲算法。由于二维平面坐标在透视投影下可以对应无限多个 三维坐标。所以栅格化的几何对象包含了每个像素对应的到视点称为深度值的参数,如果 栅格化几何对象像素的深度值小于原来像素,就用这个像素的值代替原来位置的值,这就 保证了总是距离视点最近的像素被保存下来。
针对以上原理,实现本发明目的的技术方案是
面向Google Earth与Sketch Up软件的植入式真三维立体渲染方法,该方法包括以下 步骤
步骤(1)针对Google软件使用的3D API(包括OpenGL和Direct3D)进行监控与渲染 数据拦截;
步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;
步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;
步骤(4)针对不同的立体观察设备进行真三维观测。
本发明的方法具体可用下列步骤实现,下列步骤不分先后
6a. 监控创建三维显示环境的函数,在该函数中加入调用3D API的系统检测函数功能, 获取系统立体显示特性,根据相应的立体显示特性,更改原始设定的显示环境中的立体显 示模式,在支持立体显示的硬件上开启真三维立体显示支持,在不支持立体显示的硬件上, 设置标志以便进行红绿立体显示;
b. 监控开始一帧绘制的函数,在该函数中加入代码获取当前绘图帧的视口尺寸,根据 渲染的像素格式为立体像对创建临时的缓冲区;
c. 监控改变当前绘制矩阵的函数,在该函数中加入代码以获取三维应用软件对当前绘 制矩阵的更改,通过矩阵参数识别场景渲染的投影类型,当是透视投影时,记录该矩阵, 作为三维场景重构的关键参数;
d. 监控将帧缓存输出到显示设备的函数,在监控函数加入代码以获取整个帧中各像素 的颜色和深度数据,基于步骤c获取的投影变换矩阵信息,反算每个像素在视点坐标系下 的三维坐标,重建出基于像素的栅格化的三维场景;根据人眼睛的立体视觉模型,生成可 供立体显示的立体像对。
所述步骤(1)中3D API的监控与渲染数据拦截进一步包括利用API拦截技术,获
取三维绘制相关矩阵和三维渲染数据输出,提取实现三维透视变换的投影矩阵、视口宽高,
作为三维场景重构的关键参数;利用3D API的特定函数,拦截三维渲染输出,提取显卡
帧缓存中的颜色和深度数据,作为三维场景重构的基础。
3D API拦截是指利用计算机编程技术,对Google软件使用的3D API函数调用进行监 控,并对3D API产生的渲染数据进行拦截在其中插入自定义代码,达到对原有API进行 监控或重新实现的目的。API拦截技术成熟且应用广泛,如屏幕取词软件、反病毒软件、 网络防火墙等等。本发明所指的3D API渲染拦截是指拦截特定功能的若干关键3D API函 数。
所述步骤(1)中还进一步包括针对其实现3DAPI函数的拦截的具体步骤针对Google 软件使用的3D API,通过代码注入或/和钩子函数技术编写特定的拦截程序,在三维可视 化程序的数据加载阶段,将3D API拦截程序加载到三维可视化程序的进程中,从而拦截 和监控3D API调用。本发明所指需要拦截的3D API关键函数如下
(21) 3D API创建三维显示环境的函数;
(22) 3D API开始一帧场景渲染的函数;
(23) 3D API改变当前渲染矩阵的函数;(24) 3D API结束一帧场景渲染的调用;
(25) 3D API将渲染数据输出到当前屏幕上的函数。
所述步骤(2)进一步包括利用3D API输出到显卡帧缓存中的颜色和深度数据,结合 拦截3D API调用而获得的投影参数,来解析生成颜色图像和深度数据的三维空间信息。 即,通过生成三维渲染输出的投影矩阵和视口宽高,解算出三维渲染关键控制参数(视点 位置、近平面、远平面)以及三维渲染输出的颜色和深度数据,进而解算出每个像素在视 空间中的三维坐标以及对应的颜色特性,重构视空间下栅格化的三维场景数据。它具体可 以包含以下步骤
I. 透视投影变换矩阵的识别。在一帧场景的渲染过程中,三维应用软件可能会多次更 改投影变换矩阵,只有透视变换矩阵才可以产生透视三维效果。不失一般性,假设Google 软件在一帧的渲染过程中保持一致,将透视投影矩阵拦截下来,将矩阵中的特征值作为判 据,判断当前拦截的矩阵是否为透视投影矩阵。
II. 建立视点为坐标原点的三维空间坐标系(简称视点坐标系)。以步骤I截获的透视 投影变换矩阵为参数,建立以透视点为坐标原点的视图坐标系Z轴穿过近平面的中心, 近平面的Y轴和X轴方向和该坐标系的X轴,Y轴方向一致,近平面位于近平面值对应的 Z轴的刻度上。近平面上X的值域是[iidth/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),其中Z'对应于深度缓存中的值。
in.栅格化三维场景数据的重构。设视口的宽度为width'、高度为height',可由3D API相关函数获得。由视口和近平面的比例关系可知任意三维渲染帧图像像素点的坐标 P''' (X' , , , Y''')对应于近平面上的三维坐标Pn(xn , yn , zn), 其中 xn=(X,' , -width' /2)*width/2, yn=(Y, ,' -height' /2)*height/2。对应的深度缓存中的值 Z,,由步骤II可知,对应的视点坐标系下Z值为Z' *(zFar-zNear)/zFar+zNear,可得像素 点在视点坐标系下的坐标P(X, Y, Z),其中X等于xNear/zNear*Z, Y等于yNear/zNear*Z。
通过调用3D API的读取显卡中颜色缓冲区函数和深度缓冲区函数,利用步骤II中建 立的坐标系以及上述关系,可以获得视点坐标系下所有像素点的三维坐标。将所有的三维 坐标用三角形面片连接起来,就构成了一个可进行三维渲染的立体表面,该表面通过三维
8流水线,在任意视角下进行渲染。
所述步骤(3)中"设定两个不同的视点位置并生成立体像对"是利用步骤(2)重构的三 维场景,生成两幅影像,形成立体像对。本发明提出基于"立体像素"的三维场景的立体 显示模型,所谓立体像素是指将步骤(2)重构的三维场景的每个像素与其对应视点空间的 三维坐标一起组成序列[(X,Y,Z), (R,G,B)],构成的一个三维像素空间。针对该空间中的 每个像素,按照透视变换原理,计算出其在新视点的像素位置点。
生成立体像对可采用下列两种方法
方法一.调用3D API,渲染步骤(2)中获得的场景数据,在原始图像作为左视点图 像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不 保存原始图像情况下,生成左右视点图像,从而实现立体像对生成。
方法二.采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系, 将原始视空间下的像素直接变换到目标视空间下。在原始图像作为左视点图像情况下,生 成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像 情况下,生成左右视点图像,从而实现立体像对快速生成。其中-
视点水平偏移,是指新视点距离原始视点在X轴方向上的改变量A 。
视点垂直偏移,是指新视点距离原始视点在Z轴方向上的改变量A。
图像像素偏移,是指生成的图像像素水平方向的附加偏移4 w。
则在另一的视点坐标系下,对原始帧图像中点P(X,Y,Z)的像素标在左视点下的坐标X 是Width' * (X-Dx) / (Z-Dz) +Dpixel, Y是Height' *Y/ (Z-Dz)。该像素在对于右视点坐标系下, 坐标按照上述方法计算,但Dx,Dz取负号。
将每个像素的颜色复制到目标位置。对两个视点都应用该方法从而获得立体像对。该 方法具有不经过图形流水线,程序编制简单,优化容易等优点。
所述步骤(4)中"针对不同的立体观察设备进行真三维观测"是指将步骤(3)生成的 立体像对,通过显示设备输出并进行立体观察。本发明生成的立体像对通过如下方式进行 真三维显示
x.显卡支持的双目立体显示。如在支持立体显示的OpenGL API环境下,在创建设备句 柄阶段启动OpenGL API的立体显示模式,将生成的立体像对分别输送到左右两个缓冲区 中,实现立体显示。y.在不支持立体显示的显卡上,将立体像对合成为一幅红绿互补色立体图像,从左右 立体像对中的一个图像提取红色通道,另一个图像中提取绿色和蓝色通道,将提取的通道
融合,形成一个互补色的立体图像。并送回原始的图像缓冲区进行立体显示与观测。 z.将立体图像或像对输送到其他支持立体显示设备上。 本发明旨在解决Google软件不能支持立体显示的问题,依靠成熟的代码拦截技术拦截 在Google软件对于的3DAPI调用进行重新编排。通过监控投影矩阵,获取反算三维场景 的关键参数,通过绘制的颜色图像和深度图像,逐象素的反求其三维坐标,并将像素值映 射到对应的位置上,形成立体像对。通过各种显示模式进行立体显示,本发明也为现有的 大量三维程序的直接立体化提供了一条可行的途径。本发明具有如下特色
(1) 解决了在Google软件不能进行立体显示的问题,提升了在Google软件的交互 和用户体验。
(2) 实现的算法新颖,通过帧缓冲区中的颜色图像数据和深度数据经过重新分配形成 立体像对,算法原理简单,编程实现方便。
(3) 充分利用了现有的技术资源,由于基于工业标准的3D API开发,具有良好的适 应性,对于显卡没有特殊要求。支持多种显示模式,可以在任意显示环境下实现立体显示。


图1本发明实施例1的方法流程图
图2本发明采用的三维渲染的基本模式
图3本发明采用的三维图形的坐标变换流水线
图4本发明实施例1的透视投影与透视变换矩阵
图5本发明实施例1的以视点为中心的坐标系
图6本发明实施例1的立体像对的快速生成方法图
具体实施例方式
下面结合附图和实施例对本发明做进一步详细说明。 实施例l
如图2和图3所示,Google Earth使用两种3D API, —种是0penGL, 一种是Direct3D, 在建模阶段Google SketchUp支持0penGL API,操作系统平台为Windows XP进行实 施。
10本实施例采用0penGL API做为实施对象。
如图1所示,面向Google Earth与Sketch Up软件的植入式真三维立体渲染方法,该 方法包括以下步骤
步骤(1)针对Google Earth与Sketch Up使用的OpenGL API进行监控与渲染数据拦
截;
步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;
步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;
步骤(4)针对不同的立体观察设备进行真三维观测。
步骤(1)中OpenGL API的拦截与获取场景渲染数据进一步包括利用OpenGL API拦 截技术,获取三维绘制相关矩阵和三维渲染数据,提取实现三维透视变换的投影矩阵、视 口宽高,作为三维场景重构的关键参数;利用Open GLAPI的特定函数,拦截三维渲染输 出,提取显卡帧缓存中的颜色和深度数据,作为三维场景重构的基础。
步骤(2)进一步包括利用OpenGL API输出到显卡帧缓存中的颜色和深度数据,结合拦 截OpenGL API调用而获得的投影参数,来解析生成颜色图像和深度数据的三维空间信息。 它进一步包含以下步骤
I.透视投影变换矩阵的识别。在一帧场景的渲染过程中,三维应用软件可能会多次更 改投影变换矩阵,只有透视变换矩阵才可以产生透视三维效果。不失一般性,假设透视投 影变换矩阵在一帧的渲染过程中保持一致。透视投影的各项控制参数与对应的矩阵关系见 附图4所示。将透视投影矩阵拦截下来,将矩阵中的特征值作为判据,判断当前拦截的矩 阵是否为透视投影矩阵。
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'对应于帧深度缓存中的深度值,如附图5所示。可得X' 等于width/2承X/Z ; Y'等于height/2*Y/Z; Z'等于(z-zNear)/z * zFar/(zFar-zNear), 其中Z'对应于深度缓存中的值。
III. 栅格化三维场景数据的重构。设视口的宽度为width'、高度为height',可由 OpenGL API相关函数获得。由视口和近平面的比例关系可知任意三维渲染帧图像像素点的坐标P',' (X",,Y',,)对应于近平面上的三维坐标Pn(xn, yn , zn),其中 xn=(X''' iidth' /2)*width/2, yn=(Y''' -height' /2) *height/2。对应的深度缓存中的值 Z',由b可知,对应的视点坐标系下Z值为Z' *(zFar-zNear)/zFar+zNear,可得像素点在 视点坐标系下的坐标P(X, Y, Z),其中X等于xNear/zNear*Z, Y等于yNear/zNear*Z。
通过调用0penGL API的读取显卡中颜色缓冲区函数和深度缓冲区函数,利用步骤II 中建立的坐标系以及上述关系,可以获得视点坐标系下所有像素点的三维坐标。将所有的 三维坐标用三角形面片连接起来,就构成了一个可进行三维渲染的立体表面,该表面通过 三维流水线,在任意视角下进行渲染。
步骤(3)利用步骤(2)重构的三维场景,生成两幅影像,形成立体像对。 生成立体像对可采用下列两种方法
方法一.调用OpenGL,渲染步骤(2)中获得的场景数据,在原始图像作为左视点图 像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不 保存原始图像情况下,生成左右视点图像,从而实现立体像对生成。
方法二.采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系, 将原始视空间下的像素直接变换到目标视空间下。在原始图像作为左视点图像情况下,生 成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像 情况下,生成左右视点图像,从而实现立体像对快速生成。其中
视点水平偏移,是指新视点距离原始视点在X轴方向上的改变量A 。
视点垂直偏移,是指新视点距离原始视点在Z轴方向上的改变量Z z。
图像像素偏移,是指生成的图像像素水平方向的附加偏移4^7。
则在另一的视点坐标系下,对原始帧图像中点P(X, Y, Z)的像素标在左视点下的坐标X 是Width' *(X-Dx)/(Z-Dz)+Dpixel, Y是Height' *Y/(Z-Dz)。该像素在对于右视点坐标系下, 坐标按照上述方法计算,但Dx, Dz取负号。
将每个像素的颜色复制到目标位置。对两个视点都应用该方法从而获得立体像对。该 方法具有不经过图形流水线,程序编制简单,优化容易等优点。
步骤(4)将步骤(3)生成的立体像对,通过显示设备输出并进行立体观察。本发明生 成的立体像对通过如下方式进行真三维显示-
x.显卡支持的双目立体显示。如在支持立体显示的OpenGL环境下,在创建设备句柄阶 段启动0penGL的立体显示模式,将生成的立体像对分别输送到左右两个缓冲区中,实现
12立体显示。或
y.在不支持立体显示的显卡上,将立体像对合成为一幅红绿互补色立体图像,从左右 立体像对中的一个图像提取红色通道,另一个图像中提取绿色和蓝色通道,将提取的通道 融合,形成一个互补色的立体图像。并送回原始的图像缓冲区进行立体显示与观测。或 z.将立体图像或像对输送到其他支持立体显示设备上。
下面的实施过程是上述方法的具体软件编码过程。
本实施例采用基于0penGL 3D API做为实施对象,操作系统平台为Windows XP进行实施。
Open API的拦截与监控基于Micorsoft Detours SDK开发。 Detours是Microsoft提供的一套Windows平台下进行API调用拦截的开发包,支持Win32 所有平台。
1. 基于Detours API,在Windows XP平台下基于Visual Studio 2005建立基于基于 C十+语言的Win32 DLL工程StereoDriver—Goolge_0penGL作为拦截代码框架。
2. 在StereoDriver—Goolge—0penGL中定义一个数据结构OpenGL—Stereo,该数据结 构包含如下内容
a. Windows绘图上下文变量hDC,类型HDC;
b. OpenGL渲染上下文变量hGLRC,类型HGLRC;
c. 记录当前硬件是否支持立体显示的变量IsStereoS叩port,类型bool;
d. 记录视口宽高的变量width, height,类型int;
e. 缓存颜色数据的变量ColorBuffer,类型GLbyte*;
f. 缓存深度数据的变量D印thBuffer,类型GLfloat;
g. 记录当前变换矩阵模式的变量MatrixMode,类型GLMatrixMode
h. 记录当前透视投影矩阵的变量Matrix,类型GLfloat [4] [4]
i. 创建一个全局的链表gOpenGL—Stereos保存OpenGL_Stereo结构的指针。
j.创建一个全局的0penGL_Stereo指针ActiveOpenGL—Stereo,初始化为NULL。 3.基于Detours API实现对如下函数的监控 1)wglCreateContext
wglCreateContext根据应用程序的设置,创建一个相应的OpenGL的渲染上下文。创 建监控函数My—wglCreateContext,在wglCreateContext中实现如下功能
13解析wglCreateContext的参数,判断用户程序是否使用PFD—STEREO标记启动双通道 立体渲染支持,如果用户程序启动立体渲染支持,则说明用户程序本身支持立体渲染。
如果用户程序没有启动立体渲染支持,则表明用户程序不支持立体渲染,询问用户是 否启动植入式立体支持。
如果用户选择启用植入是立体支持,创建OpenGL_Stere0结构,并保存在一个包含 OpenGLStereo结构指针的全局列表中,并初始化。使用wglChoosePixelFormat函数和 P^STEREO标记査询当前显卡是否支持立体显示。如果支持立体显示则将OpenGLStereo的 IsStereoS卿ort设置为true,否则设置为false。
使用原始的wglCreateContext创建HGLRC,并在OpenGLStereo中记录对应的HDC和 HGLRC,将OpenGLStereo结构加入到gOpenGL—Stereos中。
2) wglMakeCurrent
wglMakeCurrent在若干0penGL渲染上下文中选择一个做为当前活动的, 一般在 wglMakeCurrent之后开始和结束一帧的绘制。创建监控函数My—wglMakeCurrent,在 My_wglMakeCurrent中实现如下功能当HDC参数和HGLRC参数不为NULL时,从 gOpenGL—Stereos中用这两个参数査找对应hDC和hGLRC的OpenGL—Stereo结构,并赋值给 ActiveOpenGL—Stereo变量。如果两个参数均为NULL,则将ActiveOpenGL—Stereo赋值为 NULL。
调用原始的wglMakeCurrent。
3) glViewport
glViewport将当前活动的OpenGL渲染上下文的视口设置到指定位置和尺寸。创建监 控函数My_glViewport,在My一glViewport中实现如下功會旨
如果ActiveOpenGL—Stere不为空,则判断新的视口宽高是否和ActiveOpenGL_Stereo 中的width, height相等。如果不相等释放OpenGL—Stereo中原有的ColorBuffer和 D印thBuffer内存;根据视口的宽高创建颜色缓存区ColorBuffer和深度缓存区 D印thBuffer;记录新的width和height 。
调用原始的glViewport。
4) glMatrixMode
glMatrixMode设置当前活动OpenGL渲染上下文的活动矩阵模型。创建监控函数 My—glMatrixMode,在My—glMatrixMode中实现如下功能
如果ActiveOpenGL—Stereo不为空,则将ActiveOpenGL_Stere的MatrixMode设置为glMatrixMode的参数。 调用原始的glMatrixMode。
5) glLoadMatrixd, g比oadMatrixf
glLoadMatrix为活动的0penGL渲染上下的当前矩阵模式设置矩阵。创建监控函数 My_glMLoadMatrix,在My—glLoadMatrix中实现如下功能
如果ActiveOpenGL_Stereo不为空,且其变量MatrixMode等于GL_PR0JECTI0N,则记录 该函数的m变量到ActiveOpenGL—Stere的Matrix中。
调用原始的glLoadMatrix函数。
6) Sw即Buffers
该函数将OpenGL渲染的一帧从显存输出到显示设备上。创建监控函数My—SwapBuffers, 在该函数中实现如下功能
如果ActiveOpenGL_Stereo不为空,调用glReadPixels函数,以GL_RGB从颜色缓冲 区中读取颜色到ActiveOpenGL—Stereo的ColorBuffer变量;调用glReadPixels函数以 GL_DEPTH_C0MP0NENT参数,读取深度值到ActiveOpenGL_Stereo的D印thBuffer中。
从ActiveOpenGL—Stereo的Matrix变量中获得透视投影的近平面的宽度width,高度 height,以及近平面的zNear和远平面zFar。
根据ActiveOpenGL_Stereo中记录的视口的宽度ViewPortWidth和ViewPortHeight, 创建临时的颜色缓冲区,ColorBufferLeft和ColorBufferRight。
从用户设置中获得视点偏移Dx,深度偏移Dz和像素偏移DpM。建立一个循环,对每 个ColorBuffer像素,取出对应的像素坐标iX, iY以及颜色RGB以及对应的D印thBuffer 中的深度值。利用本发明设计的方法,像素对应的视点坐标系中的坐标P (X,Y,Z)。对左 眼以Dx. Dz, DpM为参数。使用本发明设计的快速立体像对生成算法,计算P对应的像素坐 标Pwt。对右眼以-D,.—a.-DpM为参数,使用本发明设计的快速立体像对生成算法,计算P 对应的右像素坐标Pright。将当前像素的颜色分别赋值给ColorBufferLeft的P^位置,和 ColorBufferRight的Pr她位置。
判断ActiveOpenGL—Stere的IsStereoSupport是否为真。如果为真,调用 glDrawPixels分别将ColorBufferLeft和ColorBufferRight 中的内容拷贝到 GL—BACK—LEFT和GL—BACK—RIGT中。否则,将ColorBufferRight中的G, B通道赋值到 ColorBufferLeft对应像素的G, B通道上去,形成一幅红绿立体,将ColorBufferLeft的内 容拷贝到GL—BACK中。调用原始的Sw即Buffer。
4. 编译StereoDriver—Goolge—OpenGL工禾呈,生成StereoDriver—Goolge_0penGL DLL 文件。
5. 将StereoDriver_Goolge—OpenGL. DLL文件通过detours SDK的withdll. Exe命令行 启动所需程序。
实施例2
本实施例采用基于Direct3D 9做为实施对象,操作系统平台为Windows XP进行实施。 如图1所示,面向Google Earth的植入式真三维立体渲染方法,该方法包括以下步骤 步骤(1)针对Google Earth使用的Direct3D API进行监控与渲染数据拦截; 步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据; 步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;
步骤(4)针对不同的立体观察设备进行真三维观测。
下面的实施过程是上述方法的具体软件编码过程。
Direct3D 9的拦截与监控基于Micorsoft Detours SDK开发。Detours是Microsoft 提供的一套Windows平台下进行API调用拦截的开发包,支持Win32所有平台。
l.基于Detours API,在Windows XP平台下基于Visual Studio 2005建立基于基于 C十+语言的Win32 DLL工程StereoDriver—Goolge—D3D作为拦截代码框架。
2.在StereoDriver_Goolge_D3D中定义一个数据结构D3D_Stereo,该数据结构包含如 下内容
1) Windows的窗口变量hWnd,类型HWND;
2) Direct3D的设备接口指针,pDevice,类型IDirect3DDevice9;
3) 记录视口宽高的变量width, height,类型int;
4) 缓存颜色数据的变量ColorBuf f er,类型BYTE*;
5) 缓存深度数据的变量D印thBuffer,类型float;
6) 记录当前矩阵模式的变量MatrixMode,类型D3DTRANSF0RMSTATETYPE;
7) 记录当前透视投影矩阵的变量Matrix,类型D3DMATRIX;
8) 创建一个全局的链表gD3D_Stereos保存D3D—Stereo结构的指针。
9) 创建一个全局的D3D—Stereo指针,ActiveD3D—Stereo,初始化为NULL。 3.基于Detours API实现对如下函数的监控
161)Direct3DCreate9
Direct3DCreate9是Direct3D9的主入口,创建一个IDirect3D9的指针。创建监控函 数My—Direct3DCreate9,实现如下功能
当用户第一次调用该函数时,利用Detours监控IDirect3D9的CreateDevice函数。 调用原始的Direct3DCreate9函数。 2)Direct3DDevice9的CreateDevice函数
CreateDevice 用以创建 一 个 Direct3D 设备。创建监控函数 My—IDirect3DDevice9—CreateDevice,实现如下功能
询问用户是否启用立体支持,如果选择是,判断用户使用的深度格式,确保其为可锁 定读取的模式;
执行原始的CreateDevice,得到一个IDirect3DDevice9指针。
如果用户选择启动立体,创建一个D3D—Stereo ,将参数中的pDevice用 IDirect3DDevice9指针赋值,将D3D—Stereo加入gD3D—Stereos。 监控IDirect3DDevice9如下函数。
3) IDirect3DDevice9的BeginScene函数
BeginScene开始一帧的绘制。创建监控函数My—IDirect3DDevice9—BeginScene在其 中实现如下功能
根据传入的IDirect3DDevice9指针,在gD3D—Stereos中找到与当前设备相同的,将 其赋值给ActiveD3D—Stereo。如果没有相同的则设置为NULL。 调用原始的BeginScene。
4) IDirect3DDevice9的SetViewport
SetViewport将当前活动的IDirect3DDevice9渲染上下文的视口设置到指定位置和尺 寸。创建监控函数MyJDirect3DDevice9—SetViewport,在My_glViewport中实现如下功倉巨 如果 ActiveD3DL_Stereo不为空,则判断新的视口宽高是否和ActiveD3D_Stereo中的 width, height相等。如果不相等释放ActiveD3D_Stereo中原有的ColorBuffer和 D印thBuffer内存。根据视口的宽高创建颜色缓冲区ColorBuffer和深度缓存数据 D印thBuffer。
调用原始的SetViewport。
5) IDirect3DDevice9的SetTransform
SetTransform设置指定的矩阵。创建监控函数My—IDirect3DDevice9_SetTransform,实现如下功能
如果ActiveD3D_Stereo不为空,判断矩阵类型参数是否是D3DTS—PROJECTION,如果是根据 本发明所指判定条件,如果为透视投影矩阵,则记录到ActiveD3D—Stereo的变量中。 调用原始的SetTransform。
6) IDirect3DDevice9的Present函数
该函数将Direct3D渲染的 一 帧图像输出到屏幕上。创建监控函数 My_IDirect3DDevice9—Present,在该函数中实现如下功能
如果ActiveD3D—Stereo不为空,调用IDirect3DDevice9的GetBackSurfaceData函数, 从颜色缓冲区中读取颜色图像到ActiveD3D—Stereo的ColorBuffer变量;调用 GetD印thData函数以读取深度值到ActiveD3D—Stereo的D印thBuffer中。
从ActiveD3D一Stereo的Matrix变量中获得透视投影的近平面的宽度width,高度 height,以及近平面的zNear和远平面zFar。
根据ActiveD3D—Stereo视口的宽度ViewPortWidth和ViewPortHeight,创建临时的颜 色缓冲区,ColorBufferLeft和ColorBufferRight。
从用户设置中获得视点偏移Dx,深度偏移Dz和像素偏移DpiX6l.
建立一个循环,对每个ColorBuffer像素,取出对应的像素坐标iX, iY以及颜色RGB 以及对应的D印thBuffer中的深度值。利用本发明设计的方法,像素对应的视点坐标系中 的坐标P (X, Y, Z)。对左眼使用Dx, Dz. Dp^为参数。使用本发明设计的快速立体像对生成算 法,计算P对应的像素坐标Pun。对右眼使用-Dx, -Dz, -DpiX6l为参数.使用本发明设计的快速 立体像对生成算法,计算P对应的像素坐标Pnsht。 将当前像素的颜色分别赋值给 ColorBufferLeft的P^位置,和ColorBufferRight的P一t位置。
由于Direct3D9不支持立体显示模式,从ColorBufferLeft中抽取红色通道, ColorBufferRight中抽取蓝色和绿色通道,组成红绿立体图片,输出到屏幕。
4. 编译StereoDriver—Goolge—D3D工程,生成StereoDriver—Goolge—D3D. DLL文件
5. 将StereoDriver—Goolge_D3D. DLL文件通过detours SDK的withdll. Exe命令4亍启 动Google Earth禾呈序。
实施例3
一种面向Google Earth与Sketch Up软件的植入式真三维立体渲染方法,包括以下具 体内容
18a. 监控创建三维显示环境的函数,在该函数中加入调用3D API的系统检测函数功能, 获取系统立体显示特性,根据相应的立体显示特性,更改原始设定的显示环境中的立体显 示模式,在支持立体显示的硬件上开启真三维立体显示支持,在不支持立体显示的硬件上, 设置标志以便进行红绿立体显示;
b. 监控开始一帧绘制的函数,在该函数中加入代码获取当前绘图帧的视口尺寸,根据 渲染的像素格式为立体像对创建临时的缓冲区;
c. 监控改变当前绘制矩阵的函数,在该函数中加入代码以获取三维应用软件对当前 绘制矩阵的更改,通过矩阵参数识别场景渲染的投影类型,当是透视投影时,记录该矩阵, 作为三维场景重构的关键参数;
d. 监控将帧缓存输出到显示设备的函数,在监控函数加入代码以获取整个帧中各像 素的颜色和深度数据,基于步骤c获取的投影变换矩阵信息,反算每个像素在视点坐标系 下的三维坐标,重建出基于像素的栅格化的三维场景;根据人眼睛的立体视觉模型,生成 可供立体显示的立体像对。
19
权利要求
1、一种面向Google Earth与Sketch Up的真三维立体显示方法,其特征是,该方法包括以下步骤步骤(1)针对Google Earth与Sketch Up使用的3D API进行监控与渲染数据拦截;步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;步骤(4)针对不同的立体观察设备进行真三维观测。
2、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述真三维立体渲染方法 进一步包括下列步骤下列步骤不分先后a. 监控创建三维显示环境的函数,在该函数中加入调用3D API的系统检测函数功能, 获取系统立体显示特性,根据相应的立体显示特性,更改原始设定的显示环境中的立体显 示模式,在支持立体显示的硬件上开启真三维立体显示支持,在不支持立体显示的硬件上, 设置标志以便进行红绿立体显示;b. 监控开始一帧绘制的函数,在该函数中加入代码获取当前绘图帧的视口尺寸,根据 渲染的像素格式为立体像对创建临时的缓冲区;c. 监控改变当前绘制矩阵的函数,在该函数中加入代码以获取三维应用软件对当前绘 制矩阵的更改,通过矩阵参数识别场景渲染的投影类型,当是透视投影时,记录该矩阵, 作为三维场景重构的关键参数;d. 监控将帧缓存输出到显示设备的函数,在监控函数加入代码以获取整个帧中各像素 的颜色和深度数据,基于步骤c获取的投影变换矩阵信息,反算每个像素在视点坐标系下 的三维坐标,重建出基于像素的栅格化的三维场景;根据人眼睛的立体视觉模型,生成可 供立体显示的立体像对。
3、根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(1)中3D API 的监控与渲染数据拦截进一步包括利用API拦截技术,获取三维绘制相关矩阵和三维渲 染数据输出,提取实现三维透视变换的投影矩阵、视口宽高,作为三维场景重构的关键参 数;利用3D API的特定函数,拦截三维渲染输出,提取显卡帧缓存中的颜色和深度数据, 作为三维场景重构的基础。
4、根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(1)中还进一 步包括针对其实现3D API函数的拦截的具体步骤通过代码注入或/和钩子函数技术编写特定的拦截程序,在三维可视化程序的数据加载阶段,将3D API拦截程序加载到三维可 视化程序的进程中,从而拦截和监控3D API调用。
5、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(2)进一步包 括下列步骤通过生成三维渲染输出的投影矩阵和视口宽高,解算出三维渲染关键控制参 数以及三维渲染输出的颜色和深度数据,进而解算出每个像素在视空间中的三维坐标以及 对应的颜色特性,重构视空间下栅格化的三维场景数据。
6、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(2)进一步包 含以下步骤-I.透视投影变换矩阵的识别假设透视投影变换矩阵在一帧的渲染过程中保持一致,将透视投影矩阵拦截下来,将矩阵中的特征值作为判据,判断当前栏截的矩阵是否为透视投影矩阵;n.建立视点为坐标原点的三维空间坐标系以步骤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),其中Z,对应于深度缓存中的值;in.栅格化三维场景数据的重构设视口的宽度为width'、高度为height',任意三 维渲染帧图像像素点的坐标P'" ",',,丫'',)对应于近平面上的三维坐标?110^, yn, zn), 其中xn:(X, ,' -width' /2)*width/2, yn=(Y,'' -height' /2) *height/2;对应的深度缓存中 的值Z',对应的视点坐标系下Z=Z, *(zFar-zNear) /zFar+zNear,像素点在视点坐标系下的 坐标为P(X, Y, Z),其中X=xNear/zNear*Z, Y=yNear/zNear*Z;将所有的三维坐标用三角形 面片连接起来,就构成了一个可进行三维渲染的立体表面。
7、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(3)中生成立体 像的方法是调用3D API,渲染所述步骤(2)中获得的场景数据,在原始图像作为左视 点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像; 在不保存原始图像情况下,生成左右视点图像,从而实现立体像对生成。
8、根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(3)中生成立 体像的方法是采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系,将原始视空间下的像素直接变换到目标视空间下;在原始图像作为左视点图像情况下, 生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图 像情况下,生成左右视点图像,从而实现立体像对快速生成。
9、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(4)中针对不同 的显示与观测设备,进行立体显示与观测,包括x.在支持立体显示的设备上,将立体像对分别输出到显卡左右两个通道,进行立体显 示;或y.在不支持立体显示的设备上,将立体像对中, 一个图像提取红色通道,另一个图像提取绿色和蓝色通道,将提取的通道融合,形成一个互补色的立体图像,并支持红绿眼镜观察;或z.将立体图像或像对输送到其他支持立体显示设备上。
10、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述3D API函数的拦 截包括(21) 3D API创建三维显示环境的函数;(22) 3D API开始一帧场景渲染的函数;(23) 3D API改变当前渲染矩阵的函数;(24) 3D API结束一帧场景渲染的函数;(25) 3D API将渲染数据输出到当前屏幕上的函数。
全文摘要
本发明涉及面向Google Earth与Sketch Up的真三维立体显示方法,该方法包括在软件的3D API调用和显卡显示之间采用植入式的渲染数据拦截技术,对原始的单通道颜色信号和深度信号、三维场景变换矩阵和投影变换矩阵进行捕获;对这些信息进行解析,重构栅格化的三维数据;基于立体视觉原理,自适应地将该场景重新变换到两个不同的视点位置,形成可供立体显示的双目视觉立体像对,驱动显卡对双目立体像对进行立体输出;利用偏振、红绿和闪闭式眼镜等进行真三维立体显示与观测。本发明可以对现有GoogleEarth与SketchUp软件在不改变程序和操作模式的情况下实现真三维立体化的场景展示。
文档编号G06T15/00GK101477700SQ20091002551
公开日2009年7月8日 申请日期2009年2月6日 优先权日2009年2月6日
发明者吴明光, 温永宁, 盛业华, 闾国年 申请人:南京师范大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1