面向Skyline的真三维立体显示方法

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

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


图1本发明实施例1的方法流程图
图2本发明采用的三维渲染的基本模式
图3本发明采用的三维图形的坐标变换流水线
图4本发明实施例1的透视投影与透视变换矩阵
图5本发明实施例1的以视点为中心的坐标系
图6本发明实施例1的立体像对的快速生成方法图
具体实施例方式
下面结合附图和实施例对本发明做进一步详细说明。 实施例1如图2和图3所示,由于在建模阶段Skyline均使用Direct3D API作为 三维渲染API,故本实施例基于Direct3D API作为实施对象,操作系统平台 为Windows XP进行实施。
Direct3D 9的拦截与监控基于Micorsof t Detours SDK开发。Detours是 Microsoft提供的一套Windows平台下进行API调用拦截的开发包,支持Win32
所有平台。
如图1所示,面向Skyline的真三维立体显示方法,该方法包括以下步骤 步骤(1)针对Skyline使用的Direct3D API进行监控与渲染数据拦截; 步骤(2 )利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据; 步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生 成立体像对;
步骤(4)针对不同的立体观察设备进行真三维观测。 步骤(1)中Direct3D API的拦截与获取场景渲染数据进一步包括利 用3DAPI拦截技术,获取三维绘制相关矩阵和三维渲染数据,提取实现三维 透视变换的投影矩阵、视口宽高,作为三维场景重构的关键参数;利用3D API 的特定函数,拦截三维渲染输出,提取显卡帧缓存中的颜色和深度数据,作 为三维场景重构的基础。
步骤(2)进一步包括利用Direct3D API输出到显卡帧缓存中的颜色和深 度数据,结合拦截Direct3D API调用而获得的投影参数,来解析生成颜色图 像和深度数据的三维空间信息。它进一步包含以下步骤
I.透视投影变换矩阵的识别。在一帧场景的渲染过程中,三维应用软件 可能会多次更改投影变换矩阵,只有透视变换矩阵才可以产生透视三维效果。不失一般性,假设透视投影变换矩阵在一帧的渲染过程中保持一致。透视投影的各项控制参数与对应的矩阵关系见附图4所示。将透视投影矩阵拦截下来,将矩阵中的特征值作为判据,判断当前拦截的矩阵是否为透视投影矩阵。
II. 建立视点为坐标原点的三维空间坐标系(简称视点坐标系)。以a截获
的透视投影变换矩阵为参数,建立以透视点为坐标原点的视图坐标系Z轴穿过近平面的中心,近平面的Y轴和X轴方向和该坐标系的X轴,Y轴方向一致,近平面位于近平面值对应的Z轴的刻度上。近平面上X的值域是[lidth/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),其中对应于深度缓存中的值。
III. 栅格化三维场景数据的重构。设视口的宽度为width'、高度为height',可由Direct犯API相关函数获得。由视口和近平面的比例关系可知任意三维渲染帧图像像素点的坐标P〃' (X'〃,Y"')对应于近平面上的三维坐标 Pn(xn , yn , zn), 其中 xn= (X'〃-width'/2) *width/2 ,yn-(Y"'-heightV2)*height/2。对应的深度缓存中的值Z',由b可知,对应的视点坐标系下Z值为Z'*(zFar-zNear)/zFar+zNear,可得像素点在视点坐标系下的坐标P(X, Y, Z),其中X等于xNear/zNear*Z, Y等于yNear/zNear*Z。
通过调用Direct3D API的读取显卡中颜色缓冲区函数和深度缓冲区函数,利用步骤II中建立的坐标系以及上述关系,可以获得视点坐标系下所有像素点的三维坐标。将所有的三维坐标用三角形面片连接起来,就构成了一个可进行三维渲染的立体表面,该表面通过三维流水线,在任意视角下进行渲染。
步骤(3)利用步骤(2)重构的三维场景,生成两幅影像,形成立体像对。
生成立体像对可釆用下列两种方法
方法一.调用3DAPI,渲染步骤(2)中获得的场景数据,在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对生成。
方法二.采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系,将原始视空间下的像素直接变换到目标视空间下。在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对快速生成。其中
视点水平偏移,是指新视点距离原始视点在X轴方向上的改变量Z^ 。视点垂直偏移,是指新视点距离原始视点在Z轴方向上的改变量£>z。图像像素偏移,是指生成的图象像素水平方向的附加偏移"一,。则在另 一的视点坐标系下,对原始帧图像中点P (X, Y, Z)的像素标在左视点下的坐标X是Width"(X-Dx)/(Z-Dz)+Dpw, Y是Height'*Y/(Z-Dz)。该像素在对于右视点坐标系下,坐标按照上述方法计算,但Dx,Dz取负号。
将每个像素的颜色复制到目标位置。对两个视点都应用该方法从而获得立体像对。该方法具有不经过图形流水线,程序编制简单,优化容易等优点。步骤(4 )将步骤(3)生成的立体像对,通过显示设备输出并进行立体观察。 本发明生成的立体像对通过如下方式进行真三维显示
x.显卡支持的双目立体显示。如在支持立体显示的Direct3D环境下,在 创建设备句柄阶段启动Direct3D的立体显示模式,将生成的立体像对分别输 送到左右两个缓冲区中,实现立体显示。或
y.在不支持立体显示的显卡上,将立体像对合成为一幅红绿互补色立体图 像,从左右立体像对中的一个图像提取红色通道,另一个图像中提取绿色和 蓝色通道,将提取的通道融合,形成一个互补色的立体图像。并送回原始的 图像缓冲区进行立体显示与观测。或
z.将立体图像或像对输送到其他支持立体显示设备上。
实施例2
一种面向Skyline的真三维立体显示方法,包括对以下函数的拦截
a. 创建三维显示环境的函数,监控该函数,在监控函数中加入调用 Direct3D API的系统检测函数功能,获取系统立体显示特性,根据相应的立 体显示特性,更改原始设定的显示环境中的立体显示模式,在支持立体显示 的硬件上开启真三维立体显示支持,在不支持立体显示的硬件上,设置标志 以便进行红绿立体显示。
b. 开始一帧绘制函数,监控该函数,在监控函数中加入代码获取当前绘图 帧的视口尺寸,根据渲染的像素格式为立体像对创建临时的缓冲区。
d.将帧缓存输出到显示设备的函数,监控该函数,在监控函数加入代码 以获取整个帧中各像素的颜色和深度数据,基于c获取的投影变换矩阵信息,反算每个像素在视点坐标系下的三维坐标,重建出基于像素的栅格化的三维
场景;
e.基于c获取的投影矩阵信息,反算三维绘制中透视投影的各项参数, 根据这些参数、重建栅格化的三维场景,根据人眼睛的立体视觉模型,生成 可供立体显示的立体像对。
下面的实施过程是上述方法的具体软件编码过程。
1. 基于Detours API,在Windows XP平台下基于Visual Studio 2005建 立基于基于0++语言的Win32 DLL工程StereoDriver_SkyLine_D3D作为拦截 代码框架。
2. 在StereoDriver—SkyLine—D3D中定义一个数据结构D3D一Stereo,该数
据结构包含如下内容
1) Windows的窗口变量hWnd,类型HWND;
2) Direct3D的设备接口指针,pDevice,类型IDirect3DDevice9;
3) 记录视口宽高的变量width, height,类型int;
4) 缓存颜色数据的变量ColorBuffer,类型BYTE*;
5) 缓存深度数据的变量DepthBuffer,类型float;
6) 记录当前矩阵模式的变量MatrixMode,类型D3DTRANSF0RMSTATETYPE;
7) 记录当前透视投影矩阵的变量Matrix,类型D3DMATRIX;
8) 创建一个全局的链表gD3D_Stereos保存D3D-Stereo结构的指针。
9) 创建一个全局的D3D—Stereo指针,ActiveD3D-Stereo,初始化为NULL。
3. 基于Detours API实现对如下函数的监控1)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
20SetViewport将当前活动的IDirect3DDevice9渲染上下文的视口设置到指 定位置和尺寸。创建监控函数My-IDirect3DDevice9—SetViewport,在 My-glViewport中实现如下功能
如果ActiveD3DL-Stereo不为空,则判断新的视口宽高是否和 ActiveD3D—Stereo 中的 width, height 相等。如果不相等释放 ActiveD3D—Stereo中原有的ColorBuffer和D印thBuffer内存。根据视口的 宽高创建颜色缓冲区ColorBuffer和深度缓存数据DepthBuffer。
调用原始的SetViewport。
5) IDirect3DDevice9的SetTransform
SetTransform 设置指定的矩阵。创建监控函数 My-IDirect3DDevice9—SetTransform,实现如下功能
如果ActiveD3D_Stereo不为空,判断矩阵类型参数是否是D3DTS一PR0JECTI0N,
如果是根据本发明所指判定条件,如果为透视投影矩阵,则记录到 ActiveD3D—Stereo的变量中。 调用原始的SetTransform。
6) IDirect3DDevice9的Present函数
该函数将Direct3D渲染的 一 帧图像输出到屏幕上。创建监控函数 My-IDirect3DDevice9—Present,在该函数中实现如下功能
如果 ActiveD3D—Stereo 不为空,调用 IDirect3DDevice9 的 GetBackSurfaceData 函数,从颜色缓冲区中读取颜色图像到 ActiveD3D—Stereo的ColorBuffer变量;调用GetDepthData函数以读取深度 值到ActiveD3D—Stereo的DepthBuffer中。从ActiveD3D—Stereo的Matrix变量中获得透视投影的近平面的宽度 width,高度height,以及近平面的zNear和远平面zFar。
根据ActiveD3D—Stereo视口的宽度ViewPortWidth和ViewPortHeight, 创建临时的颜色缓冲区,ColorBufferLeft和ColorBufferRight。
从用户设置中获得视点偏移D"深度偏移Dz和像素偏移DpiMl.
建立一个循环,对每个ColorBuffer像素,取出对应的像素坐标iX, iY以 及颜色RGB以及对应的DepthBuffer中的深度值。利用本发明设计的方法, 像素对应的视点坐标系中的坐标P (X,Y,Z)。对左眼使用Dx,Dz,Dp^为参数。 使用本发明设计的快速立体像对生成算法,计算P对应的像素坐标Pwt。对 右眼使用-Dx, —Dz, -DpM为参数,使用本发明设计的快速立体像对生成算法,计算 P对应的像素坐标P^t。 将当前像素的颜色分别赋值给ColorBufferLeft的 Pwt位置,和ColorBufferRight的Pt她位置。
由于Direct3D9默认不支持立体显示模式,从ColorBufferLeft中抽取红 色通道,ColorBufferRight中抽取蓝色和绿色通道,组成红绿立体图片,输 出到屏幕。
4. 编 译 StereoDriver-SkyLine一D3D 工 程 , 生 成 StereoDriver—SkyLine—D3D. DLL文件
5. 将 StereoDriver_SkyLine_D3D.DLL 文件通过 detours SDK 的 withdll.Exe命令行启动Skyl ine程序。
权利要求
1、面向Skyline的真三维立体显示方法,其特征是,该方法包括以下步骤步骤(1)针对Skyline使用的3D API进行监控与渲染数据拦截;步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;步骤(4)针对不同的立体观察设备进行真三维观测。
2、 根据权利要求1所述的真三维立体显示方法,其特征是,所述真三维立体显示方法进一步包括下列步骤,下列步骤不分先后a. 监控创建三维显示环境的函数,在该函数中加入调用3D API的系统检测函数功能,获取系统立体显示特性,根据相应的立体显示特性,更改原始设定的显示环境中的立体显示模式,在支持立体显示的硬件上开启真三维立体显示支持,在不支持立体显示的硬件上,设置标志以便进行红绿立体显示;b. 监控开始一帧绘制的函数,在该函数中加入代码获取当前绘图帧的视口尺寸,根据渲染的像素格式为立体像对创建临时的缓冲区;c. 监控改变当前绘制矩阵的函数,在该函数中加入代码以获取三维应用软件对当前绘制矩阵的更改,通过矩阵参数识别场景渲染的投影类型,当是透视投影时,记录该矩阵,作为三维场景重构的关键参数;d. 监控将帧缓存输出到显示设备的函数,在监控函数加入代码以获取整个帧中各像素的颜色和深度数据,基于步骤C获取的投影变换矩阵信息,反算每个像素在视点坐标系下的三维坐标,重建出基于像素的栅格化的三维场景;根据人眼睛的立体视觉模型,生成可供立体显示的立体像对。
3、根据权利要求1所述的真三维立体显示方法,其特征是,所述步骤(1)中3D API的监控与渲染数据拦截进一步包括利用API拦截技术,获取三维绘制相关矩阵和三维渲染数据输出,提取实现三维透视变换的投影矩阵、视口宽高,作为三维场景重构的关键参数;利用3DAPI的特定函数,拦截三维渲染输出,提取显卡帧缓存中的颜色和深度数据,作为三维场景重构的基础。
4、 根据权利要求1所述的真三维立体显示方法,其特征是,所述步骤(1)中还进一步包括针对其实现3D API函数的拦截的具体步骤通过代码注入或/和钩子函数技术编写特定的拦截程序,在三维可视化程序的数据加载阶段,将3D API拦截程序加载到三维可视化程序的进程中,从而拦截和监控3D API调用。
5、 根据权利要求1所述的真三维立体显示方法,其特征是,所述步骤(2)进一步包括下列步骤通过生成三维渲染输出的投影矩阵和视口宽高,解算出三维渲染关键控制参数以及三维渲染输出的颜色和深度数据,进而解算出每个像素在视空间中的三维坐标以及对应的颜色特性,重构视空间下栅格化的三维场景数据。
6、根据权利要求l所述的真三维立体显示方法,其特征是,所述步骤(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', ZO由透视投影矩阵变换求得,其中Z'对应于帧深度缓存中的深度值,X'-width/2*X/Z ; r-height/2*Y/Z;Z' = (z-zNear)/z * zFar/(zFar-zNear),其中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、(zFar-zNear)/zFar+zNear,像素点在视点坐标系下的坐标为P(X, Y,Z),其中X=xNear/zNear*Z, Y=yNear/zNear*Z;将所有的三维坐标用三角形面片连接起来,就构成了一个可进行三维渲染的立体表面。
7、根据权利要求l所述的真三维立体显示方法,其特征是,所述步骤(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将渲染数据输出到当前屏幕上的函数。
全文摘要
本发明公开了一种面向Skyline的真三维立体显示方法在所述软件采用的3D API调用和显卡显示之间采用植入式的渲染数据拦截技术,对原始的单通道颜色信号和深度信号、三维场景变换矩阵和投影变换矩阵进行捕获;对这些信息进行解析,重构栅格化的三维数据;基于立体视觉原理,自适应地将该场景重新变换到两个不同的视点位置,形成可供立体显示的双目视觉立体像对,驱动显卡对双目立体像对进行立体输出;利用偏振、红绿和闪闭式眼镜等进行真三维立体显示与观测。本发明可以对现有Skyline软件在不改变其程序和操作模式的情况下实现真三维立体化的场景展示。
文档编号H04N15/00GK101511034SQ20091002512
公开日2009年8月19日 申请日期2009年2月24日 优先权日2009年2月24日
发明者吴明光, 温永宁, 盛业华, 闾国年 申请人:南京师范大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1