專利名稱:面向AutoCAD和3DS MAX軟件的植入式真三維立體渲染方法
技術(shù)領(lǐng)域:
本發(fā)明涉及三維可視化技術(shù)領(lǐng)域,具體涉及一種面向AutoCAD和犯S MAX 軟件的植入式真三維立體渲染方法。
背景技術(shù):
隨著計算機技術(shù)的發(fā)展,立體顯示已經(jīng)成為環(huán)境仿真、模擬訓(xùn)練以及規(guī)劃 設(shè)計等領(lǐng)域常用的技術(shù)手段,甚至開始與電影、電腦游戲等結(jié)合產(chǎn)生立體電 影和真三維游戲融入人們的日常生活。AutoDesk公司推出的計算機輔助設(shè)計 軟件Au t oCAD和三維建模軟件3DS MAX是兩種重要的三維應(yīng)用軟件。
在三維應(yīng)用中實現(xiàn)立體視覺是一種潮流,在單一顯示設(shè)備上觀察到立體景 物,需要將左、右眼所看到的影像各自獨立分開,然后通過特定的外置設(shè)備 使左右眼看到不同的影像而通過大腦的生理作用形成立體視覺。傳統(tǒng)的立體 顯示需要專業(yè)的設(shè)備進行立體顯示,包括支持左右緩存的顯卡和支持雙通道 顯示的立體顯示設(shè)備?;谏厦约夹g(shù),產(chǎn)生了廣為流行的虛擬現(xiàn)實技術(shù),在 機器仿真、戰(zhàn)場模擬等領(lǐng)域得到了廣泛的應(yīng)用。但是,由于需要專業(yè)設(shè)備, 成本高昂,也限制了立體顯示技術(shù)的應(yīng)用,所以立體顯示的應(yīng)用不能得到推 廣,大量的三維程序還是釆用單通道技術(shù)進行顯示,缺乏立體感,失去了三 維程序應(yīng)有的立體顯示特性。同時,由于立體顯示需要專門硬件,特殊的編 程技巧,也造成了大量的程序在開發(fā)時沒有考慮立體顯示特性,沒有在程序 中實現(xiàn)支持立體顯示的功能,使得這些程序即使在有立體顯示功能的硬件上也不能顯示立體。這些程序占據(jù)了現(xiàn)在三維顯示程序的絕大部分,AutoCAD和 3DSMAX也沒有突破上述限制,其在建模過程中,用戶還是只能看到單通道的 透視三維,不能實現(xiàn)真三維的立體顯示,不能達到最佳的應(yīng)用效果。
發(fā)明內(nèi)容
本發(fā)明所要解決的問題在于克服AutoCAD和犯S MAX軟件在三維顯示中存 在的不足,實現(xiàn)對原軟件不加修改的真三維立體顯示。本發(fā)明的核心是利用 三維渲染的基本原理,通過攔截顯卡結(jié)果幀圖像中顏色數(shù)據(jù)和深度數(shù)據(jù),解 析生成結(jié)果幀圖像的投影變換矩陣,應(yīng)用三維渲染的基本原理以及重構(gòu)柵格 化的三維場景,在此場景基礎(chǔ)上,應(yīng)用立體視覺原理,生成立體像對,基于 不同的立體顯示模式,驅(qū)動顯卡進行立體輸出。
本發(fā)明依賴的技術(shù)基礎(chǔ)是計算機圖形學(xué)中關(guān)于三維渲染的基本模型,即 AutoCAD和3DS MAX使用的3D API (當(dāng)前在Windows下兩種軟件在硬件加速 驅(qū)動下均使用OpenGL)的三維渲染的基本模型,包括三維渲染流水線、頂點的 變換流水線、Z緩沖區(qū)算法等。實現(xiàn)依據(jù)是0penGL API和顯卡,兩者均是基 于該基本模型進行工作的。本發(fā)明在不更改AutoCAD和3DS MAX源代碼、二 進制代碼或計算機硬件結(jié)構(gòu)的情況下,使該計算機軟件實現(xiàn)雙目視覺的立體 真三維顯示與觀測。
計算機三維顯示的基本原理是將三維場景經(jīng)過幾何變換和光照處理以及 柵格化之后,生成一幅二維柵格圖像在輸出設(shè)備上輸出。三維場景中包含一 系列的三維對象,三維對象是由一系列頂點構(gòu)成的幾何圖元(包括點,線和 三角形)組合而成。頂點是一個包含三維空間位置及其對應(yīng)的渲染參數(shù)的坐 標點。首先對頂點數(shù)據(jù)進行透視坐標變換和光照處理。在坐標變換階段,描述物體幾何形狀的頂點被變換到視點為中心的坐標系下,再進行光照計算確 定每個頂點應(yīng)該具有的顏色和亮度。計算機圖形學(xué)的基本顯示單元是像素, 這些幾何對象被柵格化成像素,最后這些像素被送到幀緩存中等待顯示,如 圖2所示。
在三維圖形渲染中存在著一系列的坐標變換,最后將物體本身的坐標變 換成二維屏幕上的像素坐標。這些坐標變換都是將上一步變換結(jié)果作為輸出 的,構(gòu)成一個頂點坐標變換的流水線,如圖3所示。所有三維對象的坐標均被
統(tǒng)一到了同一個坐標系下,經(jīng)過投影和裁剪形成規(guī)格化的坐標,通過柵格化 變換形成圖像像素。
Z緩沖區(qū)算法又稱深度緩沖算法。由于二維平面坐標在透視投影下可以對 應(yīng)無限多個三維坐標。所以柵格化的幾何對象包含了每個像素對應(yīng)的到視點 稱為深度值的參數(shù),如果柵格化幾何對象像素的深度值小于原來像素,就用 這個像素的值代替原來位置的值,這就保證了總是距離視點最近的像素被保 存下來。
針對以上原理,實現(xiàn)本發(fā)明目的的技術(shù)方案是
面向AutoCAD和3DS MAX軟件的植入式真三維立體渲染方法,該方法包括 以下步驟
步驟(1)針對AutoCAD和犯S MAX使用的犯API 0penGL進行監(jiān)控與渲 染數(shù)據(jù)攔截;
步驟(2)利用場景變換矩陣和投影變換矩陣重構(gòu)柵格化的三維數(shù)據(jù);
步驟(3)自適應(yīng)屏幕分辨率和人的眼基距設(shè)定兩個不同的視點位置并生 成立體像對;步驟(4)針對不同的立體觀察設(shè)備進行真三維觀測。
本發(fā)明的方法具體可用下列步驟實現(xiàn),下列步驟不分先后
a. 監(jiān)控創(chuàng)建三維顯示環(huán)境的函數(shù),在該函數(shù)中加入調(diào)用3D API的系統(tǒng)檢 測函數(shù)功能,獲取系統(tǒng)立體顯示特性,根據(jù)相應(yīng)的立體顯示特性,更改原始 設(shè)定的顯示環(huán)境中的立體顯示模式,在支持立體顯示的硬件上開啟真三維立 體顯示支持,在不支持立體顯示的硬件上,設(shè)置標志以便進行紅綠立體顯示。
b. 監(jiān)控開始一幀繪制函數(shù),在該函數(shù)中加入代碼獲取當(dāng)前繪圖幀的視口 尺寸,根據(jù)渲染的像素格式為立體像對創(chuàng)建臨時的緩沖區(qū)。
c. 監(jiān)控改變當(dāng)前繪制矩陣函數(shù),在該函數(shù)中加入代碼以獲取三維應(yīng)用軟 件對當(dāng)前繪制矩陣的更改,通過矩陣參數(shù)識別場景渲染的投影類型,當(dāng)是透 視投影時,記錄該矩陣,作為三維場景重構(gòu)的關(guān)鍵參數(shù);
d. 監(jiān)控將幀緩存輸出到顯示設(shè)備的函數(shù),在監(jiān)控函數(shù)加入代碼以獲取整 個幀中各像素的顏色和深度數(shù)據(jù),基于步驟c獲取的投影變換矩陣信息,反 算每個像素在視點坐標系下的三維坐標,重建出基于像素的柵格化的三維場 景;根據(jù)人眼睛的立體視覺模型,生成可供立體顯示的立體像對。
所述步驟(l)中OpenGLAPI的監(jiān)控與渲染數(shù)據(jù)攔截進一步包括利用API 攔截技術(shù),獲取三維繪制相關(guān)矩陣和三維渲染數(shù)據(jù)輸出,提取實現(xiàn)三維透視 變換的投影矩陣、視口寬高,作為三維場景重構(gòu)的關(guān)鍵參數(shù);利用OpenGLAPI 的特定函數(shù),攔截三維渲染輸出,提取顯卡幀緩存中的顏色和深度數(shù)據(jù),作 為三維場景重構(gòu)的基礎(chǔ)。3D API攔截是指利用計算機編程技術(shù),對AutoCAD和MS MAX使用的 OpenGL API函數(shù)調(diào)用進行監(jiān)控,并對OpenGL API產(chǎn)生的渲染數(shù)據(jù)進行攔截在 其中插入自定義代碼,達到對原有API進行監(jiān)控或重新實現(xiàn)的目的。API攔截 技術(shù)成熟且應(yīng)用廣泛,如屏幕取詞軟件、反病毒軟件、網(wǎng)絡(luò)防火墻等等。本 發(fā)明所指的OpenGL API渲染攔截是指攔截特定功能的若干關(guān)鍵OpenGL API 函數(shù)。
所述步驟(l)中還進一步包括針對其實現(xiàn)3DAPI函數(shù)的攔截的具體步驟.-針對AutoCAD和3DS MAX使用的3D API (OpenGL),通過代碼注入或/和鉤子函 數(shù)技術(shù)編寫特定的攔截程序,在三維可視化程序的數(shù)據(jù)加載階段,將3D API 攔截程序加載到三維可視化程序的進程中,從而攔截和監(jiān)控3D API調(diào)用。本 發(fā)明所指需要攔截的3D API關(guān)鍵函數(shù)如下
(21) 3D API創(chuàng)建三維顯示環(huán)境的函數(shù);
(22) 3D API開始一幀場景渲染的函數(shù);
(23) 3D API改變當(dāng)前渲染矩陣的函數(shù);
(24) 3D API結(jié)東一幀場景渲染的函數(shù);
(25) 3D API將渲染數(shù)據(jù)輸出到當(dāng)前屏幕上的函數(shù)。
所述步驟(2)進一步包括利用OpenGL API輸出到顯卡幀緩存中的顏色和 深度數(shù)據(jù),結(jié)合攔截OpenGL API調(diào)用而獲得的投影參數(shù),來解析生成顏色圖 像和深度數(shù)據(jù)的三維空間信息。即,通過生成三維渲染輸出的投影矩陣和視 口寬高,解算出三維渲染關(guān)鍵控制參數(shù)(視點位置、近平面、遠平面)以及 三維渲染輸出的顏色和深度數(shù)據(jù),進而解算出每個像素在視空間中的三維坐標以及對應(yīng)的顏色特性,重構(gòu)視空間下柵格化的三維場景數(shù)據(jù)。它具體可以 包含以下步驟
I. 透視投影變換矩陣的識別。在一幀場景的渲染過程中,三維應(yīng)用軟件 可能會多次更改投影變換矩陣,只有透視變換矩陣才可以產(chǎn)生透視三維效果。 不失一般性,假設(shè)透視投影變換矩陣在一幀的渲染過程中保持一致,將透視 投影矩陣攔截下來,將矩陣中的特征值作為判據(jù),判斷當(dāng)前攔截的矩陣是否 為透視投影矩陣。
II. 建立視點為坐標原點的三維空間坐標系(簡稱視點坐標系)。以步驟
I截獲的透視投影變換矩陣為參數(shù),建立以透視點為坐標原點的視圖坐標系 Z軸穿過近平面的中心,近平面的Y軸和X軸方向和該坐標系的X軸,Y軸方 向一致,近平面位于近平面值對應(yīng)的Z軸的刻度上。近平面上X的值域是 [-width/2, width/2] , Y的值域是[-height/2, height/2]。在該坐標系中,任 意坐標點P(X,Y,Z)與近平面的交點的坐標值P' (X', Y', Z')可以由透視 投影矩陣變換求得,其中Z'對應(yīng)于幀深度緩存中的深度值。可得X'等于 width/2*X/Z ; Y'等于 height/2*Y/Z ; Z'等于(z—zNear)/z * zFar/(zFar-zNear),其中Z'對應(yīng)于深度緩存中的值。
III.柵格化三維場景數(shù)據(jù)的重構(gòu)。設(shè)視口的寬度為width'、高度為 height',可由0penGL API相關(guān)函數(shù)獲得。由視口和近平面的比例關(guān)系可知 任意三維渲染幀圖像像素點的坐標(X'〃,Y"0對應(yīng)于近平面上的三維 坐標 Pn(xn , yn , zn), 其中 xn= (X'''-width'/2) *width/2 , yn= (Y''' -height' /2) *height/2。對應(yīng)的深度緩存中的值Z',由步驟II可知, 對應(yīng)的視點坐標系下Z值為Z'*(zFar-zNear)/zFar+zNear,可得像素點在視點坐標系下的坐標P(X,Y,Z),其中X等于xNear/zNear*Z , Y等于 yNear/zNear*Z。
通過調(diào)用OpenGL API的讀取顯卡中顏色緩沖區(qū)函數(shù)和深度緩沖區(qū)函數(shù), 利用步驟II中建立的坐標系以及上述關(guān)系,可以獲得視點坐標系下所有像素 點的三維坐標。將所有的三維坐標用三角形面片連接起來,就構(gòu)成了一個可 進行三維渲染的立體表面,該表面通過三維流水線,在任意視角下進行渲染。
所述步驟(3)中"設(shè)定兩個不同的視點位置并生成立體像對"是利用步驟 (2)重構(gòu)的三維場景,生成兩幅影像,形成立體像對。本發(fā)明提出基于"立體 像素"的三維場景的立體顯示模型,所謂立體像素是指將步驟(2)重構(gòu)的三維
場景的每個像素與其對應(yīng)視點空間的三維坐標 一 起組成序列 [(X,Y,Z), (R,G,B)],構(gòu)成的一個三維像素空間。針對該空間中的每個像素,
按照透視變換原理,計算出其在新視點的像素位置點。 生成立體像對可采用下列兩種方法
方法一.調(diào)用3D API,渲染步驟(2)中獲得的場景數(shù)據(jù),在原始圖像作 為左視點圖像情況下,生成右視點圖像;在原始圖像作為右視點圖像情況下, 生成左視點圖像;在不保存原始圖像情況下,生成左右視點圖像,從而實現(xiàn) 立體像對生成。
方法二.釆用柵格化三維場景數(shù)據(jù),構(gòu)建原始視空間與目標視空間下像素 的映射關(guān)系,將原始視空間下的像素直接變換到目標視空間下。在原始圖像 作為左視點圖像情況下,生成右視點圖像;在原始圖像作為右視點圖像情況 下,生成左視點圖像;在不保存原始圖像情況下,生成左右視點圖像,從而實現(xiàn)立體像對快速生成。其中
視點水平偏移,是指新視點距離原始視點在X軸方向上的改變量i^ 。
視點垂直偏移,是指新視點距離原始視點在z軸方向上的改變量z^。
圖像像素偏移,是指生成的圖像像素水平方向的附加偏移/Uw。
則在另 一的視點坐標系下,對原始幀圖像中點P(X, Y, Z)的像素標在左視點
下的坐標X是Width" (X-Dx)/(Z-Dz)+Dpixel, Y是Height"Y/(Z-Dz)。該像素 在對于右視點坐標系下,坐標按照上述方法計算,但Dx,Dz取負號。
將每個像素的顏色復(fù)制到目標位置。對兩個視點都應(yīng)用該方法從而獲得 立體像對。該方法具有不經(jīng)過圖形流水線,程序編制簡單,優(yōu)化容易等優(yōu)點。
所述步驟(4)中"針對不同的立體觀察設(shè)備進行真三維觀測"是指將步 驟(3)生成的立體像對,通過顯示設(shè)備輸出并進行立體觀察。本發(fā)明生成的立 體像對通過如下方式進行真三維顯示
x.顯卡支持的雙目立體顯示。如在支持立體顯示的OpenGL API環(huán)境下, 在創(chuàng)建設(shè)備句柄階段啟動OpenGL API的立體顯示模式,將生成的立體像對分 別輸送到左右兩個緩沖區(qū)中,實現(xiàn)立體顯示。
y.在不支持立體顯示的顯卡上,將立體像對合成為一幅紅綠互補色立體圖 像,從左右立體像對中的一個圖像提取紅色通道,另一個圖像中提取綠色和 藍色通道,將提取的通道融合,形成一個互補色的立體圖像。并送回原始的 圖像緩沖區(qū)進行立體顯示與觀測。
z.將立體圖像或像對輸送到其他支持立體顯示設(shè)備上。
本發(fā)明旨在解決AutoCAD和3DS MAX程序不能支持立體顯示的問題,依靠成熟的代碼攔截技術(shù)攔截在AutoCAD和3DS MAX對于OpenGL API的調(diào)用進行 重新編排。通過監(jiān)控投影矩陣,獲取反算三維場景的關(guān)鍵參數(shù),通過繪制的 顏色圖像和深度圖像,逐象素的反求其三維坐標,并將像素值映射到對應(yīng)的 位置上,形成立體像對。通過各種顯示模式進行立體顯示,本發(fā)明也為現(xiàn)有 的大量三維程序的直接立體化提供了一條可行的途徑。本發(fā)明具有如下特色
(1) 解決了在AutoCAD和3DS MAX不能進行立體顯示的問題,提升了在 AutoCAD和3DS MAX的交互和用戶體驗。
(2) 實現(xiàn)的算法新穎,通過幀緩沖區(qū)中的顏色圖像數(shù)據(jù)和深度數(shù)據(jù)經(jīng)過 重新分配形成立體像對,算法原理簡單,編程實現(xiàn)方便。
(3) 充分利用了現(xiàn)有的技術(shù)資源,由于基于工業(yè)標準的OpenGL API開發(fā), 具有良好的適應(yīng)性,對于顯卡沒有特殊要求。支持多種顯示模式,可以在任 意顯示環(huán)境下實現(xiàn)立體顯示。
圖1本發(fā)明實施例1的方法流程圖
圖2本發(fā)明釆用的三維渲染的基本模式
圖3本發(fā)明釆用的三維圖形的坐標變換流水線
圖4本發(fā)明實施例1的透視投影與透視變換矩陣
圖5本發(fā)明實施例1的以視點為中心的坐標系
圖6本發(fā)明實施例1的立體像對的快速生成方法圖
具體實施方式
下面結(jié)合附圖和實施例對本發(fā)明做進一步詳細說明。 實施例1
如圖2和圖3所示,由于在建模階段AutoCAD和3DS MAX均使用OpenGL API 作為三維渲染API,故本實施例基于OpenGL API作為實施對象,搡作系統(tǒng)平 臺為Windows XP進行實施。
OpenGL API的攔截與監(jiān)控基于Micorsof t Detours SDK開發(fā)。Detours是 Microsoft提供的一套Windows平臺下進行API調(diào)用攔截的開發(fā)包,支持Win32 所有平臺。
如圖l所示,面向AutoCAD和3DS MAX軟件的植入式真三維立體渲染方法,
該方法包括以下步驟
步驟(1)針對AutoCAD和3DS MAX使用的OpenGL API進行監(jiān)控與渲染數(shù)
據(jù)攔截;
步驟(2)利用場景變換矩陣和投影變換矩陣重構(gòu)柵格化的三維數(shù)據(jù); 步驟(3)自適應(yīng)屏幕分辨率和人的眼基距設(shè)定兩個不同的視點位置并生 成立體像對;
步驟(4)針對不同的立體觀察設(shè)備進行真三維觀測。 步驟(1)中OpenGL API的攔截與獲取場景渲染數(shù)據(jù)進一步包括利用 3D API攔截技術(shù),獲取三維繪制相關(guān)矩陣和三維渲染數(shù)據(jù),提取實現(xiàn)三維透 視變換的投影矩陣、視口寬高,作為三維場景重構(gòu)的關(guān)鍵參數(shù);利用3D API 的特定函數(shù),攔截三維渲染輸出,提取顯卡幀緩存中的顏色和深度數(shù)據(jù),作 為三維場景重構(gòu)的基礎(chǔ)。
步驟(2)進一步包括利用OpenGL API輸出到顯卡幀緩存中的顏色和深度數(shù)據(jù),結(jié)合攔截0penGL API調(diào)用而獲得的投影參數(shù),來解析生成顏色圖像和 深度數(shù)據(jù)的三維空間信息。它進一步包含以下步驟
I.透視投影變換矩陣的識別。在一幀場景的渲染過程中,三維應(yīng)用軟件 可能會多次更改投影變換矩陣,只有透視變換矩陣才可以產(chǎn)生透視三維效果。 不失一般性,假設(shè)透視投影變換矩陣在一幀的渲染過程中保持一致。透視投 影的各項控制參數(shù)與對應(yīng)的矩陣關(guān)系見附圖4所示。將透視投影矩陣攔截下 來,將矩陣中的特征值作為判據(jù),判斷當(dāng)前攔截的矩陣是否為透視投影矩陣。
n.建立視點為坐標原點的三維空間坐標系(簡稱視點坐標系)。以a截獲 的透視投影變換矩陣為參數(shù),建立以透視點為坐標原點的視圖坐標系Z軸穿 過近平面的中心,近平面的Y軸和X軸方向和該坐標系的X軸,Y軸方向一致, 近平面位于近平面值對應(yīng)的Z軸的刻度上。近平面上X的值域是 [-width/2, width/2] , Y的值域是[-height/2, height/2]。在該坐標系中,任 意坐標點P(X,Y,Z)與近平面的交點的坐標值P' (X', Y', Z')可以由透視 投影矩陣變換求得,其中Z'對應(yīng)于幀深度緩存中的深度值,如附圖5所示。可 得X'等于width/2*X/Z ; Y'等于height/2*Y/Z; Z'等于(z-zNear)/z * zFar/(zFar-zNear),其中Z'對應(yīng)于深度緩存中的值。
III.柵格化三維場景數(shù)據(jù)的重構(gòu)。設(shè)視口的寬度為width'、高度為 height',可由0penGL API相關(guān)函數(shù)獲得。由視口和近平面的比例關(guān)系可知 任意三維渲染幀圖像像素點的坐標P〃' (X'〃,Y〃0對應(yīng)于近平面上的三維 坐標 Pn(xn , yn , zn), 其中 xn= (X'''-width'/2) *width/2 , yn-(Y〃'-heightV2卜height/2。對應(yīng)的深度緩存中的值Z',由b可知,對應(yīng) 的視點坐標系下Z值為Z'*(zFar-zNear)/zFar+zNear,可得像素點在視點坐標系下的坐標P (X, Y, Z),其中X等于xNear/zNear*Z, Y等于yNear/zNear*Z。 通過調(diào)用0penGL API的讀取顯卡中顏色緩沖區(qū)函數(shù)和深度緩沖區(qū)函數(shù), 利用步驟II中建立的坐標系以及上述關(guān)系,可以獲得視點坐標系下所有像素 點的三維坐標。將所有的三維坐標用三角形面片連接起來,就構(gòu)成了一個可 進行三維渲染的立體表面,該表面通過三維流水線,在任意視角下進行渲染。
步驟(3)利用步驟(2)重構(gòu)的三維場景,生成兩幅影像,形成立體像對。 生成立體像對可采用下列兩種方法
方法一.調(diào)用犯API,渲染步驟(2)中獲得的場景數(shù)據(jù),在原始圖像作 為左視點圖像情況下,生成右視點圖像;在原始圖像作為右視點圖像情況下, 生成左視點圖像;在不保存原始圖像情況下,生成左右視點圖像,從而實現(xiàn) 立體像對生成。
方法二.釆用柵格化三維場景數(shù)據(jù),構(gòu)建原始視空間與目標視空間下像素 的映射關(guān)系,將原始視空間下的像素直接變換到目標視空間下。在原始圖像 作為左視點圖像情況下,生成右視點圖像;在原始圖像作為右視點圖像情況 下,生成左視點圖像;在不保存原始圖像情況下,生成左右視點圖像,從而 實現(xiàn)立體像對快速生成。其中
視點水平偏移,是指新視點距離原始視點在X軸方向上的改變量/^ 。 視點垂直偏移,是指新視點距離原始視點在Z軸方向上的改變量i^。 圖像像素偏移,是指生成的圖象像素水平方向的附加偏移Am。 則在另一的視點坐標系下,對原始幀圖像中點P(X, Y, Z)的像素標在左視點 下的坐標X是Width'*(X-Dx)/(Z-Dz)+Dpixel, Y是Height'*Y/(Z-Dz)。該像素 在對于右視點坐標系下,坐標按照上述方法計算,但Dx,Dz取負號。將每個像素的顏色復(fù)制到目標位置。對兩個視點都應(yīng)用該方法從而獲得 立體像對。該方法具有不經(jīng)過圖形流水線,程序編制簡單,優(yōu)化容易等優(yōu)點。
步驟(4 )將步驟(3)生成的立體像對,通過顯示設(shè)備輸出并進行立體觀察。 本發(fā)明生成的立體像對通過如下方式進行真三維顯示
x.顯卡支持的雙目立體顯示。如在支持立體顯示的0penGL環(huán)境下,在創(chuàng) 建設(shè)備句柄階段啟動0penGL的立體顯示模式,將生成的立體像對分別輸送到 左右兩個緩沖區(qū)中,實現(xiàn)立體顯示?;?br>
y.在不支持立體顯示的顯卡上,將立體像對合成為一幅紅綠互補色立體圖 像,從左右立體像對中的一個圖像提取紅色通道,另一個圖像中提取綠色和 藍色通道,將提取的通道融合,形成一個互補色的立體圖像。并送回原始的
圖像緩沖區(qū)進行立體顯示與觀測。或
z.將立體圖像或像對輸送到其他支持立體顯示設(shè)備上。
一種面向AutoCAD和3DS MAX軟件的植入式真三維立體渲染方法,包括對 以下函數(shù)的攔截
a.創(chuàng)建三維顯示環(huán)境的函數(shù),監(jiān)控該函數(shù),在監(jiān)控函數(shù)中加入調(diào)用3D API 的系統(tǒng)檢測函數(shù)功能,獲取系統(tǒng)立體顯示特性,根據(jù)相應(yīng)的立體顯示特性, 更改原始設(shè)定的顯示環(huán)境中的立體顯示模式,在支持立體顯示的硬件上開啟 真三維立體顯示支持,在不支持立體顯示的硬件上,設(shè)置標志以便進行紅綠 立體顯示。b.開始一幀繪制函數(shù),監(jiān)控該函數(shù),在監(jiān)控函數(shù)中加入代碼獲取當(dāng)前繪圖 幀的視口尺寸,根據(jù)渲染的像素格式為立體像對創(chuàng)建臨時的緩沖區(qū)。
d.將幀緩存輸出到顯示設(shè)備的函數(shù),監(jiān)控該函數(shù),在監(jiān)控函數(shù)加入代碼 以獲取整個幀中各像素的顏色和深度數(shù)據(jù),基于C獲取的投影變換矩陣信息, 反算每個像素在視點坐標系下的三維坐標,重建出基于像素的柵格化的三維
場景;
e.基于c獲取的投影矩陣信息,反算三維繪制中透視投影的各項參數(shù), 根據(jù)這些參數(shù)、重建柵格化的三維場景,根據(jù)人眼睛的立體視覺模型,生成 可供立體顯示的立體像對。
下面的實施過程是上述方法的具體軟件編碼過程。
1. 基于Detours API,在Windows XP平臺下基于Visual Studio 2005建立基 于基于C十+語言的Win32 DLL工程StereoDriver—AutoDesk—OpenGL作為攔截 代碼框架。
2. 在StereoDriver—AutoDesk-OpenGL中定義一個數(shù)據(jù)結(jié)構(gòu)0penGL—Stereo, 該數(shù)據(jù)結(jié)構(gòu)包含如下內(nèi)容
1) Windows繪圖上下文變量hDC,類型HDC;
2) 0penGL 渲染上下文變量hGLRC,類型HGLRC;
3) 記錄當(dāng)前硬件是否支持立體顯示的變量IsStereoSupport,類型 boolj
4) 記錄視口寬高的變量width, height,類型int;
5) 緩存顏色數(shù)據(jù)的變量ColorBuffer,類型GLbyte*;6) 緩存深度數(shù)據(jù)的變量D印thBuffer,類型GLfloat;
7) 記錄當(dāng)前變換矩陣模式的變量MatrixMode,類型GLMatrixMode
8) 記錄當(dāng)前透視投影矩陣的變量Matrix,類型GLfloat [4] [4]
9) 創(chuàng)建一個全局的鏈表gOpenGL—Stereos保存OpenGL—Stereo結(jié)構(gòu)的指針。
10) 創(chuàng)建一個全局的OpenGL—Stereo指針ActiveOpenGL—Stereo,初始 化為而LL。
3.基于Detours API實現(xiàn)對如下函數(shù)的監(jiān)控 1)wglCreateContext
wglCreateContext根據(jù)應(yīng)用程序的設(shè)置,創(chuàng)建一個相應(yīng)的0penGL的渲染 上下文。創(chuàng)建監(jiān)控函數(shù)My-wglCreateContext,在wglCreateContext中實現(xiàn)如 下功能
解析wglCreateContext的參數(shù),判斷用戶程序是否使用PFD—STERE0標 記啟動雙通道立體渲染支持,如果用戶程序啟動立體渲染支持,則說明用戶 程序本身支持立體渲染。
如果用戶程序沒有啟動立體渲染支持,則表明用戶程序不支持立體渲染, 詢問用戶是否啟動植入式立體支持。
如果用戶選擇啟用植入是立體支持,創(chuàng)建0penGL-Stereo結(jié)構(gòu),并保存在 一個包含0penGLStereo結(jié)構(gòu)指針的全局列表中,并初始化。使用 wglChoosePixelFonnat函數(shù)和PF—STEREO標記查詢當(dāng)前顯卡是否支持立體顯 示。如果支持立體顯示則將0penGLStereo的IsStereoSu卯ort設(shè)置為true, 否則設(shè)置為false。使用原始的wglCreateContext創(chuàng)建HGLRC,并在OpenGLStereo中記錄對 應(yīng)的HDC和HGLRC,將OpenGLStereo結(jié)構(gòu)加入到gOpenGL—Stereos中。
2) wglMakeCurrent
wglMakeCurrent在若干OpenGL渲染上下文中選擇一個做為當(dāng)前活動的, 一般在wglMakeCurrent之后開始和結(jié)東 一 幀的繪制。創(chuàng)建監(jiān)控函數(shù) My_wglMakeCurrent,在My_wglMakeCurrent中實現(xiàn)如下功能當(dāng)HDC參數(shù)和 HGLRC參數(shù)不為NULL時,從gOpenGL—Stereos中用這兩個參數(shù)查找對應(yīng)hDC 和hGLRC的OpenGL一Stereo結(jié)構(gòu),并賦值給ActiveOpenGL—Stereo變量。如果 兩個參數(shù)均為亂L,則將Act iveOpenGL—Stereo賦值為NULL。
調(diào)用原始的wglMakeCurrent。
3) glViewport
glViewport將當(dāng)前活動的OpenGL渲染上下文的視口設(shè)置到指定位置和尺 寸。創(chuàng)建監(jiān)控函數(shù)My-glViewport,在My-glViewport中實現(xiàn)如下功能
如果Act iveOpenGL—Stere不為空,則判斷新的視口寬高是否和 ActiveOpenGL—Stereo 中的width, height相等。如果不相等釋放 OpenGL—Stereo中原有的ColorBuffer和D印thBuffer內(nèi)存;根據(jù)視口的寬高 創(chuàng)建顏色緩存區(qū)ColorBuffer和深度緩存區(qū)D印thBuffer;記錄新的width和 height。
調(diào)用原始的glViewport。
4 ) glMatrixMode
glMatrixMode設(shè)置當(dāng)前活動OpenGL渲染上下文的活動矩陣模型。創(chuàng)建監(jiān) 控函數(shù)My_glMatrixMode,在My—glMatrixMode中實現(xiàn)如下功能
21如果ActiveOpenGL—Stereo不為空,貝寸將 ActiveOpenGL—Stere 的 MatrixMode設(shè)置為glMatrixMode的參數(shù)。 調(diào)用原始的glMatrixMode。
5) glLoadMatrixd, glLoadMatrixf
glLoadMatrix為活動的OpenGL渲染上下的當(dāng)前矩陣模式設(shè)置矩陣。創(chuàng)建 監(jiān)控函數(shù)My-glMLoadMatrix,在My_glLoadMatr ix中實現(xiàn)如下功能
如果ActiveOpenGL—Stereo不為空,且其變量MatrixMode等于 gl—projection,貝'U已錄該函數(shù)的m變量至lj ActiveOpenGL-Stere的Matrix中。
調(diào)用原始的glLoadMatrix函數(shù)。
6) SwapBuffers
該函數(shù)將OpenGL渲染的 一幀從顯存輸出到顯示設(shè)備上。創(chuàng)建監(jiān)控函數(shù) My—SwapBuffers,在該函數(shù)中實現(xiàn)如下功能
如果ActiveOpenGL—Stereo不為空,調(diào)用glReadPixels函數(shù),以GL—RGB 從顏色緩沖區(qū)中讀取顏色到ActiveOpenGL_Stereo的ColorBuffer變量;調(diào) 用glReadPixels函數(shù)以GL-DEPTH—COMPONENT參數(shù),讀取深度值到 ActiveOpenGL—Stereo的D印thBuffer中。
從ActiveOpenGL-Stereo的Matrix變量中獲得透視投影的近平面的寬度 width,高度height,以及近平面的zNear和遠平面zFar。
根據(jù)ActiveOpenGL—Stereo中記錄的視口的寬度ViewPortWidth和 ViewPortHeight,創(chuàng)建臨時的顏色緩沖區(qū),ColorBufferLeft 和 ColorBufferRight。
從用戶設(shè)置中獲得視點水平偏移D"視點垂直偏移Dz和像素偏移Dpixel。建立一個循環(huán),對每個ColorBuffer像素,取出對應(yīng)的像素坐標iX, iY以及 顏色RGB以及對應(yīng)的D印thBuffer中的深度值。像素對應(yīng)的視點坐標系中的 坐標P(X,Y,Z)。對左眼以Dx, Dz, Dp^為參數(shù),通過生成三維渲染輸出的投影 矩陣和視口寬高,解算出三維渲染關(guān)鍵控制參數(shù)(視點位置、近平面、遠平 面)以及三維渲染輸出的顏色和深度數(shù)據(jù),進而解算出每個像素在視空間中 的三維坐標以及對應(yīng)的顏色特性,重構(gòu)視空間下柵格化的三維場景數(shù)據(jù),計 算P對應(yīng)的像素坐標P^nt;對右眼以-Dx, -Dz, -D一!為參數(shù),通過生成三維渲染 輸出的投影矩陣和視口寬高,解算出三維渲染關(guān)鍵控制參數(shù)(視點位置、近 平面、遠平面)以及三維渲染輸出的顏色和深度數(shù)據(jù),進而解算出每個像素 在視空間中的三維坐標以及對應(yīng)的顏色特性,重構(gòu)視空間下柵格化的三維場 景數(shù)據(jù),計算P對應(yīng)的右像素坐標P一t。將當(dāng)前像素的顏色分別賦值給 ColorBufferLef t的Punu位置,和ColorBufferRight的P一t位置。
判斷ActiveOpenGL—Stere的IsStereoSupport是否為真。如果為真,調(diào)
到GL—BACK—LEFT和GL-BACK-RIGT中。否則,將ColorBufferRight中的G, B 通道賦值到ColorBufferLef t對應(yīng)像素的G, B通道上去,形成一幅紅綠立體, 將ColorBufferLeft的內(nèi)容拷貝到GL—BACK中。 調(diào)用原始的SwapBuffer。
4. 編 譯 StereoDriver-AutoDesk—OpenGL 工 程 , 生 成 StereoDriver—AutoDesk—0penGL DIX文件
5. 將StereoDriver—AutoDesk-OpenGUIX文件通過detours SDK的 witMll. Exe命令行啟動相應(yīng)程序。
權(quán)利要求
1、面向AutoCAD和3DS MAX軟件的植入式真三維立體渲染方法,其特征是,該方法包括以下步驟步驟(1)針對AutoCAD和3DS MAX使用的3D API OpenGL進行監(jiān)控與渲染數(shù)據(jù)攔截;步驟(2)利用場景變換矩陣和投影變換矩陣重構(gòu)柵格化的三維數(shù)據(jù);步驟(3)自適應(yīng)屏幕分辨率和人的眼基距設(shè)定兩個不同的視點位置并生成立體像對;步驟(4)針對不同的立體觀察設(shè)備進行真三維觀測。
2、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述真三維 立體渲染方法進一步包括下列步驟,下列步驟不分先后a. 監(jiān)控創(chuàng)建三維顯示環(huán)境的函數(shù),在該函數(shù)中加入調(diào)用3D API的系統(tǒng)檢 測函數(shù)功能,獲取系統(tǒng)立體顯示特性,根據(jù)相應(yīng)的立體顯示特性,更改原始 設(shè)定的顯示環(huán)境中的立體顯示模式,在支持立體顯示的硬件上開啟真三維立 體顯示支持,在不支持立體顯示的硬件上,設(shè)置標志以便進行紅綠立體顯示;b. 監(jiān)控開始一幀繪制的函數(shù),在該函數(shù)中加入代碼獲取當(dāng)前繪圖幀的視 口尺寸,根據(jù)渲染的像素格式為立體像對創(chuàng)建臨時的緩沖區(qū);c. 監(jiān)控改變當(dāng)前繪制矩陣的函數(shù),在該函數(shù)中加入代碼以獲取三維應(yīng)用 軟件對當(dāng)前繪制矩陣的更改,通過矩陣參數(shù)識別場景渲染的投影類型,當(dāng)是 透視投影時,記錄該矩陣,作為三維場景重構(gòu)的關(guān)鍵參數(shù);d.監(jiān)控將幀緩存輸出到顯示設(shè)備的函數(shù),在監(jiān)控函數(shù)加入代碼以獲取整 個幀中各像素的顏色和深度數(shù)據(jù),基于步驟C獲取的投影變換矩陣信息,反 算每個像素在視點坐標系下的三維坐標,重建出基于像素的柵格化的三維場景;根據(jù)人眼睛的立體視覺模型,生成可供立體顯示的立體像對。
3、根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟 (1)中0penGL API的監(jiān)控與渲染數(shù)據(jù)攔截進一步包括利用API攔截技術(shù), 獲取三維繪制相關(guān)矩陣和三維渲染數(shù)據(jù)輸出,提取實現(xiàn)三維透視變換的投影 矩陣、視口寬高,作為三維場景重構(gòu)的關(guān)鍵參數(shù);利用3D API的特定函數(shù), 攔截三維渲染輸出,提取顯卡幀緩存中的顏色和深度數(shù)據(jù),作為三維場景重 構(gòu)的基礎(chǔ)。
4、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(l) 中還進一步包括針對其實現(xiàn)3D API函數(shù)的攔截的具體步驟通過代碼注入或 /和鉤子函數(shù)技術(shù)編寫特定的攔截程序,在三維可視化程序的數(shù)據(jù)加載階段, 將3D API攔截程序加載到三維可視化程序的進程中,從而攔截和監(jiān)控犯API調(diào)用。
5、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(2) 進一步包括下列步驟通過生成三維渲染輸出的投影矩陣和視口寬高,解算 出三維渲染關(guān)鍵控制參數(shù)以及三維渲染輸出的顏色和深度數(shù)據(jù),進而解算出 每個像素在視空間中的三維坐標以及對應(yīng)的顏色特性,重構(gòu)視空間下柵格化 的三維場景數(shù)據(jù)。
6、根據(jù)權(quán)利要求l所述的真三維立體渲染方法,其特征是,所述步驟(2) 進一步包含以下步驟-.I. 透視投影變換矩陣的識別假設(shè)透視投影變換矩陣在一幀的渲染過程 中保持一致,將透視投影矩陣攔截下來,將矩陣中的特征值作為判據(jù),判斷 當(dāng)前攔截的矩陣是否為透視投影矩陣;II. 建立視點為坐標原點的三維空間坐標系以步驟I截獲的透視投影變 換矩陣為參數(shù),建立以透視點為坐標原點的視圖坐標系Z軸穿過近平面的中 心,近平面的Y軸和X軸方向和該坐標系的X軸,Y軸方向一致,近平面位于 近平面值對應(yīng)的Z軸的刻度上;近平面上X的值域是[-width〃,width〃],Y 的值域是[-height/2, height/2];在該坐標系中,任意坐標點P (X, Y, Z)與近 平面的交點的坐標值P (X、 Y、 Z。由透視投影矩陣變換求得,其中Z'對 應(yīng)于幀深度緩存中的深度值,X'=width/2*X/Z ; Y'=height/2*Y/Z; Z、(z-zNear)/z * zFar/(zFar-zNear),其中Z'對應(yīng)于深度緩存中的值;ni.柵格化三維場景數(shù)據(jù)的重構(gòu)設(shè)視口的寬度為width'、高度為 height"任意三維渲染幀圖像像素點的坐標P〃' (X"、Y'〃)對應(yīng)于近平面 上的三維坐標Pn(xn, yn, zn),其中xn= W-width'/2) *width/2 , yn-(Y''' -height' /2) *height/2;對應(yīng)的深度緩存中的值Z',對應(yīng)的視點坐標 系下Z=Z'*(zFar-zNear)/zFar+zNear,像素點在視點坐標系下的坐標為 P(X, Y,Z),其中X=xNear/zNear*Z, Y=yNear/zNear*Z;將所有的三維坐標用三角形面片連接起來,就構(gòu)成了一個可進行三維渲染的立體表面。
7、根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(3) 中生成立體像的方法是調(diào)用3DAPI,渲染所述步驟(2)中獲得的場景數(shù)據(jù), 在原始圖像作為左視點圖像情況下,生成右視點圖像;在原始圖像作為右視 點圖像情況下,生成左視點圖像;在不保存原始圖像情況下,生成左右視點圖像,從而實現(xiàn)立體像對生成。
8、根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟 (3)中生成立體像的方法是釆用柵格化三維場景數(shù)據(jù),構(gòu)建原始視空間與目 標視空間下像素的映射關(guān)系,將原始視空間下的像素直接變換到目標視空間下;在原始圖像作為左視點圖像情況下,生成右視點圖像;在原始圖像作為 右視點圖像情況下,生成左視點圖像;在不保存原始圖像情況下,生成左右 視點圖像,從而實現(xiàn)立體像對快速生成。
9、 根據(jù)權(quán)利要求l所述的真三維立體渲染方法,其特征是,所述步驟(4) 中針對不同的顯示與觀測設(shè)備,進行立體顯示與觀測,包括x.在支持立體顯示的設(shè)備上,將立體像對分別輸出到顯卡左右兩個通道, 進行立體顯示;或y.在不支持立體顯示的設(shè)備上,將立體像對中, 一個圖像提取紅色通道, 另一個圖像提取綠色和藍色通道,將提取的通道融合,形成一個互補色的立 體圖像,并支持紅綠眼鏡觀察;或z.將立體圖像或像對輸送到其他支持立體顯示設(shè)備上。
10、 根據(jù)權(quán)利要求l所述的真三維立體渲染方法,其特征是,所述攔截 的3D API函數(shù)包括(21) 3D API創(chuàng)建三維顯示環(huán)境的函數(shù);(22) 3D API開始一幀場景渲染的函數(shù);(23) 3D API改變當(dāng)前渲染矩陣的函數(shù);(24) 3D API結(jié)束一幀場景渲染的函數(shù);(25) 3D API將渲染數(shù)據(jù)輸出到當(dāng)前屏幕上的函數(shù)。
全文摘要
本發(fā)明公開了一種面向AutoCAD和3DS MAX軟件的真三維立體顯示的實現(xiàn)方法在所述軟件采用的3D API調(diào)用和顯卡顯示之間采用植入式的渲染數(shù)據(jù)攔截技術(shù),對原始的單通道顏色信號和深度信號、三維場景變換矩陣和投影變換矩陣進行捕獲;對這些信息進行解析,重構(gòu)柵格化的三維數(shù)據(jù);基于立體視覺原理,自適應(yīng)地將該場景重新變換到兩個不同的視點位置,形成可供立體顯示的雙目視覺立體像對,驅(qū)動顯卡對雙目立體像對進行立體輸出;利用偏振、紅綠和閃閉式眼鏡等進行真三維立體顯示與觀測。本發(fā)明可以對現(xiàn)有AutoCAD和3DS MAX軟件在不改變其程序和操作模式的情況下實現(xiàn)真三維立體化的場景展示。
文檔編號G06T15/00GK101477701SQ200910025518
公開日2009年7月8日 申請日期2009年2月6日 優(yōu)先權(quán)日2009年2月6日
發(fā)明者吳明光, 溫永寧, 盛業(yè)華, 閭國年 申請人:南京師范大學(xué)