CN101561936A - 面向GeoGlobe的真三维立体显示方法 - Google Patents

面向GeoGlobe的真三维立体显示方法 Download PDF

Info

Publication number
CN101561936A
CN101561936A CNA2009100271286A CN200910027128A CN101561936A CN 101561936 A CN101561936 A CN 101561936A CN A2009100271286 A CNA2009100271286 A CN A2009100271286A CN 200910027128 A CN200910027128 A CN 200910027128A CN 101561936 A CN101561936 A CN 101561936A
Authority
CN
China
Prior art keywords
dimensional
function
stereo display
api
true
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CNA2009100271286A
Other languages
English (en)
Other versions
CN101561936B (zh
Inventor
闾国年
周良辰
温永宁
盛业华
吴明光
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Changshu Zijin Intellectual Property Service Co.,Ltd.
Original Assignee
Nanjing Normal University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing Normal University filed Critical Nanjing Normal University
Priority to CN2009100271286A priority Critical patent/CN101561936B/zh
Publication of CN101561936A publication Critical patent/CN101561936A/zh
Application granted granted Critical
Publication of CN101561936B publication Critical patent/CN101561936B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Processing Or Creating Images (AREA)
  • Image Generation (AREA)

Abstract

本发明公开了一种面向GeoGlobe的真三维立体显示方法:在所述软件采用的3D API调用和显卡显示之间采用植入式的渲染数据拦截技术,对原始的单通道颜色信号和深度信号、三维场景变换矩阵和投影变换矩阵进行捕获;对这些信息进行解析,重构栅格化的三维数据;基于立体视觉原理,自适应地将该场景重新变换到两个不同的视点位置,形成可供立体显示的双目视觉立体像对,驱动显卡对双目立体像对进行立体输出;利用偏振、红绿和闪闭式眼镜等进行真三维立体显示与观测。本发明可以对现有GeoGlobe软件在不改变其程序和操作模式的情况下实现真三维立体化的场景展示。

Description

面向GeoGlobe的真三维立体显示方法
技术领域
本发明涉及三维可视化技术领域,具体涉及一种面向GeoGlobe的真三维立体显示方法。
背景技术
随着计算机技术的发展,立体显示已经成为环境仿真、模拟训练以及规划设计等领域常用的技术手段,甚至开始与电影、电脑游戏等结合产生立体电影和真三维游戏融入人们的日常生活。虚拟地球软件作为一种重要的三位应用系统,以期丰富的数据,友好的用户体验受到了广泛的关注,GeoGlobe软件就是其中之一。
在三维应用中实现立体视觉是一种潮流,在单一显示设备上观察到立体景物,需要将左、右眼所看到的影像各自独立分开,然后通过特定的外置设备使左右眼看到不同的影像而通过大脑的生理作用形成立体视觉。传统的立体显示需要专业的设备进行立体显示,包括支持左右缓存的显卡和支持双通道显示的立体显示设备。基于上述技术,产生了广为流行的虚拟现实技术,在机器仿真、战场模拟等领域得到了广泛的应用。但是,由于需要专业设备,成本高昂,也限制了立体显示技术的应用,所以立体显示的应用不能得到推广,大量的三维程序还是采用单通道技术进行显示,缺乏立体感,失去了三维程序应有的立体显示特性。同时,由于立体显示需要专门硬件,特殊的编程技巧,也造成了大量的程序在开发时没有考虑立体显示特性,没有在程序中实现支持立体显示的功能,使得这些程序即使在有立体显示功能的硬件上也不能显示立体。这些程序占据了现在三维显示程序的绝大部分,GeoGlobe也没有突破上述限制,其在建模过程中,用户还是只能看到单通道的透视三维,不能实现真三维的立体显示,不能达到最佳的应用效果。
发明内容
本发明所要解决的问题在于克服GeoGlobe软件在三维显示中存在的不足,实现对原软件不加修改的真三维立体显示。本发明的核心是利用三维渲染的基本原理,通过拦截显卡结果帧图像中颜色数据和深度数据,解析生成结果帧图像的投影变换矩阵,应用三维渲染的基本原理以及重构栅格化的三维场景,在此场景基础上,应用立体视觉原理,生成立体像对,基于不同的立体显示模式,驱动显卡进行立体输出。
本发明依赖的技术基础是计算机图形学中关于三维渲染的基本模型,即GeoGlobe使用的3D API(Direct3D)(当前在Windows下GeoGlobe使用Direct3D)的三维渲染的基本模型,包括三维渲染流水线、顶点的变换流水线、Z缓冲区算法等。实现依据是Direct3D API和显卡,两者均是基于该基本模型进行工作的。本发明在不更改GeoGlobe源代码、二进制代码或计算机硬件结构的情况下,使该计算机软件实现双目视觉的立体真三维显示与观测。
计算机三维显示的基本原理是将三维场景经过几何变换和光照处理以及栅格化之后,生成一幅二维栅格图像在输出设备上输出。三维场景中包含一系列的三维对象,三维对象是由一系列顶点构成的几何图元(包括点,线和三角形)组合而成。顶点是一个包含三维空间位置及其对应的渲染参数的坐标点。首先对顶点数据进行透视坐标变换和光照处理。在坐标变换阶段,描述物体几何形状的顶点被变换到视点为中心的坐标系下,再进行光照计算确定每个顶点应该具有的颜色和亮度。计算机图形学的基本显示单元是像素,这些几何对象被栅格化成像素,最后这些像素被送到帧缓存中等待显示,如图2所示。
在三维图形渲染中存在着一系列的坐标变换,最后将物体本身的坐标变换成二维屏幕上的像素坐标。这些坐标变换都是将上一步变换结果作为输出的,构成一个顶点坐标变换的流水线,如图3所示。所有三维对象的坐标均被统一到了同一个坐标系下,经过投影和裁剪形成规格化的坐标,通过栅格化变换形成图像像素。
Z缓冲区算法又称深度缓冲算法。由于二维平面坐标在透视投影下可以对应无限多个三维坐标。所以栅格化的几何对象包含了每个像素对应的到视点称为深度值的参数,如果栅格化几何对象像素的深度值小于原来像素,就用这个像素的值代替原来位置的值,这就保证了总是距离视点最近的像素被保存下来。
针对以上原理,实现本发明目的的技术方案是:
面向GeoGlobe的真三维立体显示方法,该方法包括以下步骤:
步骤(1)针对GeoGlobe使用的3D API进行监控与渲染数据拦截;
步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;
步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;
步骤(4)针对不同的立体观察设备进行真三维观测。
本发明的方法具体可用下列步骤实现,下列步骤不分先后:
a.监控创建三维显示环境的函数,在该函数中加入调用3D API的系统检测函数功能,获取系统立体显示特性,根据相应的立体显示特性,更改原始设定的显示环境中的立体显示模式,在支持立体显示的硬件上开启真三维立体显示支持,在不支持立体显示的硬件上,设置标志以便进行红绿立体显示。
b.监控开始一帧绘制函数,在该函数中加入代码获取当前绘图帧的视口尺寸,根据渲染的像素格式为立体像对创建临时的缓冲区。
c.监控改变当前绘制矩阵函数,在该函数中加入代码以获取三维应用软件对当前绘制矩阵的更改,通过矩阵参数识别场景渲染的投影类型,当是透视投影时,记录该矩阵,作为三维场景重构的关键参数;
d.监控将帧缓存输出到显示设备的函数,在监控函数加入代码以获取整个帧中各像素的颜色和深度数据,基于步骤c获取的投影变换矩阵信息,反算每个像素在视点坐标系下的三维坐标,重建出基于像素的栅格化的三维场景;根据人眼睛的立体视觉模型,生成可供立体显示的立体像对。
所述步骤(1)中3D API的监控与渲染数据拦截进一步包括:利用API拦截技术,获取三维绘制相关矩阵和三维渲染数据输出,提取实现三维透视变换的投影矩阵、视口宽高,作为三维场景重构的关键参数;利用3D API的特定函数,拦截三维渲染输出,提取显卡帧缓存中的颜色和深度数据,作为三维场景重构的基础。
3D API拦截是指利用计算机编程技术,对GeoGlobe使用的3D API函数调用进行监控,并对3D API产生的渲染数据进行拦截在其中插入自定义代码,达到对原有API进行监控或重新实现的目的。API拦截技术成熟且应用广泛,如屏幕取词软件、反病毒软件、网络防火墙等等。本发明所指的3D API渲染拦截是指拦截特定功能的若干关键3D API函数。
所述步骤(1)中还进一步包括针对其实现3D API函数的拦截的具体步骤:针对GeoGlobe使用的3D API(Direct3D),通过代码注入或/和钩子函数技术编写特定的拦截程序,在三维可视化程序的数据加载阶段,将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.透视投影变换矩阵的识别。在一帧场景的渲染过程中,三维应用软件可能会多次更改投影变换矩阵,只有透视变换矩阵才可以产生透视三维效果。不失一般性,假设透视投影变换矩阵在一帧的渲染过程中保持一致,将透视投影矩阵拦截下来,将矩阵中的特征值作为判据,判断当前拦截的矩阵是否为透视投影矩阵。
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),其中Z′对应于深度缓存中的值。
III.栅格化三维场景数据的重构。设视口的宽度为width′、高度为height′,可由Direct3D 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。
通过调用Direct3D API的读取显卡中颜色缓冲区函数和深度缓冲区函数,利用步骤II中建立的坐标系以及上述关系,可以获得视点坐标系下所有像素点的三维坐标。将所有的三维坐标用三角形面片连接起来,就构成了一个可进行三维渲染的立体表面,该表面通过三维流水线,在任意视角下进行渲染。
所述步骤(3)中“设定两个不同的视点位置并生成立体像对”是利用步骤(2)重构的三维场景,生成两幅影像,形成立体像对。本发明提出基于“立体像素”的三维场景的立体显示模型,所谓立体像素是指将步骤(2)重构的三维场景的每个像素与其对应视点空间的三维坐标一起组成序列[(X,Y,Z),(R,G,B)],构成的一个三维像素空间。针对该空间中的每个像素,按照透视变换原理,计算出其在新视点的像素位置点。
生成立体像对可采用下列两种方法:
方法一.调用3D API,渲染步骤(2)中获得的场景数据,在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对生成。
方法二.采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系,将原始视空间下的像素直接变换到目标视空间下。在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对快速生成。其中:
视点水平偏移,是指新视点距离原始视点在X轴方向上的改变量Dx
视点垂直偏移,是指新视点距离原始视点在Z轴方向上的改变量Dz
图像像素偏移,是指生成的图像像素水平方向的附加偏移Dpixel
则在另一的视点坐标系下,对原始帧图像中点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.将立体图像或像对输送到其他支持立体显示设备上。
本发明旨在解决GeoGlobe程序不能支持立体显示的问题,依靠成熟的代码拦截技术拦截在GeoGlobe对于3D API的调用进行重新编排。通过监控投影矩阵,获取反算三维场景的关键参数,通过绘制的颜色图像和深度图像,逐象素的反求其三维坐标,并将像素值映射到对应的位置上,形成立体像对。通过各种显示模式进行立体显示,本发明也为现有的大量三维程序的直接立体化提供了一条可行的途径。本发明具有如下特色:
(1)解决了在GeoGlobe不能进行立体显示的问题,提升了在GeoGlobe的交互和用户体验。
(2)实现的算法新颖,通过帧缓冲区中的颜色图像数据和深度数据经过重新分配形成立体像对,算法原理简单,编程实现方便。
(3)充分利用了现有的技术资源,由于基于工业标准的Direct3D API开发,具有良好的适应性,对于显卡没有特殊要求。支持多种显示模式,可以在任意显示环境下实现立体显示。
附图说明
图1本发明实施例1的方法流程图
图2本发明采用的三维渲染的基本模式
图3本发明采用的三维图形的坐标变换流水线
图4本发明实施例1的透视投影与透视变换矩阵
图5本发明实施例1的以视点为中心的坐标系
图6本发明实施例1的立体像对的快速生成方法图
具体实施方式
下面结合附图和实施例对本发明做进一步详细说明。
实施例1
如图2和图3所示,由于在建模阶段GeoGlobe均使用Direct3D API作为三维渲染API,故本实施例基于Direct3D API作为实施对象,操作系统平台为Windows XP进行实施。
Direct3D 9的拦截与监控基于Micorsoft Detours SDK开发。Detours是Microsoft提供的一套Windows平台下进行API调用拦截的开发包,支持Win32所有平台。
如图1所示,面向GeoGlobe的真三维立体显示方法,该方法包括以下步骤:
步骤(1)针对GeoGlobe使用的Direct3D API进行监控与渲染数据拦截;
步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;
步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;
步骤(4)针对不同的立体观察设备进行真三维观测。
步骤(1)中Direct3D API的拦截与获取场景渲染数据进一步包括:利用3D API拦截技术,获取三维绘制相关矩阵和三维渲染数据,提取实现三维透视变换的投影矩阵、视口宽高,作为三维场景重构的关键参数;利用3D API的特定函数,拦截三维渲染输出,提取显卡帧缓存中的颜色和深度数据,作为三维场景重构的基础。
步骤(2)进一步包括利用Direct3D API输出到显卡帧缓存中的颜色和深度数据,结合拦截Direct3D API调用而获得的投影参数,来解析生成颜色图像和深度数据的三维空间信息。它进一步包含以下步骤:
I.透视投影变换矩阵的识别。在一帧场景的渲染过程中,三维应用软件可能会多次更改投影变换矩阵,只有透视变换矩阵才可以产生透视三维效果。不失一般性,假设透视投影变换矩阵在一帧的渲染过程中保持一致。透视投影的各项控制参数与对应的矩阵关系见附图4所示。将透视投影矩阵拦截下来,将矩阵中的特征值作为判据,判断当前拦截的矩阵是否为透视投影矩阵。
II.建立视点为坐标原点的三维空间坐标系(简称视点坐标系)。以a截获的透视投影变换矩阵为参数,建立以透视点为坐标原点的视图坐标系: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′,可由Direct3D API相关函数获得。由视口和近平面的比例关系可知任意三维渲染帧图像像素点的坐标P′″(X′″,Y′″)对应于近平面上的三维坐标Pn(xn,yn,zn),其中xn=(X′″-width′/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。
通过调用Direct3D API的读取显卡中颜色缓冲区函数和深度缓冲区函数,利用步骤II中建立的坐标系以及上述关系,可以获得视点坐标系下所有像素点的三维坐标。将所有的三维坐标用三角形面片连接起来,就构成了一个可进行三维渲染的立体表面,该表面通过三维流水线,在任意视角下进行渲染。
步骤(3)利用步骤(2)重构的三维场景,生成两幅影像,形成立体像对。生成立体像对可采用下列两种方法:
方法一.调用3D API,渲染步骤(2)中获得的场景数据,在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对生成。
方法二.采用栅格化三维场景数据,构建原始视空间与目标视空间下像素的映射关系,将原始视空间下的像素直接变换到目标视空间下。在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对快速生成。其中:
视点水平偏移,是指新视点距离原始视点在X轴方向上的改变量Dx
视点垂直偏移,是指新视点距离原始视点在Z轴方向上的改变量Dz
图像像素偏移,是指生成的图象像素水平方向的附加偏移Dpixel
则在另一的视点坐标系下,对原始帧图像中点P(X,Y,Z)的像素标在左视点下的坐标X是Width′*(X-Dx)/(Z-Dz)+Dpixel,Y是Height′*Y/(Z-Dz)。该像素在对于右视点坐标系下,坐标按照上述方法计算,但Dx,Dz取负号。
将每个像素的颜色复制到目标位置。对两个视点都应用该方法从而获得立体像对。该方法具有不经过图形流水线,程序编制简单,优化容易等优点。
步骤(4)将步骤(3)生成的立体像对,通过显示设备输出并进行立体观察。本发明生成的立体像对通过如下方式进行真三维显示:
x.显卡支持的双目立体显示。如在支持立体显示的Direct3D环境下,在创建设备句柄阶段启动Direct3D的立体显示模式,将生成的立体像对分别输送到左右两个缓冲区中,实现立体显示。或
y.在不支持立体显示的显卡上,将立体像对合成为一幅红绿互补色立体图像,从左右立体像对中的一个图像提取红色通道,另一个图像中提取绿色和蓝色通道,将提取的通道融合,形成一个互补色的立体图像。并送回原始的图像缓冲区进行立体显示与观测。或
z.将立体图像或像对输送到其他支持立体显示设备上。
实施例2
一种面向GeoGlobe的真三维立体显示方法,包括对以下函数的拦截:
a.创建三维显示环境的函数,监控该函数,在监控函数中加入调用Direct3D API的系统检测函数功能,获取系统立体显示特性,根据相应的立体显示特性,更改原始设定的显示环境中的立体显示模式,在支持立体显示的硬件上开启真三维立体显示支持,在不支持立体显示的硬件上,设置标志以便进行红绿立体显示。
b.开始一帧绘制函数,监控该函数,在监控函数中加入代码获取当前绘图帧的视口尺寸,根据渲染的像素格式为立体像对创建临时的缓冲区。
d.将帧缓存输出到显示设备的函数,监控该函数,在监控函数加入代码以获取整个帧中各像素的颜色和深度数据,基于c获取的投影变换矩阵信息,反算每个像素在视点坐标系下的三维坐标,重建出基于像素的栅格化的三维场景;
e.基于c获取的投影矩阵信息,反算三维绘制中透视投影的各项参数,根据这些参数、重建栅格化的三维场景,根据人眼睛的立体视觉模型,生成可供立体显示的立体像对。
下面的实施过程是上述方法的具体软件编码过程。
1.基于Detours API,在Windows XP平台下基于Visual Studio 2005建立基于基于C++语言的Win32 DLL工程StereoDriver_GeoGlobe_D3D作为拦截代码框架。
2.在StereoDriver_GeoGlobe_D3D中定义一个数据结构D3D_Stereo,该数据结构包含如下内容:
1)Windows的窗口变量hWnd,类型HWND;
2)Direct3D的设备接口指针,pDevice,类型IDirect3DDevice9;
3)记录视口宽高的变量width,height,类型int;
4)缓存颜色数据的变量ColorBuffer,类型BYTE*;
5)缓存深度数据的变量DepthBuffer,类型float;
6)记录当前矩阵模式的变量MatrixMode,类型D3DTRANSFORMSTATETYPE;
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
SetViewport将当前活动的IDirect3DDevice9渲染上下文的视口设置到指定位置和尺寸。创建监控函数My_IDirect3DDevice9_SetViewport,在My_glViewport中实现如下功能:
如果ActiveD3DL_Stereo不为空,则判断新的视口宽高是否和ActiveD3D_Stereo中的width,height相等。如果不相等释放ActiveD3D_Stereo中原有的ColorBuffer和DepthBuffer内存。根据视口的宽高创建颜色缓冲区ColorBuffer和深度缓存数据DepthBuffer。
调用原始的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变量;调用GetDepthData函数以读取深度值到ActiveD3D_Stereo的DepthBuffer中。
从ActiveD3D_Stereo的Matrix变量中获得透视投影的近平面的宽度width,高度height,以及近平面的zNear和远平面zFar。
根据ActiveD3D_Stereo视口的宽度ViewPortWidth和ViewPortHeight,创建临时的颜色缓冲区,ColorBufferLeft和ColorBufferRight。
从用户设置中获得视点偏移Dx,深度偏移Dz和像素偏移Dpixel.
建立一个循环,对每个ColorBuffer像素,取出对应的像素坐标iX,iY以及颜色RGB以及对应的DepthBuffer中的深度值。利用本发明设计的方法,像素对应的视点坐标系中的坐标P(X,Y,Z)。对左眼使用Dx,Dz,Dpixel为参数。使用本发明设计的快速立体像对生成算法,计算P对应的像素坐标PLeft。对右眼使用-Dx,-Dz,-Dpixel为参数,使用本发明设计的快速立体像对生成算法,计算P对应的像素坐标Pright。将当前像素的颜色分别赋值给ColorBufferLeft的PLeft位置,和ColorBufferRight的Pright位置。
由于Direct3D9默认不支持立体显示模式,从ColorBufferLeft中抽取红色通道,ColorBufferRight中抽取蓝色和绿色通道,组成红绿立体图片,输出到屏幕。
4.编译StereoDriver_GeoGlobe_D3D工程,生成StereoDriver_GeoGlobe_D3D.DLL文件
5.将StereoDriver_GeoGlobe_D3D.DLL文件通过detours SDK的withdll.Exe命令行启动GeoGlobe程序。

