面向AutoCAD和3DSMAX软件的植入式真三维立体渲染方法

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

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


图1本发明实施例1的方法流程图
图2本发明釆用的三维渲染的基本模式
图3本发明釆用的三维图形的坐标变换流水线
图4本发明实施例1的透视投影与透视变换矩阵
图5本发明实施例1的以视点为中心的坐标系
图6本发明实施例1的立体像对的快速生成方法图
具体实施方式
下面结合附图和实施例对本发明做进一步详细说明。 实施例1
如图2和图3所示,由于在建模阶段AutoCAD和3DS MAX均使用OpenGL API 作为三维渲染API,故本实施例基于OpenGL API作为实施对象,搡作系统平 台为Windows XP进行实施。
OpenGL API的拦截与监控基于Micorsof t Detours SDK开发。Detours是 Microsoft提供的一套Windows平台下进行API调用拦截的开发包,支持Win32 所有平台。
如图l所示,面向AutoCAD和3DS MAX软件的植入式真三维立体渲染方法,
该方法包括以下步骤
步骤(1)针对AutoCAD和3DS MAX使用的OpenGL API进行监控与渲染数
据拦截;
步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据; 步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生 成立体像对;
步骤(4)针对不同的立体观察设备进行真三维观测。 步骤(1)中OpenGL API的拦截与获取场景渲染数据进一步包括利用 3D API拦截技术,获取三维绘制相关矩阵和三维渲染数据,提取实现三维透 视变换的投影矩阵、视口宽高,作为三维场景重构的关键参数;利用3D API 的特定函数,拦截三维渲染输出,提取显卡帧缓存中的颜色和深度数据,作 为三维场景重构的基础。
步骤(2)进一步包括利用OpenGL API输出到显卡帧缓存中的颜色和深度数据,结合拦截0penGL API调用而获得的投影参数,来解析生成颜色图像和 深度数据的三维空间信息。它进一步包含以下步骤
I.透视投影变换矩阵的识别。在一帧场景的渲染过程中,三维应用软件 可能会多次更改投影变换矩阵,只有透视变换矩阵才可以产生透视三维效果。 不失一般性,假设透视投影变换矩阵在一帧的渲染过程中保持一致。透视投 影的各项控制参数与对应的矩阵关系见附图4所示。将透视投影矩阵拦截下 来,将矩阵中的特征值作为判据,判断当前拦截的矩阵是否为透视投影矩阵。
n.建立视点为坐标原点的三维空间坐标系(简称视点坐标系)。以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',可由0penGL API相关函数获得。由视口和近平面的比例关系可知 任意三维渲染帧图像像素点的坐标P〃' (X'〃,Y〃0对应于近平面上的三维 坐标 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。 通过调用0penGL API的读取显卡中颜色缓冲区函数和深度缓冲区函数, 利用步骤II中建立的坐标系以及上述关系,可以获得视点坐标系下所有像素 点的三维坐标。将所有的三维坐标用三角形面片连接起来,就构成了一个可 进行三维渲染的立体表面,该表面通过三维流水线,在任意视角下进行渲染。
步骤(3)利用步骤(2)重构的三维场景,生成两幅影像,形成立体像对。 生成立体像对可采用下列两种方法
方法一.调用犯API,渲染步骤(2)中获得的场景数据,在原始图像作 为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况下, 生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现 立体像对生成。
方法二.釆用栅格化三维场景数据,构建原始视空间与目标视空间下像素 的映射关系,将原始视空间下的像素直接变换到目标视空间下。在原始图像 作为左视点图像情况下,生成右视点图像;在原始图像作为右视点图像情况 下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而 实现立体像对快速生成。其中
视点水平偏移,是指新视点距离原始视点在X轴方向上的改变量/^ 。 视点垂直偏移,是指新视点距离原始视点在Z轴方向上的改变量i^。 图像像素偏移,是指生成的图象像素水平方向的附加偏移Am。 则在另一的视点坐标系下,对原始帧图像中点P(X, Y, Z)的像素标在左视点 下的坐标X是Width'*(X-Dx)/(Z-Dz)+Dpixel, Y是Height'*Y/(Z-Dz)。该像素 在对于右视点坐标系下,坐标按照上述方法计算,但Dx,Dz取负号。将每个像素的颜色复制到目标位置。对两个视点都应用该方法从而获得 立体像对。该方法具有不经过图形流水线,程序编制简单,优化容易等优点。
步骤(4 )将步骤(3)生成的立体像对,通过显示设备输出并进行立体观察。 本发明生成的立体像对通过如下方式进行真三维显示
x.显卡支持的双目立体显示。如在支持立体显示的0penGL环境下,在创 建设备句柄阶段启动0penGL的立体显示模式,将生成的立体像对分别输送到 左右两个缓冲区中,实现立体显示。或
y.在不支持立体显示的显卡上,将立体像对合成为一幅红绿互补色立体图 像,从左右立体像对中的一个图像提取红色通道,另一个图像中提取绿色和 蓝色通道,将提取的通道融合,形成一个互补色的立体图像。并送回原始的
图像缓冲区进行立体显示与观测。或
z.将立体图像或像对输送到其他支持立体显示设备上。
一种面向AutoCAD和3DS MAX软件的植入式真三维立体渲染方法,包括对 以下函数的拦截
a.创建三维显示环境的函数,监控该函数,在监控函数中加入调用3D API 的系统检测函数功能,获取系统立体显示特性,根据相应的立体显示特性, 更改原始设定的显示环境中的立体显示模式,在支持立体显示的硬件上开启 真三维立体显示支持,在不支持立体显示的硬件上,设置标志以便进行红绿 立体显示。b.开始一帧绘制函数,监控该函数,在监控函数中加入代码获取当前绘图 帧的视口尺寸,根据渲染的像素格式为立体像对创建临时的缓冲区。
d.将帧缓存输出到显示设备的函数,监控该函数,在监控函数加入代码 以获取整个帧中各像素的颜色和深度数据,基于C获取的投影变换矩阵信息, 反算每个像素在视点坐标系下的三维坐标,重建出基于像素的栅格化的三维
场景;
e.基于c获取的投影矩阵信息,反算三维绘制中透视投影的各项参数, 根据这些参数、重建栅格化的三维场景,根据人眼睛的立体视觉模型,生成 可供立体显示的立体像对。
下面的实施过程是上述方法的具体软件编码过程。
1. 基于Detours API,在Windows XP平台下基于Visual Studio 2005建立基 于基于C十+语言的Win32 DLL工程StereoDriver—AutoDesk—OpenGL作为拦截 代码框架。
2. 在StereoDriver—AutoDesk-OpenGL中定义一个数据结构0penGL—Stereo, 该数据结构包含如下内容
1) Windows绘图上下文变量hDC,类型HDC;
2) 0penGL 渲染上下文变量hGLRC,类型HGLRC;
3) 记录当前硬件是否支持立体显示的变量IsStereoSupport,类型 boolj
4) 记录视口宽高的变量width, height,类型int;
5) 缓存颜色数据的变量ColorBuffer,类型GLbyte*;6) 缓存深度数据的变量D印thBuffer,类型GLfloat;
7) 记录当前变换矩阵模式的变量MatrixMode,类型GLMatrixMode
8) 记录当前透视投影矩阵的变量Matrix,类型GLfloat [4] [4]
9) 创建一个全局的链表gOpenGL—Stereos保存OpenGL—Stereo结构的指针。
10) 创建一个全局的OpenGL—Stereo指针ActiveOpenGL—Stereo,初始 化为而LL。
3.基于Detours API实现对如下函数的监控 1)wglCreateContext
wglCreateContext根据应用程序的设置,创建一个相应的0penGL的渲染 上下文。创建监控函数My-wglCreateContext,在wglCreateContext中实现如 下功能
解析wglCreateContext的参数,判断用户程序是否使用PFD—STERE0标 记启动双通道立体渲染支持,如果用户程序启动立体渲染支持,则说明用户 程序本身支持立体渲染。
如果用户程序没有启动立体渲染支持,则表明用户程序不支持立体渲染, 询问用户是否启动植入式立体支持。
如果用户选择启用植入是立体支持,创建0penGL-Stereo结构,并保存在 一个包含0penGLStereo结构指针的全局列表中,并初始化。使用 wglChoosePixelFonnat函数和PF—STEREO标记查询当前显卡是否支持立体显 示。如果支持立体显示则将0penGLStereo的IsStereoSu卯ort设置为true, 否则设置为false。使用原始的wglCreateContext创建HGLRC,并在OpenGLStereo中记录对 应的HDC和HGLRC,将OpenGLStereo结构加入到gOpenGL—Stereos中。
2) wglMakeCurrent
wglMakeCurrent在若干OpenGL渲染上下文中选择一个做为当前活动的, 一般在wglMakeCurrent之后开始和结東 一 帧的绘制。创建监控函数 My_wglMakeCurrent,在My_wglMakeCurrent中实现如下功能当HDC参数和 HGLRC参数不为NULL时,从gOpenGL—Stereos中用这两个参数查找对应hDC 和hGLRC的OpenGL一Stereo结构,并赋值给ActiveOpenGL—Stereo变量。如果 两个参数均为亂L,则将Act iveOpenGL—Stereo赋值为NULL。
调用原始的wglMakeCurrent。
3) glViewport
glViewport将当前活动的OpenGL渲染上下文的视口设置到指定位置和尺 寸。创建监控函数My-glViewport,在My-glViewport中实现如下功能
如果Act iveOpenGL—Stere不为空,则判断新的视口宽高是否和 ActiveOpenGL—Stereo 中的width, height相等。如果不相等释放 OpenGL—Stereo中原有的ColorBuffer和D印thBuffer内存;根据视口的宽高 创建颜色缓存区ColorBuffer和深度缓存区D印thBuffer;记录新的width和 height。
调用原始的glViewport。
4 ) glMatrixMode
glMatrixMode设置当前活动OpenGL渲染上下文的活动矩阵模型。创建监 控函数My_glMatrixMode,在My—glMatrixMode中实现如下功能
21如果ActiveOpenGL—Stereo不为空,贝寸将 ActiveOpenGL—Stere 的 MatrixMode设置为glMatrixMode的参数。 调用原始的glMatrixMode。
5) glLoadMatrixd, glLoadMatrixf
glLoadMatrix为活动的OpenGL渲染上下的当前矩阵模式设置矩阵。创建 监控函数My-glMLoadMatrix,在My_glLoadMatr ix中实现如下功能
如果ActiveOpenGL—Stereo不为空,且其变量MatrixMode等于 gl—projection,贝'U已录该函数的m变量至lj ActiveOpenGL-Stere的Matrix中。
调用原始的glLoadMatrix函数。
6) SwapBuffers
该函数将OpenGL渲染的 一帧从显存输出到显示设备上。创建监控函数 My—SwapBuffers,在该函数中实现如下功能
如果ActiveOpenGL—Stereo不为空,调用glReadPixels函数,以GL—RGB 从颜色缓冲区中读取颜色到ActiveOpenGL_Stereo的ColorBuffer变量;调 用glReadPixels函数以GL-DEPTH—COMPONENT参数,读取深度值到 ActiveOpenGL—Stereo的D印thBuffer中。
从ActiveOpenGL-Stereo的Matrix变量中获得透视投影的近平面的宽度 width,高度height,以及近平面的zNear和远平面zFar。
根据ActiveOpenGL—Stereo中记录的视口的宽度ViewPortWidth和 ViewPortHeight,创建临时的颜色缓冲区,ColorBufferLeft 和 ColorBufferRight。
从用户设置中获得视点水平偏移D"视点垂直偏移Dz和像素偏移Dpixel。建立一个循环,对每个ColorBuffer像素,取出对应的像素坐标iX, iY以及 颜色RGB以及对应的D印thBuffer中的深度值。像素对应的视点坐标系中的 坐标P(X,Y,Z)。对左眼以Dx, Dz, Dp^为参数,通过生成三维渲染输出的投影 矩阵和视口宽高,解算出三维渲染关键控制参数(视点位置、近平面、远平 面)以及三维渲染输出的颜色和深度数据,进而解算出每个像素在视空间中 的三维坐标以及对应的颜色特性,重构视空间下栅格化的三维场景数据,计 算P对应的像素坐标P^nt;对右眼以-Dx, -Dz, -D一!为参数,通过生成三维渲染 输出的投影矩阵和视口宽高,解算出三维渲染关键控制参数(视点位置、近 平面、远平面)以及三维渲染输出的颜色和深度数据,进而解算出每个像素 在视空间中的三维坐标以及对应的颜色特性,重构视空间下栅格化的三维场 景数据,计算P对应的右像素坐标P一t。将当前像素的颜色分别赋值给 ColorBufferLef t的Punu位置,和ColorBufferRight的P一t位置。
判断ActiveOpenGL—Stere的IsStereoSupport是否为真。如果为真,调
到GL—BACK—LEFT和GL-BACK-RIGT中。否则,将ColorBufferRight中的G, B 通道赋值到ColorBufferLef t对应像素的G, B通道上去,形成一幅红绿立体, 将ColorBufferLeft的内容拷贝到GL—BACK中。 调用原始的SwapBuffer。
4. 编 译 StereoDriver-AutoDesk—OpenGL 工 程 , 生 成 StereoDriver—AutoDesk—0penGL DIX文件
5. 将StereoDriver—AutoDesk-OpenGUIX文件通过detours SDK的 witMll. Exe命令行启动相应程序。
权利要求
1、面向AutoCAD和3DS MAX软件的植入式真三维立体渲染方法,其特征是,该方法包括以下步骤步骤(1)针对AutoCAD和3DS MAX使用的3D API OpenGL进行监控与渲染数据拦截;步骤(2)利用场景变换矩阵和投影变换矩阵重构栅格化的三维数据;步骤(3)自适应屏幕分辨率和人的眼基距设定两个不同的视点位置并生成立体像对;步骤(4)针对不同的立体观察设备进行真三维观测。
2、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述真三维 立体渲染方法进一步包括下列步骤,下列步骤不分先后a. 监控创建三维显示环境的函数,在该函数中加入调用3D API的系统检 测函数功能,获取系统立体显示特性,根据相应的立体显示特性,更改原始 设定的显示环境中的立体显示模式,在支持立体显示的硬件上开启真三维立 体显示支持,在不支持立体显示的硬件上,设置标志以便进行红绿立体显示;b. 监控开始一帧绘制的函数,在该函数中加入代码获取当前绘图帧的视 口尺寸,根据渲染的像素格式为立体像对创建临时的缓冲区;c. 监控改变当前绘制矩阵的函数,在该函数中加入代码以获取三维应用 软件对当前绘制矩阵的更改,通过矩阵参数识别场景渲染的投影类型,当是 透视投影时,记录该矩阵,作为三维场景重构的关键参数;d.监控将帧缓存输出到显示设备的函数,在监控函数加入代码以获取整 个帧中各像素的颜色和深度数据,基于步骤C获取的投影变换矩阵信息,反 算每个像素在视点坐标系下的三维坐标,重建出基于像素的栅格化的三维场景;根据人眼睛的立体视觉模型,生成可供立体显示的立体像对。
3、根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤 (1)中0penGL API的监控与渲染数据拦截进一步包括利用API拦截技术, 获取三维绘制相关矩阵和三维渲染数据输出,提取实现三维透视变换的投影 矩阵、视口宽高,作为三维场景重构的关键参数;利用3D API的特定函数, 拦截三维渲染输出,提取显卡帧缓存中的颜色和深度数据,作为三维场景重 构的基础。
4、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(l) 中还进一步包括针对其实现3D API函数的拦截的具体步骤通过代码注入或 /和钩子函数技术编写特定的拦截程序,在三维可视化程序的数据加载阶段, 将3D API拦截程序加载到三维可视化程序的进程中,从而拦截和监控犯API调用。
5、 根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤(2) 进一步包括下列步骤通过生成三维渲染输出的投影矩阵和视口宽高,解算 出三维渲染关键控制参数以及三维渲染输出的颜色和深度数据,进而解算出 每个像素在视空间中的三维坐标以及对应的颜色特性,重构视空间下栅格化 的三维场景数据。
6、根据权利要求l所述的真三维立体渲染方法,其特征是,所述步骤(2) 进一步包含以下步骤-.I. 透视投影变换矩阵的识别假设透视投影变换矩阵在一帧的渲染过程 中保持一致,将透视投影矩阵拦截下来,将矩阵中的特征值作为判据,判断 当前拦截的矩阵是否为透视投影矩阵;II. 建立视点为坐标原点的三维空间坐标系以步骤I截获的透视投影变 换矩阵为参数,建立以透视点为坐标原点的视图坐标系Z轴穿过近平面的中 心,近平面的Y轴和X轴方向和该坐标系的X轴,Y轴方向一致,近平面位于 近平面值对应的Z轴的刻度上;近平面上X的值域是[-width〃,width〃],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'对应于深度缓存中的值;ni.栅格化三维场景数据的重构设视口的宽度为width'、高度为 height"任意三维渲染帧图像像素点的坐标P〃' (X"、Y'〃)对应于近平面 上的三维坐标Pn(xn, yn, zn),其中xn= W-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) 中生成立体像的方法是调用3DAPI,渲染所述步骤(2)中获得的场景数据, 在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为右视 点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右视点图像,从而实现立体像对生成。
8、根据权利要求1所述的真三维立体渲染方法,其特征是,所述步骤 (3)中生成立体像的方法是釆用栅格化三维场景数据,构建原始视空间与目 标视空间下像素的映射关系,将原始视空间下的像素直接变换到目标视空间下;在原始图像作为左视点图像情况下,生成右视点图像;在原始图像作为 右视点图像情况下,生成左视点图像;在不保存原始图像情况下,生成左右 视点图像,从而实现立体像对快速生成。
9、 根据权利要求l所述的真三维立体渲染方法,其特征是,所述步骤(4) 中针对不同的显示与观测设备,进行立体显示与观测,包括x.在支持立体显示的设备上,将立体像对分别输出到显卡左右两个通道, 进行立体显示;或y.在不支持立体显示的设备上,将立体像对中, 一个图像提取红色通道, 另一个图像提取绿色和蓝色通道,将提取的通道融合,形成一个互补色的立 体图像,并支持红绿眼镜观察;或z.将立体图像或像对输送到其他支持立体显示设备上。
10、 根据权利要求l所述的真三维立体渲染方法,其特征是,所述拦截 的3D API函数包括(21) 3D API创建三维显示环境的函数;(22) 3D API开始一帧场景渲染的函数;(23) 3D API改变当前渲染矩阵的函数;(24) 3D API结束一帧场景渲染的函数;(25) 3D API将渲染数据输出到当前屏幕上的函数。
全文摘要
本发明公开了一种面向AutoCAD和3DS MAX软件的真三维立体显示的实现方法在所述软件采用的3D API调用和显卡显示之间采用植入式的渲染数据拦截技术,对原始的单通道颜色信号和深度信号、三维场景变换矩阵和投影变换矩阵进行捕获;对这些信息进行解析,重构栅格化的三维数据;基于立体视觉原理,自适应地将该场景重新变换到两个不同的视点位置,形成可供立体显示的双目视觉立体像对,驱动显卡对双目立体像对进行立体输出;利用偏振、红绿和闪闭式眼镜等进行真三维立体显示与观测。本发明可以对现有AutoCAD和3DS MAX软件在不改变其程序和操作模式的情况下实现真三维立体化的场景展示。
文档编号G06T15/00GK101477701SQ200910025518
公开日2009年7月8日 申请日期2009年2月6日 优先权日2009年2月6日
发明者吴明光, 温永宁, 盛业华, 闾国年 申请人:南京师范大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1