国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      面向GoogleEarth與SketchUp的真三維立體顯示方法

      文檔序號(hào):6481521閱讀:389來(lái)源:國(guó)知局
      專利名稱:面向Google Earth與Sketch Up的真三維立體顯示方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及三維可視化技術(shù)領(lǐng)域,具體涉及一種面向Google Earth與Sketch Up軟件 的植入式真三維立體渲染方法。
      背景技術(shù)
      隨著計(jì)算機(jī)技術(shù)的發(fā)展,立體顯示已經(jīng)成為環(huán)境仿真、模擬訓(xùn)練以及規(guī)劃設(shè)計(jì)等領(lǐng)域 常用的技術(shù)手段,甚至開(kāi)始與電影、電腦游戲等結(jié)合產(chǎn)生立體電影和真三維游戲融入人們 的日常生活。虛擬地球軟件作為一種重要的三位應(yīng)用系統(tǒng),以期豐富的數(shù)據(jù),友好的用戶 體驗(yàn)受到了廣泛的關(guān)注,Google Earth軟件就是其中之一,Google Sketch Up是配合Google Earth推出的一個(gè)三維快速建模軟件,為Google Earth提供地物建模工具。
      在三維應(yīng)用中實(shí)現(xiàn)立體視覺(jué)是一種潮流,在單一顯示設(shè)備上觀察到立體景物,需要將 左、右眼所看到的影像各自獨(dú)立分開(kāi),然后通過(guò)特定的外置設(shè)備使左右眼看到不同的影像 而通過(guò)大腦的生理作用形成立體視覺(jué)。傳統(tǒng)的立體顯示需要專業(yè)的設(shè)備進(jìn)行立體顯示,包 括支持左右緩存的顯卡和支持雙通道顯示的立體顯示設(shè)備?;谏鲜黾夹g(shù),產(chǎn)生了廣為流 行的虛擬現(xiàn)實(shí)技術(shù),在機(jī)器仿真、戰(zhàn)場(chǎng)模擬等領(lǐng)域得到了廣泛的應(yīng)用。但是,由于需要專 業(yè)設(shè)備,成本高昂,也限制了立體顯示技術(shù)的應(yīng)用,所以立體顯示的應(yīng)用不能得到推廣, 大量的三維程序還是采用單通道技術(shù)進(jìn)行顯示,缺乏立體感,失去了三維程序應(yīng)有的立體 顯示特性。同時(shí),由于立體顯示需要專門硬件,特殊的編程技巧,也造成了大量的程序在 開(kāi)發(fā)時(shí)沒(méi)有考慮立體顯示特性,沒(méi)有在程序中實(shí)現(xiàn)支持立體顯示的功能,使得這些程序即 使在有立體顯示功能的硬件上也不能顯示立體。這些程序占據(jù)了現(xiàn)在三維顯示程序的絕大
      部分,Google Earth與Sketch Up也沒(méi)有突破上述限制,其在建模過(guò)程中,用戶還是只能 看到單通道的透視三維,不能實(shí)現(xiàn)真三維的立體顯示,不能達(dá)到最佳的應(yīng)用效果。

      發(fā)明內(nèi)容
      本發(fā)明所要解決的問(wèn)題在于克服Google Earth與Sketch Up軟件(下簡(jiǎn)稱Google軟 件)在三維顯示中存在的不足,實(shí)現(xiàn)對(duì)原軟件不加修改的真三維立體顯示。本發(fā)明的核心 是利用三維渲染的基本原理,通過(guò)攔截顯卡結(jié)果幀圖像中顏色數(shù)據(jù)和深度數(shù)據(jù),解析生成 結(jié)果幀圖像的投影變換矩陣,應(yīng)用三維渲染的基本原理以及重構(gòu)柵格化的三維場(chǎng)景,在此 場(chǎng)景基礎(chǔ)上,應(yīng)用立體視覺(jué)原理,生成立體像對(duì),基于不同的立體顯示模式,驅(qū)動(dòng)顯卡進(jìn)
      5行立體輸出。
      本發(fā)明依賴的技術(shù)基礎(chǔ)是Google軟件使用的3D API (0penGL和Direct3D)的三維渲 染的基本模型,包括三維渲染流水線,頂點(diǎn)的變換流水線,Z緩沖區(qū)算法,在不更改Google 軟件源代碼、二進(jìn)制代碼或計(jì)算機(jī)硬件結(jié)構(gòu)的情況下,使該計(jì)算機(jī)軟件實(shí)現(xiàn)雙目視覺(jué)的立 體真三維顯示與觀測(cè)。
      計(jì)算機(jī)三維顯示的基本原理是將三維場(chǎng)景經(jīng)過(guò)幾何變換和光照處理以及柵格化之后,
      生成一幅二維柵格圖像在輸出設(shè)備上輸出。三維場(chǎng)景中包含一系列的三維對(duì)象,三維對(duì)象 是由一系列頂點(diǎn)構(gòu)成的幾何圖元(包括點(diǎn),線和三角形)組合而成。頂點(diǎn)是一個(gè)包含三維 空間位置及其對(duì)應(yīng)的渲染參數(shù)的坐標(biāo)點(diǎn)。首先對(duì)頂點(diǎn)數(shù)據(jù)進(jìn)行透視坐標(biāo)變換和光照處理。 在坐標(biāo)變換階段,描述物體幾何形狀的頂點(diǎn)被變換到視點(diǎn)為中心的坐標(biāo)系下,再進(jìn)行光照 計(jì)算確定每個(gè)頂點(diǎn)應(yīng)該具有的顏色和亮度。計(jì)算機(jī)圖形學(xué)的基本顯示單元是像素,這些幾 何對(duì)象被柵格化成像素,最后這些像素被送到幀緩存中等待顯示,如圖2所示。
      在三維圖形渲染中存在著一系列的坐標(biāo)變換,最后將物體本身的坐標(biāo)變換成二維屏幕 上的像素坐標(biāo)。這些坐標(biāo)變換都是將上一步變換結(jié)果作為輸出的,構(gòu)成一個(gè)頂點(diǎn)坐標(biāo)變換 的流水線,如圖3所示。所有三維對(duì)象的坐標(biāo)均被統(tǒng)一到了同一個(gè)坐標(biāo)系下,經(jīng)過(guò)投影和 裁剪形成規(guī)格化的坐標(biāo),通過(guò)柵格化變換形成圖像像素。
      Z緩沖區(qū)算法又稱深度緩沖算法。由于二維平面坐標(biāo)在透視投影下可以對(duì)應(yīng)無(wú)限多個(gè) 三維坐標(biāo)。所以柵格化的幾何對(duì)象包含了每個(gè)像素對(duì)應(yīng)的到視點(diǎn)稱為深度值的參數(shù),如果 柵格化幾何對(duì)象像素的深度值小于原來(lái)像素,就用這個(gè)像素的值代替原來(lái)位置的值,這就 保證了總是距離視點(diǎn)最近的像素被保存下來(lái)。
      針對(duì)以上原理,實(shí)現(xiàn)本發(fā)明目的的技術(shù)方案是
      面向Google Earth與Sketch Up軟件的植入式真三維立體渲染方法,該方法包括以下 步驟
      步驟(1)針對(duì)Google軟件使用的3D API(包括OpenGL和Direct3D)進(jìn)行監(jiān)控與渲染 數(shù)據(jù)攔截;
      步驟(2)利用場(chǎng)景變換矩陣和投影變換矩陣重構(gòu)柵格化的三維數(shù)據(jù);
      步驟(3)自適應(yīng)屏幕分辨率和人的眼基距設(shè)定兩個(gè)不同的視點(diǎn)位置并生成立體像對(duì);
      步驟(4)針對(duì)不同的立體觀察設(shè)備進(jìn)行真三維觀測(cè)。
      本發(fā)明的方法具體可用下列步驟實(shí)現(xiàn),下列步驟不分先后
      6a. 監(jiān)控創(chuàng)建三維顯示環(huán)境的函數(shù),在該函數(shù)中加入調(diào)用3D API的系統(tǒng)檢測(cè)函數(shù)功能, 獲取系統(tǒng)立體顯示特性,根據(jù)相應(yīng)的立體顯示特性,更改原始設(shè)定的顯示環(huán)境中的立體顯 示模式,在支持立體顯示的硬件上開(kāi)啟真三維立體顯示支持,在不支持立體顯示的硬件上, 設(shè)置標(biāo)志以便進(jìn)行紅綠立體顯示;
      b. 監(jiān)控開(kāi)始一幀繪制的函數(shù),在該函數(shù)中加入代碼獲取當(dāng)前繪圖幀的視口尺寸,根據(jù) 渲染的像素格式為立體像對(duì)創(chuàng)建臨時(shí)的緩沖區(qū);
      c. 監(jiān)控改變當(dāng)前繪制矩陣的函數(shù),在該函數(shù)中加入代碼以獲取三維應(yīng)用軟件對(duì)當(dāng)前繪 制矩陣的更改,通過(guò)矩陣參數(shù)識(shí)別場(chǎng)景渲染的投影類型,當(dāng)是透視投影時(shí),記錄該矩陣, 作為三維場(chǎng)景重構(gòu)的關(guān)鍵參數(shù);
      d. 監(jiān)控將幀緩存輸出到顯示設(shè)備的函數(shù),在監(jiān)控函數(shù)加入代碼以獲取整個(gè)幀中各像素 的顏色和深度數(shù)據(jù),基于步驟c獲取的投影變換矩陣信息,反算每個(gè)像素在視點(diǎn)坐標(biāo)系下 的三維坐標(biāo),重建出基于像素的柵格化的三維場(chǎng)景;根據(jù)人眼睛的立體視覺(jué)模型,生成可 供立體顯示的立體像對(duì)。
      所述步驟(1)中3D API的監(jiān)控與渲染數(shù)據(jù)攔截進(jìn)一步包括利用API攔截技術(shù),獲
      取三維繪制相關(guān)矩陣和三維渲染數(shù)據(jù)輸出,提取實(shí)現(xiàn)三維透視變換的投影矩陣、視口寬高,
      作為三維場(chǎng)景重構(gòu)的關(guān)鍵參數(shù);利用3D API的特定函數(shù),攔截三維渲染輸出,提取顯卡
      幀緩存中的顏色和深度數(shù)據(jù),作為三維場(chǎng)景重構(gòu)的基礎(chǔ)。
      3D API攔截是指利用計(jì)算機(jī)編程技術(shù),對(duì)Google軟件使用的3D API函數(shù)調(diào)用進(jìn)行監(jiān) 控,并對(duì)3D API產(chǎn)生的渲染數(shù)據(jù)進(jìn)行攔截在其中插入自定義代碼,達(dá)到對(duì)原有API進(jìn)行 監(jiān)控或重新實(shí)現(xiàn)的目的。API攔截技術(shù)成熟且應(yīng)用廣泛,如屏幕取詞軟件、反病毒軟件、 網(wǎng)絡(luò)防火墻等等。本發(fā)明所指的3D API渲染攔截是指攔截特定功能的若干關(guān)鍵3D API函 數(shù)。
      所述步驟(1)中還進(jìn)一步包括針對(duì)其實(shí)現(xiàn)3DAPI函數(shù)的攔截的具體步驟針對(duì)Google 軟件使用的3D API,通過(guò)代碼注入或/和鉤子函數(shù)技術(shù)編寫特定的攔截程序,在三維可視 化程序的數(shù)據(jù)加載階段,將3D API攔截程序加載到三維可視化程序的進(jìn)程中,從而攔截 和監(jiān)控3D API調(diào)用。本發(fā)明所指需要攔截的3D API關(guān)鍵函數(shù)如下
      (21) 3D API創(chuàng)建三維顯示環(huán)境的函數(shù);
      (22) 3D API開(kāi)始一幀場(chǎng)景渲染的函數(shù);
      (23) 3D API改變當(dāng)前渲染矩陣的函數(shù);(24) 3D API結(jié)束一幀場(chǎng)景渲染的調(diào)用;
      (25) 3D API將渲染數(shù)據(jù)輸出到當(dāng)前屏幕上的函數(shù)。
      所述步驟(2)進(jìn)一步包括利用3D API輸出到顯卡幀緩存中的顏色和深度數(shù)據(jù),結(jié)合 攔截3D API調(diào)用而獲得的投影參數(shù),來(lái)解析生成顏色圖像和深度數(shù)據(jù)的三維空間信息。 即,通過(guò)生成三維渲染輸出的投影矩陣和視口寬高,解算出三維渲染關(guān)鍵控制參數(shù)(視點(diǎn) 位置、近平面、遠(yuǎn)平面)以及三維渲染輸出的顏色和深度數(shù)據(jù),進(jìn)而解算出每個(gè)像素在視 空間中的三維坐標(biāo)以及對(duì)應(yīng)的顏色特性,重構(gòu)視空間下柵格化的三維場(chǎng)景數(shù)據(jù)。它具體可 以包含以下步驟
      I. 透視投影變換矩陣的識(shí)別。在一幀場(chǎng)景的渲染過(guò)程中,三維應(yīng)用軟件可能會(huì)多次更 改投影變換矩陣,只有透視變換矩陣才可以產(chǎn)生透視三維效果。不失一般性,假設(shè)Google 軟件在一幀的渲染過(guò)程中保持一致,將透視投影矩陣攔截下來(lái),將矩陣中的特征值作為判 據(jù),判斷當(dāng)前攔截的矩陣是否為透視投影矩陣。
      II. 建立視點(diǎn)為坐標(biāo)原點(diǎn)的三維空間坐標(biāo)系(簡(jiǎn)稱視點(diǎn)坐標(biāo)系)。以步驟I截獲的透視 投影變換矩陣為參數(shù),建立以透視點(diǎn)為坐標(biāo)原點(diǎn)的視圖坐標(biāo)系Z軸穿過(guò)近平面的中心, 近平面的Y軸和X軸方向和該坐標(biāo)系的X軸,Y軸方向一致,近平面位于近平面值對(duì)應(yīng)的 Z軸的刻度上。近平面上X的值域是[iidth/2, width/2], Y的值域是 [-height/2, height/2]。在該坐標(biāo)系中,任意坐標(biāo)點(diǎn)P(X,Y,Z)與近平面的交點(diǎn)的坐標(biāo)值 P' (X', Y', Z')可以由透視投影矩陣變換求得,其中Z'對(duì)應(yīng)于幀深度緩存中的深度值。 可得X'等于width/2*X/Z ; Y,等于height/2*Y/Z ; Z,等于(z-zNear)/z * zFar/(zFar-zNear),其中Z'對(duì)應(yīng)于深度緩存中的值。
      in.柵格化三維場(chǎng)景數(shù)據(jù)的重構(gòu)。設(shè)視口的寬度為width'、高度為height',可由3D API相關(guān)函數(shù)獲得。由視口和近平面的比例關(guān)系可知任意三維渲染幀圖像像素點(diǎn)的坐標(biāo) P''' (X' , , , Y''')對(duì)應(yīng)于近平面上的三維坐標(biāo)Pn(xn , yn , zn), 其中 xn=(X,' , -width' /2)*width/2, yn=(Y, ,' -height' /2)*height/2。對(duì)應(yīng)的深度緩存中的值 Z,,由步驟II可知,對(duì)應(yīng)的視點(diǎn)坐標(biāo)系下Z值為Z' *(zFar-zNear)/zFar+zNear,可得像素 點(diǎn)在視點(diǎn)坐標(biāo)系下的坐標(biāo)P(X, Y, Z),其中X等于xNear/zNear*Z, Y等于yNear/zNear*Z。
      通過(guò)調(diào)用3D API的讀取顯卡中顏色緩沖區(qū)函數(shù)和深度緩沖區(qū)函數(shù),利用步驟II中建 立的坐標(biāo)系以及上述關(guān)系,可以獲得視點(diǎn)坐標(biāo)系下所有像素點(diǎn)的三維坐標(biāo)。將所有的三維 坐標(biāo)用三角形面片連接起來(lái),就構(gòu)成了一個(gè)可進(jìn)行三維渲染的立體表面,該表面通過(guò)三維
      8流水線,在任意視角下進(jìn)行渲染。
      所述步驟(3)中"設(shè)定兩個(gè)不同的視點(diǎn)位置并生成立體像對(duì)"是利用步驟(2)重構(gòu)的三 維場(chǎng)景,生成兩幅影像,形成立體像對(duì)。本發(fā)明提出基于"立體像素"的三維場(chǎng)景的立體 顯示模型,所謂立體像素是指將步驟(2)重構(gòu)的三維場(chǎng)景的每個(gè)像素與其對(duì)應(yīng)視點(diǎn)空間的 三維坐標(biāo)一起組成序列[(X,Y,Z), (R,G,B)],構(gòu)成的一個(gè)三維像素空間。針對(duì)該空間中的 每個(gè)像素,按照透視變換原理,計(jì)算出其在新視點(diǎn)的像素位置點(diǎn)。
      生成立體像對(duì)可采用下列兩種方法
      方法一.調(diào)用3D API,渲染步驟(2)中獲得的場(chǎng)景數(shù)據(jù),在原始圖像作為左視點(diǎn)圖 像情況下,生成右視點(diǎn)圖像;在原始圖像作為右視點(diǎn)圖像情況下,生成左視點(diǎn)圖像;在不 保存原始圖像情況下,生成左右視點(diǎn)圖像,從而實(shí)現(xiàn)立體像對(duì)生成。
      方法二.采用柵格化三維場(chǎng)景數(shù)據(jù),構(gòu)建原始視空間與目標(biāo)視空間下像素的映射關(guān)系, 將原始視空間下的像素直接變換到目標(biāo)視空間下。在原始圖像作為左視點(diǎn)圖像情況下,生 成右視點(diǎn)圖像;在原始圖像作為右視點(diǎn)圖像情況下,生成左視點(diǎn)圖像;在不保存原始圖像 情況下,生成左右視點(diǎn)圖像,從而實(shí)現(xiàn)立體像對(duì)快速生成。其中-
      視點(diǎn)水平偏移,是指新視點(diǎn)距離原始視點(diǎn)在X軸方向上的改變量A 。
      視點(diǎn)垂直偏移,是指新視點(diǎn)距離原始視點(diǎn)在Z軸方向上的改變量A。
      圖像像素偏移,是指生成的圖像像素水平方向的附加偏移4 w。
      則在另一的視點(diǎn)坐標(biāo)系下,對(duì)原始幀圖像中點(diǎn)P(X,Y,Z)的像素標(biāo)在左視點(diǎn)下的坐標(biāo)X 是Width' * (X-Dx) / (Z-Dz) +Dpixel, Y是Height' *Y/ (Z-Dz)。該像素在對(duì)于右視點(diǎn)坐標(biāo)系下, 坐標(biāo)按照上述方法計(jì)算,但Dx,Dz取負(fù)號(hào)。
      將每個(gè)像素的顏色復(fù)制到目標(biāo)位置。對(duì)兩個(gè)視點(diǎn)都應(yīng)用該方法從而獲得立體像對(duì)。該 方法具有不經(jīng)過(guò)圖形流水線,程序編制簡(jiǎn)單,優(yōu)化容易等優(yōu)點(diǎn)。
      所述步驟(4)中"針對(duì)不同的立體觀察設(shè)備進(jìn)行真三維觀測(cè)"是指將步驟(3)生成的 立體像對(duì),通過(guò)顯示設(shè)備輸出并進(jìn)行立體觀察。本發(fā)明生成的立體像對(duì)通過(guò)如下方式進(jìn)行 真三維顯示
      x.顯卡支持的雙目立體顯示。如在支持立體顯示的OpenGL API環(huán)境下,在創(chuàng)建設(shè)備句 柄階段啟動(dòng)OpenGL API的立體顯示模式,將生成的立體像對(duì)分別輸送到左右兩個(gè)緩沖區(qū) 中,實(shí)現(xiàn)立體顯示。y.在不支持立體顯示的顯卡上,將立體像對(duì)合成為一幅紅綠互補(bǔ)色立體圖像,從左右 立體像對(duì)中的一個(gè)圖像提取紅色通道,另一個(gè)圖像中提取綠色和藍(lán)色通道,將提取的通道
      融合,形成一個(gè)互補(bǔ)色的立體圖像。并送回原始的圖像緩沖區(qū)進(jìn)行立體顯示與觀測(cè)。 z.將立體圖像或像對(duì)輸送到其他支持立體顯示設(shè)備上。 本發(fā)明旨在解決Google軟件不能支持立體顯示的問(wèn)題,依靠成熟的代碼攔截技術(shù)攔截 在Google軟件對(duì)于的3DAPI調(diào)用進(jìn)行重新編排。通過(guò)監(jiān)控投影矩陣,獲取反算三維場(chǎng)景 的關(guān)鍵參數(shù),通過(guò)繪制的顏色圖像和深度圖像,逐象素的反求其三維坐標(biāo),并將像素值映 射到對(duì)應(yīng)的位置上,形成立體像對(duì)。通過(guò)各種顯示模式進(jìn)行立體顯示,本發(fā)明也為現(xiàn)有的 大量三維程序的直接立體化提供了一條可行的途徑。本發(fā)明具有如下特色
      (1) 解決了在Google軟件不能進(jìn)行立體顯示的問(wèn)題,提升了在Google軟件的交互 和用戶體驗(yàn)。
      (2) 實(shí)現(xiàn)的算法新穎,通過(guò)幀緩沖區(qū)中的顏色圖像數(shù)據(jù)和深度數(shù)據(jù)經(jīng)過(guò)重新分配形成 立體像對(duì),算法原理簡(jiǎn)單,編程實(shí)現(xiàn)方便。
      (3) 充分利用了現(xiàn)有的技術(shù)資源,由于基于工業(yè)標(biāo)準(zhǔn)的3D API開(kāi)發(fā),具有良好的適 應(yīng)性,對(duì)于顯卡沒(méi)有特殊要求。支持多種顯示模式,可以在任意顯示環(huán)境下實(shí)現(xiàn)立體顯示。


      圖1本發(fā)明實(shí)施例1的方法流程圖
      圖2本發(fā)明采用的三維渲染的基本模式
      圖3本發(fā)明采用的三維圖形的坐標(biāo)變換流水線
      圖4本發(fā)明實(shí)施例1的透視投影與透視變換矩陣
      圖5本發(fā)明實(shí)施例1的以視點(diǎn)為中心的坐標(biāo)系
      圖6本發(fā)明實(shí)施例1的立體像對(duì)的快速生成方法圖
      具體實(shí)施例方式
      下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明做進(jìn)一步詳細(xì)說(shuō)明。 實(shí)施例l
      如圖2和圖3所示,Google Earth使用兩種3D API, —種是0penGL, 一種是Direct3D, 在建模階段Google SketchUp支持0penGL API,操作系統(tǒng)平臺(tái)為Windows XP進(jìn)行實(shí) 施。
      10本實(shí)施例采用0penGL API做為實(shí)施對(duì)象。
      如圖1所示,面向Google Earth與Sketch Up軟件的植入式真三維立體渲染方法,該 方法包括以下步驟
      步驟(1)針對(duì)Google Earth與Sketch Up使用的OpenGL API進(jìn)行監(jiān)控與渲染數(shù)據(jù)攔
      截;
      步驟(2)利用場(chǎng)景變換矩陣和投影變換矩陣重構(gòu)柵格化的三維數(shù)據(jù);
      步驟(3)自適應(yīng)屏幕分辨率和人的眼基距設(shè)定兩個(gè)不同的視點(diǎn)位置并生成立體像對(duì);
      步驟(4)針對(duì)不同的立體觀察設(shè)備進(jìn)行真三維觀測(cè)。
      步驟(1)中OpenGL API的攔截與獲取場(chǎng)景渲染數(shù)據(jù)進(jìn)一步包括利用OpenGL API攔 截技術(shù),獲取三維繪制相關(guān)矩陣和三維渲染數(shù)據(jù),提取實(shí)現(xiàn)三維透視變換的投影矩陣、視 口寬高,作為三維場(chǎng)景重構(gòu)的關(guān)鍵參數(shù);利用Open GLAPI的特定函數(shù),攔截三維渲染輸 出,提取顯卡幀緩存中的顏色和深度數(shù)據(jù),作為三維場(chǎng)景重構(gòu)的基礎(chǔ)。
      步驟(2)進(jìn)一步包括利用OpenGL API輸出到顯卡幀緩存中的顏色和深度數(shù)據(jù),結(jié)合攔 截OpenGL API調(diào)用而獲得的投影參數(shù),來(lái)解析生成顏色圖像和深度數(shù)據(jù)的三維空間信息。 它進(jìn)一步包含以下步驟
      I.透視投影變換矩陣的識(shí)別。在一幀場(chǎng)景的渲染過(guò)程中,三維應(yīng)用軟件可能會(huì)多次更 改投影變換矩陣,只有透視變換矩陣才可以產(chǎn)生透視三維效果。不失一般性,假設(shè)透視投 影變換矩陣在一幀的渲染過(guò)程中保持一致。透視投影的各項(xiàng)控制參數(shù)與對(duì)應(yīng)的矩陣關(guān)系見(jiàn) 附圖4所示。將透視投影矩陣攔截下來(lái),將矩陣中的特征值作為判據(jù),判斷當(dāng)前攔截的矩 陣是否為透視投影矩陣。
      II. 建立視點(diǎn)為坐標(biāo)原點(diǎn)的三維空間坐標(biāo)系(簡(jiǎn)稱視點(diǎn)坐標(biāo)系)。以步驟I截獲的透視投 影變換矩陣為參數(shù),建立以透視點(diǎn)為坐標(biāo)原點(diǎn)的視圖坐標(biāo)系Z軸穿過(guò)近平面的中心,近 平面的Y軸和X軸方向和該坐標(biāo)系的X軸,Y軸方向一致,近平面位于近平面值對(duì)應(yīng)的Z 軸的刻度上。近平面上X的值域是[-width/2, width/2] , Y的值域是[-height/2, height/2]。 在該坐標(biāo)系中,任意坐標(biāo)點(diǎn)P(X,Y,Z)與近平面的交點(diǎn)的坐標(biāo)值P' (X', Y', Z')可以由 透視投影矩陣變換求得,其中Z'對(duì)應(yīng)于幀深度緩存中的深度值,如附圖5所示??傻肵' 等于width/2承X/Z ; Y'等于height/2*Y/Z; Z'等于(z-zNear)/z * zFar/(zFar-zNear), 其中Z'對(duì)應(yīng)于深度緩存中的值。
      III. 柵格化三維場(chǎng)景數(shù)據(jù)的重構(gòu)。設(shè)視口的寬度為width'、高度為height',可由 OpenGL API相關(guān)函數(shù)獲得。由視口和近平面的比例關(guān)系可知任意三維渲染幀圖像像素點(diǎn)的坐標(biāo)P',' (X",,Y',,)對(duì)應(yīng)于近平面上的三維坐標(biāo)Pn(xn, yn , zn),其中 xn=(X''' iidth' /2)*width/2, yn=(Y''' -height' /2) *height/2。對(duì)應(yīng)的深度緩存中的值 Z',由b可知,對(duì)應(yīng)的視點(diǎn)坐標(biāo)系下Z值為Z' *(zFar-zNear)/zFar+zNear,可得像素點(diǎn)在 視點(diǎn)坐標(biāo)系下的坐標(biāo)P(X, Y, Z),其中X等于xNear/zNear*Z, Y等于yNear/zNear*Z。
      通過(guò)調(diào)用0penGL API的讀取顯卡中顏色緩沖區(qū)函數(shù)和深度緩沖區(qū)函數(shù),利用步驟II 中建立的坐標(biāo)系以及上述關(guān)系,可以獲得視點(diǎn)坐標(biāo)系下所有像素點(diǎn)的三維坐標(biāo)。將所有的 三維坐標(biāo)用三角形面片連接起來(lái),就構(gòu)成了一個(gè)可進(jìn)行三維渲染的立體表面,該表面通過(guò) 三維流水線,在任意視角下進(jìn)行渲染。
      步驟(3)利用步驟(2)重構(gòu)的三維場(chǎng)景,生成兩幅影像,形成立體像對(duì)。 生成立體像對(duì)可采用下列兩種方法
      方法一.調(diào)用OpenGL,渲染步驟(2)中獲得的場(chǎng)景數(shù)據(jù),在原始圖像作為左視點(diǎn)圖 像情況下,生成右視點(diǎn)圖像;在原始圖像作為右視點(diǎn)圖像情況下,生成左視點(diǎn)圖像;在不 保存原始圖像情況下,生成左右視點(diǎn)圖像,從而實(shí)現(xiàn)立體像對(duì)生成。
      方法二.采用柵格化三維場(chǎng)景數(shù)據(jù),構(gòu)建原始視空間與目標(biāo)視空間下像素的映射關(guān)系, 將原始視空間下的像素直接變換到目標(biāo)視空間下。在原始圖像作為左視點(diǎn)圖像情況下,生 成右視點(diǎn)圖像;在原始圖像作為右視點(diǎn)圖像情況下,生成左視點(diǎn)圖像;在不保存原始圖像 情況下,生成左右視點(diǎn)圖像,從而實(shí)現(xiàn)立體像對(duì)快速生成。其中
      視點(diǎn)水平偏移,是指新視點(diǎn)距離原始視點(diǎn)在X軸方向上的改變量A 。
      視點(diǎn)垂直偏移,是指新視點(diǎn)距離原始視點(diǎn)在Z軸方向上的改變量Z z。
      圖像像素偏移,是指生成的圖像像素水平方向的附加偏移4^7。
      則在另一的視點(diǎn)坐標(biāo)系下,對(duì)原始幀圖像中點(diǎn)P(X, Y, Z)的像素標(biāo)在左視點(diǎn)下的坐標(biāo)X 是Width' *(X-Dx)/(Z-Dz)+Dpixel, Y是Height' *Y/(Z-Dz)。該像素在對(duì)于右視點(diǎn)坐標(biāo)系下, 坐標(biāo)按照上述方法計(jì)算,但Dx, Dz取負(fù)號(hào)。
      將每個(gè)像素的顏色復(fù)制到目標(biāo)位置。對(duì)兩個(gè)視點(diǎn)都應(yīng)用該方法從而獲得立體像對(duì)。該 方法具有不經(jīng)過(guò)圖形流水線,程序編制簡(jiǎn)單,優(yōu)化容易等優(yōu)點(diǎn)。
      步驟(4)將步驟(3)生成的立體像對(duì),通過(guò)顯示設(shè)備輸出并進(jìn)行立體觀察。本發(fā)明生 成的立體像對(duì)通過(guò)如下方式進(jìn)行真三維顯示-
      x.顯卡支持的雙目立體顯示。如在支持立體顯示的OpenGL環(huán)境下,在創(chuàng)建設(shè)備句柄階 段啟動(dòng)0penGL的立體顯示模式,將生成的立體像對(duì)分別輸送到左右兩個(gè)緩沖區(qū)中,實(shí)現(xiàn)
      12立體顯示?;?br> y.在不支持立體顯示的顯卡上,將立體像對(duì)合成為一幅紅綠互補(bǔ)色立體圖像,從左右 立體像對(duì)中的一個(gè)圖像提取紅色通道,另一個(gè)圖像中提取綠色和藍(lán)色通道,將提取的通道 融合,形成一個(gè)互補(bǔ)色的立體圖像。并送回原始的圖像緩沖區(qū)進(jìn)行立體顯示與觀測(cè)。或 z.將立體圖像或像對(duì)輸送到其他支持立體顯示設(shè)備上。
      下面的實(shí)施過(guò)程是上述方法的具體軟件編碼過(guò)程。
      本實(shí)施例采用基于0penGL 3D API做為實(shí)施對(duì)象,操作系統(tǒng)平臺(tái)為Windows XP進(jìn)行實(shí)施。
      Open API的攔截與監(jiān)控基于Micorsoft Detours SDK開(kāi)發(fā)。 Detours是Microsoft提供的一套Windows平臺(tái)下進(jìn)行API調(diào)用攔截的開(kāi)發(fā)包,支持Win32 所有平臺(tái)。
      1. 基于Detours API,在Windows XP平臺(tái)下基于Visual Studio 2005建立基于基于 C十+語(yǔ)言的Win32 DLL工程StereoDriver—Goolge_0penGL作為攔截代碼框架。
      2. 在StereoDriver—Goolge—0penGL中定義一個(gè)數(shù)據(jù)結(jié)構(gòu)OpenGL—Stereo,該數(shù)據(jù)結(jié) 構(gòu)包含如下內(nèi)容
      a. Windows繪圖上下文變量hDC,類型HDC;
      b. OpenGL渲染上下文變量hGLRC,類型HGLRC;
      c. 記錄當(dāng)前硬件是否支持立體顯示的變量IsStereoS叩port,類型bool;
      d. 記錄視口寬高的變量width, height,類型int;
      e. 緩存顏色數(shù)據(jù)的變量ColorBuffer,類型GLbyte*;
      f. 緩存深度數(shù)據(jù)的變量D印thBuffer,類型GLfloat;
      g. 記錄當(dāng)前變換矩陣模式的變量MatrixMode,類型GLMatrixMode
      h. 記錄當(dāng)前透視投影矩陣的變量Matrix,類型GLfloat [4] [4]
      i. 創(chuàng)建一個(gè)全局的鏈表gOpenGL—Stereos保存OpenGL_Stereo結(jié)構(gòu)的指針。
      j.創(chuàng)建一個(gè)全局的0penGL_Stereo指針ActiveOpenGL—Stereo,初始化為NULL。 3.基于Detours API實(shí)現(xiàn)對(duì)如下函數(shù)的監(jiān)控 1)wglCreateContext
      wglCreateContext根據(jù)應(yīng)用程序的設(shè)置,創(chuàng)建一個(gè)相應(yīng)的OpenGL的渲染上下文。創(chuàng) 建監(jiān)控函數(shù)My—wglCreateContext,在wglCreateContext中實(shí)現(xiàn)如下功能
      13解析wglCreateContext的參數(shù),判斷用戶程序是否使用PFD—STEREO標(biāo)記啟動(dòng)雙通道 立體渲染支持,如果用戶程序啟動(dòng)立體渲染支持,則說(shuō)明用戶程序本身支持立體渲染。
      如果用戶程序沒(méi)有啟動(dòng)立體渲染支持,則表明用戶程序不支持立體渲染,詢問(wèn)用戶是 否啟動(dòng)植入式立體支持。
      如果用戶選擇啟用植入是立體支持,創(chuàng)建OpenGL_Stere0結(jié)構(gòu),并保存在一個(gè)包含 OpenGLStereo結(jié)構(gòu)指針的全局列表中,并初始化。使用wglChoosePixelFormat函數(shù)和 P^STEREO標(biāo)記査詢當(dāng)前顯卡是否支持立體顯示。如果支持立體顯示則將OpenGLStereo的 IsStereoS卿ort設(shè)置為true,否則設(shè)置為false。
      使用原始的wglCreateContext創(chuàng)建HGLRC,并在OpenGLStereo中記錄對(duì)應(yīng)的HDC和 HGLRC,將OpenGLStereo結(jié)構(gòu)加入到gOpenGL—Stereos中。
      2) wglMakeCurrent
      wglMakeCurrent在若干0penGL渲染上下文中選擇一個(gè)做為當(dāng)前活動(dòng)的, 一般在 wglMakeCurrent之后開(kāi)始和結(jié)束一幀的繪制。創(chuàng)建監(jiān)控函數(shù)My—wglMakeCurrent,在 My_wglMakeCurrent中實(shí)現(xiàn)如下功能當(dāng)HDC參數(shù)和HGLRC參數(shù)不為NULL時(shí),從 gOpenGL—Stereos中用這兩個(gè)參數(shù)査找對(duì)應(yīng)hDC和hGLRC的OpenGL—Stereo結(jié)構(gòu),并賦值給 ActiveOpenGL—Stereo變量。如果兩個(gè)參數(shù)均為NULL,則將ActiveOpenGL—Stereo賦值為 NULL。
      調(diào)用原始的wglMakeCurrent。
      3) glViewport
      glViewport將當(dāng)前活動(dòng)的OpenGL渲染上下文的視口設(shè)置到指定位置和尺寸。創(chuàng)建監(jiān) 控函數(shù)My_glViewport,在My一glViewport中實(shí)現(xiàn)如下功會(huì)旨
      如果ActiveOpenGL—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)前活動(dòng)OpenGL渲染上下文的活動(dòng)矩陣模型。創(chuàng)建監(jiān)控函數(shù) My—glMatrixMode,在My—glMatrixMode中實(shí)現(xiàn)如下功能
      如果ActiveOpenGL—Stereo不為空,則將ActiveOpenGL_Stere的MatrixMode設(shè)置為glMatrixMode的參數(shù)。 調(diào)用原始的glMatrixMode。
      5) glLoadMatrixd, g比oadMatrixf
      glLoadMatrix為活動(dòng)的0penGL渲染上下的當(dāng)前矩陣模式設(shè)置矩陣。創(chuàng)建監(jiān)控函數(shù) My_glMLoadMatrix,在My—glLoadMatrix中實(shí)現(xiàn)如下功能
      如果ActiveOpenGL_Stereo不為空,且其變量MatrixMode等于GL_PR0JECTI0N,則記錄 該函數(shù)的m變量到ActiveOpenGL—Stere的Matrix中。
      調(diào)用原始的glLoadMatrix函數(shù)。
      6) Sw即Buffers
      該函數(shù)將OpenGL渲染的一幀從顯存輸出到顯示設(shè)備上。創(chuàng)建監(jiān)控函數(shù)My—SwapBuffers, 在該函數(shù)中實(shí)現(xiàn)如下功能
      如果ActiveOpenGL_Stereo不為空,調(diào)用glReadPixels函數(shù),以GL_RGB從顏色緩沖 區(qū)中讀取顏色到ActiveOpenGL—Stereo的ColorBuffer變量;調(diào)用glReadPixels函數(shù)以 GL_DEPTH_C0MP0NENT參數(shù),讀取深度值到ActiveOpenGL_Stereo的D印thBuffer中。
      從ActiveOpenGL—Stereo的Matrix變量中獲得透視投影的近平面的寬度width,高度 height,以及近平面的zNear和遠(yuǎn)平面zFar。
      根據(jù)ActiveOpenGL_Stereo中記錄的視口的寬度ViewPortWidth和ViewPortHeight, 創(chuàng)建臨時(shí)的顏色緩沖區(qū),ColorBufferLeft和ColorBufferRight。
      從用戶設(shè)置中獲得視點(diǎn)偏移Dx,深度偏移Dz和像素偏移DpM。建立一個(gè)循環(huán),對(duì)每 個(gè)ColorBuffer像素,取出對(duì)應(yīng)的像素坐標(biāo)iX, iY以及顏色RGB以及對(duì)應(yīng)的D印thBuffer 中的深度值。利用本發(fā)明設(shè)計(jì)的方法,像素對(duì)應(yīng)的視點(diǎn)坐標(biāo)系中的坐標(biāo)P (X,Y,Z)。對(duì)左 眼以Dx. Dz, DpM為參數(shù)。使用本發(fā)明設(shè)計(jì)的快速立體像對(duì)生成算法,計(jì)算P對(duì)應(yīng)的像素坐 標(biāo)Pwt。對(duì)右眼以-D,.—a.-DpM為參數(shù),使用本發(fā)明設(shè)計(jì)的快速立體像對(duì)生成算法,計(jì)算P 對(duì)應(yīng)的右像素坐標(biāo)Pright。將當(dāng)前像素的顏色分別賦值給ColorBufferLeft的P^位置,和 ColorBufferRight的Pr她位置。
      判斷ActiveOpenGL—Stere的IsStereoSupport是否為真。如果為真,調(diào)用 glDrawPixels分別將ColorBufferLeft和ColorBufferRight 中的內(nèi)容拷貝到 GL—BACK—LEFT和GL—BACK—RIGT中。否則,將ColorBufferRight中的G, B通道賦值到 ColorBufferLeft對(duì)應(yīng)像素的G, B通道上去,形成一幅紅綠立體,將ColorBufferLeft的內(nèi) 容拷貝到GL—BACK中。調(diào)用原始的Sw即Buffer。
      4. 編譯StereoDriver—Goolge—OpenGL工禾呈,生成StereoDriver—Goolge_0penGL DLL 文件。
      5. 將StereoDriver_Goolge—OpenGL. DLL文件通過(guò)detours SDK的withdll. Exe命令行 啟動(dòng)所需程序。
      實(shí)施例2
      本實(shí)施例采用基于Direct3D 9做為實(shí)施對(duì)象,操作系統(tǒng)平臺(tái)為Windows XP進(jìn)行實(shí)施。 如圖1所示,面向Google Earth的植入式真三維立體渲染方法,該方法包括以下步驟 步驟(1)針對(duì)Google Earth使用的Direct3D API進(jìn)行監(jiān)控與渲染數(shù)據(jù)攔截; 步驟(2)利用場(chǎng)景變換矩陣和投影變換矩陣重構(gòu)柵格化的三維數(shù)據(jù); 步驟(3)自適應(yīng)屏幕分辨率和人的眼基距設(shè)定兩個(gè)不同的視點(diǎn)位置并生成立體像對(duì);
      步驟(4)針對(duì)不同的立體觀察設(shè)備進(jìn)行真三維觀測(cè)。
      下面的實(shí)施過(guò)程是上述方法的具體軟件編碼過(guò)程。
      Direct3D 9的攔截與監(jiān)控基于Micorsoft Detours SDK開(kāi)發(fā)。Detours是Microsoft 提供的一套Windows平臺(tái)下進(jìn)行API調(diào)用攔截的開(kāi)發(fā)包,支持Win32所有平臺(tái)。
      l.基于Detours API,在Windows XP平臺(tái)下基于Visual Studio 2005建立基于基于 C十+語(yǔ)言的Win32 DLL工程StereoDriver—Goolge—D3D作為攔截代碼框架。
      2.在StereoDriver_Goolge_D3D中定義一個(gè)數(shù)據(jù)結(jié)構(gòu)D3D_Stereo,該數(shù)據(jù)結(jié)構(gòu)包含如 下內(nèi)容
      1) Windows的窗口變量hWnd,類型HWND;
      2) Direct3D的設(shè)備接口指針,pDevice,類型IDirect3DDevice9;
      3) 記錄視口寬高的變量width, height,類型int;
      4) 緩存顏色數(shù)據(jù)的變量ColorBuf f er,類型BYTE*;
      5) 緩存深度數(shù)據(jù)的變量D印thBuffer,類型float;
      6) 記錄當(dāng)前矩陣模式的變量MatrixMode,類型D3DTRANSF0RMSTATETYPE;
      7) 記錄當(dāng)前透視投影矩陣的變量Matrix,類型D3DMATRIX;
      8) 創(chuàng)建一個(gè)全局的鏈表gD3D_Stereos保存D3D—Stereo結(jié)構(gòu)的指針。
      9) 創(chuàng)建一個(gè)全局的D3D—Stereo指針,ActiveD3D—Stereo,初始化為NULL。 3.基于Detours API實(shí)現(xiàn)對(duì)如下函數(shù)的監(jiān)控
      161)Direct3DCreate9
      Direct3DCreate9是Direct3D9的主入口,創(chuàng)建一個(gè)IDirect3D9的指針。創(chuàng)建監(jiān)控函 數(shù)My—Direct3DCreate9,實(shí)現(xiàn)如下功能
      當(dāng)用戶第一次調(diào)用該函數(shù)時(shí),利用Detours監(jiān)控IDirect3D9的CreateDevice函數(shù)。 調(diào)用原始的Direct3DCreate9函數(shù)。 2)Direct3DDevice9的CreateDevice函數(shù)
      CreateDevice 用以創(chuàng)建 一 個(gè) Direct3D 設(shè)備。創(chuàng)建監(jiān)控函數(shù) My—IDirect3DDevice9—CreateDevice,實(shí)現(xiàn)如下功能
      詢問(wèn)用戶是否啟用立體支持,如果選擇是,判斷用戶使用的深度格式,確保其為可鎖 定讀取的模式;
      執(zhí)行原始的CreateDevice,得到一個(gè)IDirect3DDevice9指針。
      如果用戶選擇啟動(dòng)立體,創(chuàng)建一個(gè)D3D—Stereo ,將參數(shù)中的pDevice用 IDirect3DDevice9指針賦值,將D3D—Stereo加入gD3D—Stereos。 監(jiān)控IDirect3DDevice9如下函數(shù)。
      3) IDirect3DDevice9的BeginScene函數(shù)
      BeginScene開(kāi)始一幀的繪制。創(chuàng)建監(jiān)控函數(shù)My—IDirect3DDevice9—BeginScene在其 中實(shí)現(xiàn)如下功能
      根據(jù)傳入的IDirect3DDevice9指針,在gD3D—Stereos中找到與當(dāng)前設(shè)備相同的,將 其賦值給ActiveD3D—Stereo。如果沒(méi)有相同的則設(shè)置為NULL。 調(diào)用原始的BeginScene。
      4) IDirect3DDevice9的SetViewport
      SetViewport將當(dāng)前活動(dòng)的IDirect3DDevice9渲染上下文的視口設(shè)置到指定位置和尺 寸。創(chuàng)建監(jiān)控函數(shù)MyJDirect3DDevice9—SetViewport,在My_glViewport中實(shí)現(xiàn)如下功倉(cāng)巨 如果 ActiveD3DL_Stereo不為空,則判斷新的視口寬高是否和ActiveD3D_Stereo中的 width, height相等。如果不相等釋放ActiveD3D_Stereo中原有的ColorBuffer和 D印thBuffer內(nèi)存。根據(jù)視口的寬高創(chuàng)建顏色緩沖區(qū)ColorBuffer和深度緩存數(shù)據(jù) D印thBuffer。
      調(diào)用原始的SetViewport。
      5) IDirect3DDevice9的SetTransform
      SetTransform設(shè)置指定的矩陣。創(chuàng)建監(jiān)控函數(shù)My—IDirect3DDevice9_SetTransform,實(shí)現(xiàn)如下功能
      如果ActiveD3D_Stereo不為空,判斷矩陣類型參數(shù)是否是D3DTS—PROJECTION,如果是根據(jù) 本發(fā)明所指判定條件,如果為透視投影矩陣,則記錄到ActiveD3D—Stereo的變量中。 調(diào)用原始的SetTransform。
      6) IDirect3DDevice9的Present函數(shù)
      該函數(shù)將Direct3D渲染的 一 幀圖像輸出到屏幕上。創(chuàng)建監(jiān)控函數(shù) My_IDirect3DDevice9—Present,在該函數(shù)中實(shí)現(xiàn)如下功能
      如果ActiveD3D—Stereo不為空,調(diào)用IDirect3DDevice9的GetBackSurfaceData函數(shù), 從顏色緩沖區(qū)中讀取顏色圖像到ActiveD3D—Stereo的ColorBuffer變量;調(diào)用 GetD印thData函數(shù)以讀取深度值到ActiveD3D—Stereo的D印thBuffer中。
      從ActiveD3D一Stereo的Matrix變量中獲得透視投影的近平面的寬度width,高度 height,以及近平面的zNear和遠(yuǎn)平面zFar。
      根據(jù)ActiveD3D—Stereo視口的寬度ViewPortWidth和ViewPortHeight,創(chuàng)建臨時(shí)的顏 色緩沖區(qū),ColorBufferLeft和ColorBufferRight。
      從用戶設(shè)置中獲得視點(diǎn)偏移Dx,深度偏移Dz和像素偏移DpiX6l.
      建立一個(gè)循環(huán),對(duì)每個(gè)ColorBuffer像素,取出對(duì)應(yīng)的像素坐標(biāo)iX, iY以及顏色RGB 以及對(duì)應(yīng)的D印thBuffer中的深度值。利用本發(fā)明設(shè)計(jì)的方法,像素對(duì)應(yīng)的視點(diǎn)坐標(biāo)系中 的坐標(biāo)P (X, Y, Z)。對(duì)左眼使用Dx, Dz. Dp^為參數(shù)。使用本發(fā)明設(shè)計(jì)的快速立體像對(duì)生成算 法,計(jì)算P對(duì)應(yīng)的像素坐標(biāo)Pun。對(duì)右眼使用-Dx, -Dz, -DpiX6l為參數(shù).使用本發(fā)明設(shè)計(jì)的快速 立體像對(duì)生成算法,計(jì)算P對(duì)應(yīng)的像素坐標(biāo)Pnsht。 將當(dāng)前像素的顏色分別賦值給 ColorBufferLeft的P^位置,和ColorBufferRight的P一t位置。
      由于Direct3D9不支持立體顯示模式,從ColorBufferLeft中抽取紅色通道, ColorBufferRight中抽取藍(lán)色和綠色通道,組成紅綠立體圖片,輸出到屏幕。
      4. 編譯StereoDriver—Goolge—D3D工程,生成StereoDriver—Goolge—D3D. DLL文件
      5. 將StereoDriver—Goolge_D3D. DLL文件通過(guò)detours SDK的withdll. Exe命令4亍啟 動(dòng)Google Earth禾呈序。
      實(shí)施例3
      一種面向Google Earth與Sketch Up軟件的植入式真三維立體渲染方法,包括以下具 體內(nèi)容
      18a. 監(jiān)控創(chuàng)建三維顯示環(huán)境的函數(shù),在該函數(shù)中加入調(diào)用3D API的系統(tǒng)檢測(cè)函數(shù)功能, 獲取系統(tǒng)立體顯示特性,根據(jù)相應(yīng)的立體顯示特性,更改原始設(shè)定的顯示環(huán)境中的立體顯 示模式,在支持立體顯示的硬件上開(kāi)啟真三維立體顯示支持,在不支持立體顯示的硬件上, 設(shè)置標(biāo)志以便進(jìn)行紅綠立體顯示;
      b. 監(jiān)控開(kāi)始一幀繪制的函數(shù),在該函數(shù)中加入代碼獲取當(dāng)前繪圖幀的視口尺寸,根據(jù) 渲染的像素格式為立體像對(duì)創(chuàng)建臨時(shí)的緩沖區(qū);
      c. 監(jiān)控改變當(dāng)前繪制矩陣的函數(shù),在該函數(shù)中加入代碼以獲取三維應(yīng)用軟件對(duì)當(dāng)前 繪制矩陣的更改,通過(guò)矩陣參數(shù)識(shí)別場(chǎng)景渲染的投影類型,當(dāng)是透視投影時(shí),記錄該矩陣, 作為三維場(chǎng)景重構(gòu)的關(guān)鍵參數(shù);
      d. 監(jiān)控將幀緩存輸出到顯示設(shè)備的函數(shù),在監(jiān)控函數(shù)加入代碼以獲取整個(gè)幀中各像 素的顏色和深度數(shù)據(jù),基于步驟c獲取的投影變換矩陣信息,反算每個(gè)像素在視點(diǎn)坐標(biāo)系 下的三維坐標(biāo),重建出基于像素的柵格化的三維場(chǎng)景;根據(jù)人眼睛的立體視覺(jué)模型,生成 可供立體顯示的立體像對(duì)。
      19
      權(quán)利要求
      1、一種面向Google Earth與Sketch Up的真三維立體顯示方法,其特征是,該方法包括以下步驟步驟(1)針對(duì)Google Earth與Sketch Up使用的3D API進(jìn)行監(jiān)控與渲染數(shù)據(jù)攔截;步驟(2)利用場(chǎng)景變換矩陣和投影變換矩陣重構(gòu)柵格化的三維數(shù)據(jù);步驟(3)自適應(yīng)屏幕分辨率和人的眼基距設(shè)定兩個(gè)不同的視點(diǎn)位置并生成立體像對(duì);步驟(4)針對(duì)不同的立體觀察設(shè)備進(jìn)行真三維觀測(cè)。
      2、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述真三維立體渲染方法 進(jìn)一步包括下列步驟下列步驟不分先后a. 監(jiān)控創(chuàng)建三維顯示環(huán)境的函數(shù),在該函數(shù)中加入調(diào)用3D API的系統(tǒng)檢測(cè)函數(shù)功能, 獲取系統(tǒng)立體顯示特性,根據(jù)相應(yīng)的立體顯示特性,更改原始設(shè)定的顯示環(huán)境中的立體顯 示模式,在支持立體顯示的硬件上開(kāi)啟真三維立體顯示支持,在不支持立體顯示的硬件上, 設(shè)置標(biāo)志以便進(jìn)行紅綠立體顯示;b. 監(jiān)控開(kāi)始一幀繪制的函數(shù),在該函數(shù)中加入代碼獲取當(dāng)前繪圖幀的視口尺寸,根據(jù) 渲染的像素格式為立體像對(duì)創(chuàng)建臨時(shí)的緩沖區(qū);c. 監(jiān)控改變當(dāng)前繪制矩陣的函數(shù),在該函數(shù)中加入代碼以獲取三維應(yīng)用軟件對(duì)當(dāng)前繪 制矩陣的更改,通過(guò)矩陣參數(shù)識(shí)別場(chǎng)景渲染的投影類型,當(dāng)是透視投影時(shí),記錄該矩陣, 作為三維場(chǎng)景重構(gòu)的關(guān)鍵參數(shù);d. 監(jiān)控將幀緩存輸出到顯示設(shè)備的函數(shù),在監(jiān)控函數(shù)加入代碼以獲取整個(gè)幀中各像素 的顏色和深度數(shù)據(jù),基于步驟c獲取的投影變換矩陣信息,反算每個(gè)像素在視點(diǎn)坐標(biāo)系下 的三維坐標(biāo),重建出基于像素的柵格化的三維場(chǎng)景;根據(jù)人眼睛的立體視覺(jué)模型,生成可 供立體顯示的立體像對(duì)。
      3、根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(1)中3D API 的監(jiān)控與渲染數(shù)據(jù)攔截進(jìn)一步包括利用API攔截技術(shù),獲取三維繪制相關(guān)矩陣和三維渲 染數(shù)據(jù)輸出,提取實(shí)現(xiàn)三維透視變換的投影矩陣、視口寬高,作為三維場(chǎng)景重構(gòu)的關(guān)鍵參 數(shù);利用3D API的特定函數(shù),攔截三維渲染輸出,提取顯卡幀緩存中的顏色和深度數(shù)據(jù), 作為三維場(chǎng)景重構(gòu)的基礎(chǔ)。
      4、根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(1)中還進(jìn)一 步包括針對(duì)其實(shí)現(xiàn)3D API函數(shù)的攔截的具體步驟通過(guò)代碼注入或/和鉤子函數(shù)技術(shù)編寫特定的攔截程序,在三維可視化程序的數(shù)據(jù)加載階段,將3D API攔截程序加載到三維可 視化程序的進(jìn)程中,從而攔截和監(jiān)控3D API調(diào)用。
      5、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(2)進(jìn)一步包 括下列步驟通過(guò)生成三維渲染輸出的投影矩陣和視口寬高,解算出三維渲染關(guān)鍵控制參 數(shù)以及三維渲染輸出的顏色和深度數(shù)據(jù),進(jìn)而解算出每個(gè)像素在視空間中的三維坐標(biāo)以及 對(duì)應(yīng)的顏色特性,重構(gòu)視空間下柵格化的三維場(chǎng)景數(shù)據(jù)。
      6、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(2)進(jìn)一步包 含以下步驟-I.透視投影變換矩陣的識(shí)別假設(shè)透視投影變換矩陣在一幀的渲染過(guò)程中保持一致,將透視投影矩陣攔截下來(lái),將矩陣中的特征值作為判據(jù),判斷當(dāng)前欄截的矩陣是否為透視投影矩陣;n.建立視點(diǎn)為坐標(biāo)原點(diǎn)的三維空間坐標(biāo)系以步驟I截獲的透視投影變換矩陣為參數(shù),建立以透視點(diǎn)為坐標(biāo)原點(diǎn)的視圖坐標(biāo)系Z軸穿過(guò)近平面的中心,近平面的Y軸和X 軸方向和該坐標(biāo)系的X軸,Y軸方向一致,近平面位于近平面值對(duì)應(yīng)的Z軸的刻度上;近平面上X的值域是[-width/2, width/2], Y的值域是[-height/2, height/2];在該坐標(biāo)系中, 任意坐標(biāo)點(diǎn)P(X,Y,Z)與近平面的交點(diǎn)的坐標(biāo)值P' (X', Y', Z')由透視投影矩陣變換求 得,其中Z,對(duì)應(yīng)于幀深度緩存中的深度值,X'=width/2*X/Z ; Y'=height/2*Y/Z; Z'=(z-zNear)/z * zFar/(zFar-zNear),其中Z,對(duì)應(yīng)于深度緩存中的值;in.柵格化三維場(chǎng)景數(shù)據(jù)的重構(gòu)設(shè)視口的寬度為width'、高度為height',任意三 維渲染幀圖像像素點(diǎn)的坐標(biāo)P'" ",',,丫'',)對(duì)應(yīng)于近平面上的三維坐標(biāo)?110^, yn, zn), 其中xn:(X, ,' -width' /2)*width/2, yn=(Y,'' -height' /2) *height/2;對(duì)應(yīng)的深度緩存中 的值Z',對(duì)應(yīng)的視點(diǎn)坐標(biāo)系下Z=Z, *(zFar-zNear) /zFar+zNear,像素點(diǎn)在視點(diǎn)坐標(biāo)系下的 坐標(biāo)為P(X, Y, Z),其中X=xNear/zNear*Z, Y=yNear/zNear*Z;將所有的三維坐標(biāo)用三角形 面片連接起來(lái),就構(gòu)成了一個(gè)可進(jìn)行三維渲染的立體表面。
      7、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(3)中生成立體 像的方法是調(diào)用3D API,渲染所述步驟(2)中獲得的場(chǎng)景數(shù)據(jù),在原始圖像作為左視 點(diǎn)圖像情況下,生成右視點(diǎn)圖像;在原始圖像作為右視點(diǎn)圖像情況下,生成左視點(diǎn)圖像; 在不保存原始圖像情況下,生成左右視點(diǎn)圖像,從而實(shí)現(xiàn)立體像對(duì)生成。
      8、根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(3)中生成立 體像的方法是采用柵格化三維場(chǎng)景數(shù)據(jù),構(gòu)建原始視空間與目標(biāo)視空間下像素的映射關(guān)系,將原始視空間下的像素直接變換到目標(biāo)視空間下;在原始圖像作為左視點(diǎn)圖像情況下, 生成右視點(diǎn)圖像;在原始圖像作為右視點(diǎn)圖像情況下,生成左視點(diǎn)圖像;在不保存原始圖 像情況下,生成左右視點(diǎn)圖像,從而實(shí)現(xiàn)立體像對(duì)快速生成。
      9、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述步驟(4)中針對(duì)不同 的顯示與觀測(cè)設(shè)備,進(jìn)行立體顯示與觀測(cè),包括x.在支持立體顯示的設(shè)備上,將立體像對(duì)分別輸出到顯卡左右兩個(gè)通道,進(jìn)行立體顯 示;或y.在不支持立體顯示的設(shè)備上,將立體像對(duì)中, 一個(gè)圖像提取紅色通道,另一個(gè)圖像提取綠色和藍(lán)色通道,將提取的通道融合,形成一個(gè)互補(bǔ)色的立體圖像,并支持紅綠眼鏡觀察;或z.將立體圖像或像對(duì)輸送到其他支持立體顯示設(shè)備上。
      10、 根據(jù)權(quán)利要求1所述的真三維立體渲染方法,其特征是,所述3D API函數(shù)的攔 截包括(21) 3D API創(chuàng)建三維顯示環(huán)境的函數(shù);(22) 3D API開(kāi)始一幀場(chǎng)景渲染的函數(shù);(23) 3D API改變當(dāng)前渲染矩陣的函數(shù);(24) 3D API結(jié)束一幀場(chǎng)景渲染的函數(shù);(25) 3D API將渲染數(shù)據(jù)輸出到當(dāng)前屏幕上的函數(shù)。
      全文摘要
      本發(fā)明涉及面向Google Earth與Sketch Up的真三維立體顯示方法,該方法包括在軟件的3D API調(diào)用和顯卡顯示之間采用植入式的渲染數(shù)據(jù)攔截技術(shù),對(duì)原始的單通道顏色信號(hào)和深度信號(hào)、三維場(chǎng)景變換矩陣和投影變換矩陣進(jìn)行捕獲;對(duì)這些信息進(jìn)行解析,重構(gòu)柵格化的三維數(shù)據(jù);基于立體視覺(jué)原理,自適應(yīng)地將該場(chǎng)景重新變換到兩個(gè)不同的視點(diǎn)位置,形成可供立體顯示的雙目視覺(jué)立體像對(duì),驅(qū)動(dòng)顯卡對(duì)雙目立體像對(duì)進(jìn)行立體輸出;利用偏振、紅綠和閃閉式眼鏡等進(jìn)行真三維立體顯示與觀測(cè)。本發(fā)明可以對(duì)現(xiàn)有GoogleEarth與SketchUp軟件在不改變程序和操作模式的情況下實(shí)現(xiàn)真三維立體化的場(chǎng)景展示。
      文檔編號(hào)G06T15/00GK101477700SQ20091002551
      公開(kāi)日2009年7月8日 申請(qǐng)日期2009年2月6日 優(yōu)先權(quán)日2009年2月6日
      發(fā)明者吳明光, 溫永寧, 盛業(yè)華, 閭國(guó)年 申請(qǐng)人:南京師范大學(xué)
      網(wǎng)友詢問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1