Claims (10)

1、面向GeoGlobe的真三维立体显示方法,其特征是,该方法包括以下步骤:
步骤(1)针对GeoGlobe使用的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.透视投影变换矩阵的识别:假设透视投影变换矩阵在一帧的渲染过程中保持一致,将透视投影矩阵拦截下来,将矩阵中的特征值作为判据,判断当前拦截的矩阵是否为透视投影矩阵;
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),其中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、根据权利要求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将渲染数据输出到当前屏幕上的函数。
CN2009100271286A 2009-05-22 2009-05-22 面向GeoGlobe的真三维立体显示方法 Active CN101561936B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2009100271286A CN101561936B (zh) 2009-05-22 2009-05-22 面向GeoGlobe的真三维立体显示方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2009100271286A CN101561936B (zh) 2009-05-22 2009-05-22 面向GeoGlobe的真三维立体显示方法

Publications (2)

Publication Number Publication Date
CN101561936A true CN101561936A (zh) 2009-10-21
CN101561936B CN101561936B (zh) 2011-04-27

Family

ID=41220722

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2009100271286A Active CN101561936B (zh) 2009-05-22 2009-05-22 面向GeoGlobe的真三维立体显示方法

Country Status (1)

Country Link
CN (1) CN101561936B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102436363A (zh) * 2011-08-30 2012-05-02 北京数码大方科技有限公司 自动设置显卡参数的方法及装置

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100678120B1 (ko) * 2004-11-01 2007-02-02 삼성전자주식회사 이동통신 단말기에서 3d 애니메이션 파일을 제공하기 위한 장치 및 방법
CN100386779C (zh) * 2006-06-02 2008-05-07 清华大学 基于通用图形显示卡的被测体正投影与反投影方法
CN100418108C (zh) * 2006-08-14 2008-09-10 东南大学 三维扫描系统中的图形重构方法

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102436363A (zh) * 2011-08-30 2012-05-02 北京数码大方科技有限公司 自动设置显卡参数的方法及装置
CN102436363B (zh) * 2011-08-30 2014-09-17 北京数码大方科技股份有限公司 自动设置显卡参数的方法及装置

Also Published As

Publication number Publication date
CN101561936B (zh) 2011-04-27

Similar Documents

Publication Publication Date Title
CN101477700B (zh) 面向Google Earth与Sketch Up的真三维立体显示方法
CN101477701B (zh) 面向AutoCAD和3DS MAX软件的植入式真三维立体渲染方法
CN101477702B (zh) 计算机显卡的植入式真三维立体驱动方法
CN101635061B (zh) 基于人眼立体视觉机制的自适应立体渲染方法
CN102819855B (zh) 二维图像的生成方法及装置
CN102768765A (zh) 实时点光源软阴影渲染方法
US20170124748A1 (en) Method of and apparatus for graphics processing
CN101540056B (zh) 面向ERDAS Virtual GIS的植入式真三维立体渲染方法
CN101521828B (zh) 面向esri三维gis模块的植入式真三维立体渲染方法
Gimeno et al. Multiuser augmented reality system for indoor exhibitions
CN101511034A (zh) 面向Skyline的真三维立体显示方法
CN101488229B (zh) 面向pci三维分析模块的植入式真三维立体渲染方法
CN116958344A (zh) 虚拟形象的动画生成方法、装置、计算机设备及存储介质
CN101482978B (zh) 面向envi/idl的植入式真三维立体渲染方法
CN101488230B (zh) 面向VirtualEarth的真三维立体显示方法
CN101488232B (zh) 面向C Tech软件的植入式真三维立体显示方法
CN101561935B (zh) 面向GoCAD软件的植入式三维立体显示方法
CN101561936B (zh) 面向GeoGlobe的真三维立体显示方法
CN116452704A (zh) 镜头光晕特效的生成方法、装置、存储介质及电子装置
CN101482977B (zh) 面向Microstation的植入式真三维立体显示方法
CN101488231B (zh) 面向Creator软件的植入式真三维立体显示方法
KR101227183B1 (ko) 3d 그래픽 모델 입체 렌더링 장치 및 입체 렌더링 방법
CN107038737B (zh) 立体棋牌绘制方法和装置
CN106445517A (zh) 一种基于Android设备的裸眼3D交互方法
Schmidt Blended Spaces: Perception and Interaction in Projection-Based Spatial Augmented Reality Environments

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
ASS Succession or assignment of patent right

Owner name: CHANGSHU NJNU DEVELOPMENT RESEARCH INSTITUTE CO.,

Free format text: FORMER OWNER: NANJING NORMAL UNIVERSITY

Effective date: 20120723

C41 Transfer of patent application or patent right or utility model
COR Change of bibliographic data

Free format text: CORRECT: ADDRESS; FROM: 210097 NANJING, JIANGSU PROVINCE TO: 215500 SUZHOU, JIANGSU PROVINCE

TR01 Transfer of patent right

Effective date of registration: 20120723

Address after: 215500 Changshou City South East Economic Development Zone, Jiangsu, Jin Road, No. 8

Patentee after: Changshu Nanjing Normal University Development Research Academy Institute Co., Ltd.

Address before: 210097 Nanjing Road, Jiangsu, Nanjing 122

Patentee before: Nanjing Normal University

TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20201223

Address after: Building 3, No.88, Xianshi Road, high tech Zone, Changshu City, Suzhou City, Jiangsu Province

Patentee after: Changshu Zijin Intellectual Property Service Co.,Ltd.

Address before: 215500 8 Jindu Road, Changshou City Southeast Economic Development Zone, Jiangsu

Patentee before: CHANGSHU NANJING NORMAL UNIVERSITY DEVELOPMENT RESEARCH INSTITUTE Co.,Ltd.