楊晨彬 高 瞻
(南通大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 江蘇 南通 226019)
隨著醫(yī)學(xué)圖像三維可視化技術(shù)的發(fā)展,醫(yī)療工作者可以方便地將由計(jì)算機(jī)斷層技術(shù)(CT)、核磁共振(MRI)得到的二維切片數(shù)據(jù)通過(guò)三維重建,達(dá)到重構(gòu)人體的器官組織及病變部位的目的,從而提高醫(yī)療診斷和治療的精確性和科學(xué)性[1]。
傳統(tǒng)的醫(yī)學(xué)體數(shù)據(jù)可視化系統(tǒng)對(duì)于三維醫(yī)學(xué)體數(shù)據(jù)可視化影像的顯示,都是使用二維的計(jì)算機(jī)屏幕來(lái)顯示圖像,并通過(guò)鍵盤鼠標(biāo)在屏幕上完成交互操作。陳文池[2]利用可視化工具包VTK實(shí)現(xiàn)了醫(yī)學(xué)圖像的三維重建系統(tǒng),系統(tǒng)中使用體繪制算法對(duì)體數(shù)據(jù)進(jìn)行了三維可視化,并實(shí)現(xiàn)了平移、旋轉(zhuǎn)和截取等交互操作。但是使用者通過(guò)計(jì)算機(jī)二維屏幕進(jìn)行觀察,無(wú)法感受到三維圖像的深度信息,也無(wú)法清楚地看到三維圖像的內(nèi)部細(xì)節(jié)信息,從而影響使用者進(jìn)一步的觀察和理解,同時(shí)在二維屏幕對(duì)三維數(shù)據(jù)的交互操作也存在著不便。而隨著虛擬現(xiàn)實(shí)技術(shù)的進(jìn)步和虛擬現(xiàn)實(shí)頭戴式顯示設(shè)備(HMD)的商用化[3-4],虛擬現(xiàn)實(shí)技術(shù)在醫(yī)學(xué)教育、輔助診斷、醫(yī)學(xué)可視化等領(lǐng)域的應(yīng)用大大增加[5],通過(guò)虛擬現(xiàn)實(shí)技術(shù)可以彌補(bǔ)傳統(tǒng)屏幕在顯示及交互上的不足。Laha等[6]從理論上分析了VR技術(shù)所帶來(lái)的沉浸式體驗(yàn)在醫(yī)學(xué)體數(shù)據(jù)可視化的重要作用,VR平臺(tái)與傳統(tǒng)平臺(tái)相比具有明顯優(yōu)勢(shì),但是并沒(méi)有給出實(shí)現(xiàn)方案。而He等[7]使用可分離式的腦部網(wǎng)格模型,結(jié)合HTC Vive,在虛擬現(xiàn)實(shí)中通過(guò)交互完成對(duì)腦部結(jié)構(gòu)的觀察操作,實(shí)現(xiàn)可視化,具有良好的沉浸式顯示效果。但該方案需要預(yù)先制作腦部各組織的網(wǎng)格模型,同時(shí)無(wú)法觀察組織內(nèi)部信息,使用不便。
當(dāng)前主要有兩類醫(yī)學(xué)影像可視化系統(tǒng)實(shí)現(xiàn)方案。一類是客戶端形式的,這類系統(tǒng)需要在計(jì)算機(jī)端安裝特定的軟件,不利于后期系統(tǒng)更新及維護(hù)[8]。另外一類就是基于瀏覽器形式的[9],本文使用基于瀏覽器的體繪制實(shí)現(xiàn)方案,使用WebGL作為體繪制實(shí)現(xiàn)工具,使用光線投射法作為體繪制的實(shí)現(xiàn)算法。對(duì)于光線投射算法,Congote等[10]提出了使用多通道渲染管線來(lái)實(shí)現(xiàn)體繪制的方法。這種方法需要使用一個(gè)單位立方體作為體數(shù)據(jù)的載體。在第一道渲染管線中根據(jù)單位立方體的頂點(diǎn)坐標(biāo)生成坐標(biāo)紋理,用來(lái)在第二道管線中計(jì)算光線投射方向,然后根據(jù)光線的方向和起止坐標(biāo)進(jìn)行顏色合成,得到渲染圖像。其中因?yàn)樾枰褂妙~外的紋理和渲染管線,對(duì)性能會(huì)有一定的影響。對(duì)此,Mobeen等[11]提出了使用單通道的體繪制方法,在片元著色器中只需根據(jù)場(chǎng)景中相機(jī)的坐標(biāo)以及片元坐標(biāo)即可計(jì)算出光線投射方向,而該片元坐標(biāo)就是光線的起始點(diǎn)。對(duì)光線的終止條件的判斷則需要在片元著色器中判斷光線上各采樣點(diǎn)與單位立方體的位置關(guān)系,當(dāng)采樣點(diǎn)坐標(biāo)在單位立方體之外時(shí)立即終止循環(huán),得到結(jié)果。
以上方法在傳統(tǒng)屏幕上具有良好的顯示效果,但是結(jié)合虛擬現(xiàn)實(shí)后,在實(shí)際使用中有兩點(diǎn)不足:(1) 當(dāng)需要交互時(shí),在傳統(tǒng)屏幕中,可以通過(guò)改變場(chǎng)景中相機(jī)的位置間接實(shí)現(xiàn)場(chǎng)景中物體的平移旋轉(zhuǎn)。但是在虛擬現(xiàn)實(shí)中,相機(jī)的方向、位置等參數(shù)由使用者的頭戴式顯示設(shè)備(HMD)的狀態(tài)信息確定,無(wú)法使用傳統(tǒng)方法對(duì)相機(jī)進(jìn)行操作,所以需要通過(guò)單位立方體的平移旋轉(zhuǎn)操作來(lái)實(shí)現(xiàn)對(duì)渲染結(jié)果的多角度觀察體驗(yàn)。因?yàn)樗惴ǖ脑?,單位立方體的頂點(diǎn)坐標(biāo)在片元著色器中難以更改,會(huì)導(dǎo)致單位立方體在頂點(diǎn)著色器和片元著色器中所處的坐標(biāo)系不一致,不利于交互操作的實(shí)現(xiàn)。(2) 在計(jì)算光線投射方向和起點(diǎn)坐標(biāo)時(shí),使用片元坐標(biāo)減去相機(jī)坐標(biāo)得到方向向量,光線起點(diǎn)為片元坐標(biāo),最終合成的顏色值即為表面片元的顏色。但是當(dāng)相機(jī)位置處在單位立方體內(nèi)時(shí),方向向量和起點(diǎn)坐標(biāo)的計(jì)算方式不再適用,需要以新的方式重新計(jì)算。否則,當(dāng)使用者近距離觀察渲染結(jié)果或者在進(jìn)行交互操作時(shí),有可能不經(jīng)意地造成距離過(guò)近而使圖像突然消失,影響用戶體驗(yàn)。基于以上兩點(diǎn)原因,需要對(duì)光線投射算法進(jìn)行一些改進(jìn),實(shí)現(xiàn)虛擬現(xiàn)實(shí)環(huán)境中體繪制可視化。
針對(duì)以上的不足,本文提出了基于WebVR的方法來(lái)實(shí)現(xiàn)醫(yī)學(xué)體數(shù)據(jù)可視化,系統(tǒng)通過(guò)服務(wù)器端向?yàn)g覽器發(fā)送體數(shù)據(jù),然后瀏覽器使用WebGL進(jìn)行渲染,通過(guò)傳統(tǒng)屏幕或者虛擬現(xiàn)實(shí)設(shè)備HTC Vive以普通模式或VR模式顯示可視化結(jié)果并實(shí)現(xiàn)相應(yīng)交互操作。在普通模式中,使用者可以實(shí)現(xiàn)旋轉(zhuǎn)、平移、縮放的操作;在VR模式中,針對(duì)虛擬現(xiàn)實(shí)環(huán)境的特點(diǎn),提出了單通道光線投射體繪制算法在虛擬現(xiàn)實(shí)環(huán)境中的改進(jìn)方法,實(shí)現(xiàn)體數(shù)據(jù)內(nèi)部可視化、激光拾取和平面裁剪的交互方式,可以通過(guò)立體視覺(jué)以任意角度觀察體數(shù)據(jù)表面及內(nèi)部細(xì)節(jié)信息,增強(qiáng)使用者對(duì)人體的器官組織或病變部位的感知與認(rèn)識(shí)。
本系統(tǒng)整體設(shè)計(jì)使用B/S模式,采用富客戶端策略,系統(tǒng)的核心功能基本都是通過(guò)瀏覽器端來(lái)實(shí)現(xiàn),服務(wù)器端只需要完成數(shù)據(jù)存儲(chǔ),負(fù)擔(dān)較小。同時(shí)只需一次性的數(shù)據(jù)傳輸,瀏覽器端與服務(wù)器端無(wú)需頻繁的數(shù)據(jù)通信,對(duì)網(wǎng)絡(luò)的要求也較低。這種模式最大的優(yōu)點(diǎn)就是沒(méi)有平臺(tái)的限制,無(wú)需安裝,使用和維護(hù)都很方便。
如圖1所示,系統(tǒng)整體架構(gòu)主要由三部分組成:服務(wù)器端、瀏覽器端與虛擬現(xiàn)實(shí)端。系統(tǒng)的實(shí)現(xiàn)主要由醫(yī)學(xué)影像數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)傳輸、數(shù)據(jù)預(yù)處理、數(shù)據(jù)渲染、瀏覽器顯示、虛擬現(xiàn)實(shí)顯示、虛擬現(xiàn)實(shí)交互等部分構(gòu)成。其中服務(wù)器負(fù)責(zé)數(shù)據(jù)存儲(chǔ);瀏覽器端與服務(wù)器端間的數(shù)據(jù)請(qǐng)求與數(shù)據(jù)傳輸通過(guò)HTTP協(xié)議來(lái)實(shí)現(xiàn);使用Web端醫(yī)學(xué)影像處理庫(kù)Cornerstone.js對(duì)接受到的圖像數(shù)據(jù)進(jìn)行預(yù)處理,處理成能夠被WebGL使用的紋理數(shù)據(jù);使用WebGL進(jìn)行可視化渲染,將普通三維影像在瀏覽器端顯示出來(lái);通過(guò)WebVR實(shí)現(xiàn)瀏覽器與虛擬現(xiàn)實(shí)設(shè)備HTC Vive實(shí)現(xiàn)連接,使用HTC Vive的頭戴式顯示器實(shí)現(xiàn)虛擬現(xiàn)實(shí)環(huán)境中三維影像的顯示并通過(guò)配套的手柄控制器完成交互操作。
圖1 系統(tǒng)結(jié)構(gòu)圖
在服務(wù)器端與瀏覽器端之間,體數(shù)據(jù)的傳輸使用基于HTTP通信機(jī)制的Web技術(shù),采用的是請(qǐng)求-獲取的數(shù)據(jù)傳遞模式,將服務(wù)器端的DICOM格式體數(shù)據(jù)壓縮包傳輸?shù)娇蛻魹g覽器端。系統(tǒng)通過(guò)采用Fetch API中GlobalFetch.Fetch()方法實(shí)現(xiàn)遠(yuǎn)程數(shù)據(jù)獲取??蛻魹g覽器端根據(jù)所需體數(shù)據(jù)存儲(chǔ)的URL路徑,使用Fetch()方法,發(fā)起對(duì)遠(yuǎn)程數(shù)據(jù)的請(qǐng)求,最終得到數(shù)據(jù)。
由服務(wù)器處得到一組DICOM文件,其中每個(gè)DICOM文件只存放單張CT或MRI斷層切片,每個(gè)DICOM文件數(shù)據(jù)由文件頭數(shù)據(jù)和像素?cái)?shù)據(jù)兩部分組成。由于DICOM文件所需存儲(chǔ)空間太大,而且WebGL無(wú)法直接讀取操作DICOM數(shù)據(jù),所以需要對(duì)DICOM文件數(shù)據(jù)進(jìn)行預(yù)處理。使用Cornerstone.js將DICOM文件中原始像素?cái)?shù)據(jù)解析出來(lái),具體方法是使用Cornerstone.js中的圖像加載器讀取DICOM文件,然后得到其中每一個(gè)像素?cái)?shù)據(jù)的灰度值,依次存入一個(gè)數(shù)組中,最后將數(shù)組轉(zhuǎn)為數(shù)據(jù)格式為Uint8的類型化數(shù)組。處理成這種格式后,WebGL即可將其作為三維紋理傳入著色器中。
光線投射算法是以圖像空間為序的直接體繪制算法。從視點(diǎn)出發(fā),沿著視線方向依次發(fā)射若干條光線穿過(guò)體數(shù)據(jù),在此過(guò)程中對(duì)體數(shù)據(jù)等間距采樣并獲得顏色值,依次對(duì)各采樣點(diǎn)的顏色值進(jìn)行合成,當(dāng)所有光線穿越完整個(gè)體數(shù)據(jù)后,得到渲染結(jié)果[12]。
WebGL為Web瀏覽器提供了內(nèi)置的硬件3D加速渲染功能,從而為實(shí)現(xiàn)無(wú)插件的三維醫(yī)學(xué)圖像可視化提供了底層支持。最新版本的WebGL2.0標(biāo)準(zhǔn)開始支持三維紋理的使用,可以實(shí)現(xiàn)基于硬件的自動(dòng)插值,提高運(yùn)行效率。本文使用封裝了WebGL的第三方庫(kù)Three.js來(lái)編程實(shí)現(xiàn)。
本文使用基于單通道的光線投射體繪制方法。實(shí)現(xiàn)流程如圖2所示。
圖2 單通道光線投射算法流程圖
具體步驟如下:
(1) 繪制單位立方體,作為體紋理的載體。向頂點(diǎn)著色器中傳入單位立方體各頂點(diǎn)坐標(biāo),再傳入片元著色器中,通過(guò)光柵化和背面剔除,得到立方體外表面正面各片元坐標(biāo),作為光線的起始位置坐標(biāo)。
(2) 在片元著色器中,傳入體數(shù)據(jù)的三維紋理和一維傳遞函數(shù)的紋理以及相機(jī)的坐標(biāo)。通過(guò)片元坐標(biāo)減去相機(jī)坐標(biāo)可以計(jì)算出的光線的方向向量,通過(guò)設(shè)置好的采樣步長(zhǎng),沿著射線方向在單位立方體內(nèi)均勻采樣。對(duì)于每個(gè)采樣點(diǎn)根據(jù)使用者設(shè)置的傳遞函數(shù)為其賦予顏色值和不透明度值。
(3) 圖像合成。沿著每一條射線在單位立方體內(nèi)均勻采樣,依次對(duì)該射線方向上所有采樣點(diǎn)進(jìn)行顏色值和不透明值的合成即可得到單位立方體對(duì)應(yīng)片元的顏色值。合成公式為:
(1)
傳遞函數(shù)定義了為三維數(shù)據(jù)場(chǎng)的數(shù)據(jù)屬性到光學(xué)屬性的映射[13]。從傳遞函數(shù)的定義域分類可以分為一維、二維、多維的傳遞函數(shù)。本文使用最為常用的一維傳遞函數(shù)。一維傳遞函數(shù)以體數(shù)據(jù)的標(biāo)量值,即灰度屬性值作為傳遞函數(shù)的輸入,輸出經(jīng)過(guò)映射得到的顏色(RGB)和不透明度(Alpha)?;竟饺缦拢?/p>
(2)
式中:α表示該采樣點(diǎn)的灰度值;Rα、Gα、Bα、Aα分別代表由α生成顏色的紅、綠、藍(lán)分量以及不透明度。傳遞函數(shù)可以在程序運(yùn)行時(shí)由使用者進(jìn)行手動(dòng)設(shè)置,傳遞函數(shù)的設(shè)置方式如圖3所示。在右上方的菜單中,可以添加三個(gè)控制點(diǎn),并且可以設(shè)置這三個(gè)點(diǎn)位置、顏色和透明度,然后根據(jù)這三個(gè)點(diǎn)自動(dòng)插值出其它位置的顏色和不透明度,生成一張長(zhǎng)255像素、寬20像素的RGBA格式圖像。這張圖像作為紋理立即傳入片元著色器中,影響最終圖像的生成。在程序運(yùn)行中,使用者對(duì)傳遞函數(shù)的設(shè)置可以實(shí)時(shí)得到反饋,經(jīng)過(guò)調(diào)整即可達(dá)到最優(yōu)的顯示效果。
圖3 傳遞函數(shù)的設(shè)置方式
2.5.1渲染圖像的平移與旋轉(zhuǎn)
由2.3節(jié)可知,單通道體繪制相比于多通道體繪制,由于無(wú)法得到單位立方體背面片元坐標(biāo),所以無(wú)法得到光線的終止點(diǎn)坐標(biāo),所以需要額外的方式來(lái)判斷光線上采樣點(diǎn)與單位立方體的位置關(guān)系。在片元著色器中,單位立方體的頂點(diǎn)坐標(biāo)如圖4所示,該坐標(biāo)系為單位立方體的局部坐標(biāo)系。在此坐標(biāo)系下,對(duì)采樣點(diǎn)與單位立方體的位置判斷只需要看采樣點(diǎn)在三個(gè)坐標(biāo)軸上的取值是否在0到1之間即可。同時(shí),單位立方體各頂點(diǎn)坐標(biāo)與三維紋理的坐標(biāo)取值區(qū)間相同,無(wú)需額外的映射。所以在片元著色器中使用局部坐標(biāo)系特別方便。此時(shí),如果要實(shí)現(xiàn)渲染圖像的平移與旋轉(zhuǎn),需要在頂點(diǎn)著色器中,通過(guò)模型矩陣乘以單位立方體的頂點(diǎn)坐標(biāo),得到世界坐標(biāo)系下的頂點(diǎn)坐標(biāo)值。雖然使用這種方式可以實(shí)現(xiàn)旋轉(zhuǎn)和平移變換,但是,頂點(diǎn)和片元著色器中的單位立方體所處的坐標(biāo)系不同,對(duì)后續(xù)交互操作的計(jì)算產(chǎn)生障礙。改進(jìn)方式有兩種。第一種是將片元著色器中的單位立方體的坐標(biāo)系由局部坐標(biāo)系轉(zhuǎn)為世界坐標(biāo)系。此方法如果要實(shí)現(xiàn)需要解決兩個(gè)問(wèn)題:從單位立方體內(nèi)部采樣點(diǎn)坐標(biāo)到三維紋理坐標(biāo)的映射以及采樣點(diǎn)坐標(biāo)與單位立方體的位置關(guān)系判定。以上兩個(gè)問(wèn)題都很難解決,所以,本文使用另一種改進(jìn)方式,就是將傳入片元著色器中的其他坐標(biāo)值從世界坐標(biāo)系轉(zhuǎn)換到單位立方體的局部坐標(biāo)系中,再進(jìn)行其他的計(jì)算。
圖4 單位立方體頂點(diǎn)坐標(biāo)示意圖
2.5.2體數(shù)據(jù)的內(nèi)部可視化
當(dāng)在虛擬現(xiàn)實(shí)環(huán)境中對(duì)體數(shù)據(jù)進(jìn)行觀察操作時(shí),如果使用者通過(guò)激光拾取操作來(lái)近距離觀察渲染結(jié)果,有可能導(dǎo)致相機(jī)位置進(jìn)入單位立方體內(nèi)部時(shí),造成渲染圖像突然消失。因?yàn)樵趥鹘y(tǒng)算法中,并沒(méi)有針對(duì)相機(jī)位置的變化來(lái)對(duì)光線的方向向量與光線的起始點(diǎn)進(jìn)行重新計(jì)算。同時(shí),為了減少計(jì)算量,開啟了背面剔除,所以單位立方體內(nèi)部的片元未被渲染。改進(jìn)方法流程如圖5所示。
圖5 體數(shù)據(jù)的內(nèi)部可視化實(shí)現(xiàn)流程圖
通過(guò)計(jì)算得到相機(jī)在單位立方體局部坐標(biāo)系下的相對(duì)位置坐標(biāo),即可根據(jù)坐標(biāo)值的大小判斷相機(jī)是否處于單位立方體內(nèi),如果相機(jī)處于單位立方體外部,則原來(lái)的算法保持不變。如果相機(jī)處于單位立方體內(nèi)部,則將光線起點(diǎn)改為相機(jī)位置,并關(guān)閉背面剔除,光線的方向向量則通過(guò)背面片元坐標(biāo)減去相機(jī)坐標(biāo)獲得。
由于并不是所有使用者都接入了VR設(shè)備,所以保留了傳統(tǒng)的基于二維屏幕的顯示方式。當(dāng)Web端利用WebGL完成圖像的渲染時(shí),渲染結(jié)果將以普通模式顯示在屏幕上。然后再檢測(cè)是否有VR設(shè)備接入Web,若檢測(cè)到有設(shè)備接入,則使用者點(diǎn)擊“ENTER VR”按鈕,即可由普通模式切換到VR模式。
渲染圖像在VR中顯示需要利用WebVR API。WebVR API能為虛擬現(xiàn)實(shí)設(shè)備的使用提供支持,提供了如Oculus Rift或者HTC Vive等頭戴式顯示設(shè)備與Web端的連接??梢酝ㄟ^(guò)獲取VR設(shè)備返回的位置和動(dòng)作信息,來(lái)改變使用者在虛擬空間里的位置、行為。本文使用HTC Vive來(lái)實(shí)現(xiàn)虛擬現(xiàn)實(shí)中的體繪制可視化。
在普通模式中,利用WebGL渲染的三維空間中的物體必須通過(guò)模型矩陣、視圖矩陣、投影矩陣的矩陣變換轉(zhuǎn)變成屏幕上的二維圖像才能正常顯示。在Three.js中,投影矩陣和視圖矩陣被封裝到了相機(jī)的屬性當(dāng)中,在使用時(shí)可以方便地調(diào)用。
通過(guò)控制相機(jī)在世界坐標(biāo)系中的位置,即改變視圖矩陣來(lái)間接實(shí)現(xiàn)對(duì)場(chǎng)景中物體的平移、旋轉(zhuǎn)和縮放的操作,在普通模式中提供簡(jiǎn)單的交互操作。
VR模式中物體的顯示與普通模式有很大區(qū)別。主要區(qū)別在于:首先,對(duì)WebVR場(chǎng)景中的顯示需要進(jìn)行雙屏渲染。如圖6所示,需要根據(jù)瞳距等信息分別設(shè)置左右兩個(gè)相機(jī),再根據(jù)左右相機(jī)的視圖矩陣和投影矩陣?yán)L制圖像。其次,WebVR場(chǎng)景相機(jī)的方向、位置等參數(shù)由使用者的頭戴式顯示設(shè)備的狀態(tài)信息確定。當(dāng)使用者的現(xiàn)實(shí)視角發(fā)生變化時(shí),WebVR場(chǎng)景的相機(jī)也隨之動(dòng)態(tài)變化。
圖6 WebVR成像示意圖
在VR模式中,渲染流程如下:
(1) 獲取接入Web瀏覽器的VR設(shè)備信息,完成準(zhǔn)備工作。
(2) 設(shè)置渲染循環(huán)。由于需要根據(jù)使用者行為動(dòng)態(tài)繪制每一幀場(chǎng)景,所以需要使用一個(gè)循環(huán)函數(shù),不斷執(zhí)行遞歸循環(huán),實(shí)現(xiàn)動(dòng)態(tài)更新。接入VR后會(huì)優(yōu)先使用VR設(shè)備原生的刷新率,以達(dá)到合適的渲染幀頻,實(shí)現(xiàn)更佳的顯示效果。
(3) 動(dòng)畫渲染。在每一幀中,瀏覽器可以通過(guò)WebVR得到渲染所需的幀數(shù)據(jù)。其中包括當(dāng)前幀的左右視口的投影矩陣和視圖矩陣。分別設(shè)置左右相機(jī)和左右視口,并將視圖、投影矩陣賦值給左右相機(jī),然后傳入著色器,著色器分兩次在左右視口中進(jìn)行繪制,得到左右眼的渲染圖像,再通過(guò)WebVR將圖像發(fā)送至HTC Vive中顯示出來(lái)。
為了充分發(fā)揮虛擬現(xiàn)實(shí)技術(shù)在體數(shù)據(jù)可視化中的優(yōu)勢(shì)。結(jié)合HTC Vive的手柄控制器硬件,在VR環(huán)境中,為渲染后的三維圖像設(shè)計(jì)實(shí)現(xiàn)了三維交互功能:激光拾取、平面裁剪。
從手柄處射出一道具有一定長(zhǎng)度的激光射線,當(dāng)激光與虛擬現(xiàn)實(shí)場(chǎng)景中物體發(fā)生碰撞事件時(shí),通過(guò)按手柄上的扳機(jī)鍵并移動(dòng)或旋轉(zhuǎn)手柄即可使該物體發(fā)生對(duì)應(yīng)的移動(dòng)與旋轉(zhuǎn)。在虛擬現(xiàn)實(shí)環(huán)境中對(duì)體繪制可視化結(jié)果實(shí)現(xiàn)任意角度、任意距離的觀察。實(shí)現(xiàn)方式如下:
(1) 初始化手柄。在世界坐標(biāo)系中載入預(yù)制的手柄模型對(duì)象。
(2) 在渲染循環(huán)中,獲取手柄對(duì)象的模型矩陣,其中包含了手柄對(duì)象在世界坐標(biāo)系中的坐標(biāo)、旋轉(zhuǎn)方向、縮放等信息數(shù)據(jù)。利用坐標(biāo)和旋轉(zhuǎn)方向,即可從手柄頂端出發(fā),沿著手柄的方向繪制射線。由于所有信息在循環(huán)中動(dòng)態(tài)更新,所以射線的位置和方向相對(duì)于手柄保持同步變換。
(3) 當(dāng)按下扳機(jī)鍵時(shí),利用Raycaster對(duì)象,得到與射線相交物體。Raycaster對(duì)象在Three.js中用于進(jìn)行光線與物體的碰撞檢測(cè)。用上一步中得到的坐標(biāo)和旋轉(zhuǎn)方向設(shè)置Raycaster對(duì)象就可以得到與射線相交物體對(duì)象列表,并在列表中選擇與手柄距離最近的相交物體對(duì)象。
(4) 為手柄與相交物體建立“父子關(guān)系”,相交物體成為手柄的子對(duì)象,隨著父對(duì)象的移動(dòng)發(fā)生移動(dòng)。首先,獲取已得到的相交物體的模型矩陣,模型矩陣控制物體在世界坐標(biāo)下的坐標(biāo),然后通過(guò)父對(duì)象的模型矩陣更新子對(duì)象的模型矩陣即可。
(5) 松開扳機(jī)鍵時(shí),解除手柄與相交物體的“父子關(guān)系”。
由此,即可完成相關(guān)操作。
在醫(yī)學(xué)可視化中,往往需要將體數(shù)據(jù)中的內(nèi)部細(xì)節(jié)信息顯示出來(lái)。雖然調(diào)節(jié)傳輸函數(shù)能夠展示體數(shù)據(jù)的不同部分,但是對(duì)于比較復(fù)雜的體數(shù)據(jù),很難僅通過(guò)傳輸函數(shù)將所需內(nèi)部細(xì)節(jié)表現(xiàn)出來(lái)。因此需要體數(shù)據(jù)裁剪工具,屏蔽外部遮擋的部分,以凸顯內(nèi)部細(xì)節(jié)信息。傳統(tǒng)的醫(yī)學(xué)可視化系統(tǒng)所提供裁剪面功能,由于二維屏幕的限制,只有由矢狀面、冠狀面和水平面等特定方向進(jìn)行平面裁剪操作,且操作與設(shè)置需要不斷調(diào)整,使用不便。因此,本文設(shè)計(jì)了在虛擬現(xiàn)實(shí)空間中的平面裁剪功能,使用激光拾取功能可以自由操控體數(shù)據(jù)以及裁剪平面的位置,實(shí)現(xiàn)沿著任意角度對(duì)體數(shù)據(jù)進(jìn)行裁剪,操作簡(jiǎn)便。流程如下:
(1) 初始化裁剪平面。通過(guò)確定平面內(nèi)一點(diǎn)P及其法向量n,即可確定平面在世界坐標(biāo)中的位置和方向,以此來(lái)初始化平面對(duì)象。
(2) 動(dòng)態(tài)更新裁剪平面。由于單位立方體在頂點(diǎn)著色器和片元著色器中的坐標(biāo)不同,所以兩者的交互需要在單位立方體的局部坐標(biāo)系下計(jì)算,即以單位立方體為參照,裁剪平面的位置和方向。點(diǎn)P和法向量n并不會(huì)自動(dòng)更新,所以需要在每一幀中通過(guò)計(jì)算更新,得到點(diǎn)P和法向量n在單位立方體的局部坐標(biāo)系下的值。公式如下:
(3)
(3) 將點(diǎn)P和法向量n傳入片元著色器中,計(jì)算裁剪后的結(jié)果并顯示。在光線投射法體繪制中,每當(dāng)沿著一道射線進(jìn)行顏色和不透明度合成時(shí),對(duì)于每一個(gè)采樣點(diǎn),都需要判斷該采樣點(diǎn)與裁剪平面的位置關(guān)系,若該采樣點(diǎn)在裁剪平面的正面一側(cè),就進(jìn)行合成運(yùn)算;若在背面一側(cè),則跳過(guò)該采樣點(diǎn),重復(fù)該操作,直到合成結(jié)束。
這樣就得到了經(jīng)過(guò)裁剪的體繪制結(jié)果。
實(shí)驗(yàn)計(jì)算機(jī)配置為Intel?CoreTMi7- 6700HQ CPU @2.60 GHz;顯卡為NVIDIA GeForce GTX 1070;內(nèi)存為16 GB;Windows 10 64位操作系統(tǒng)。實(shí)驗(yàn)體數(shù)據(jù)為頭部CT數(shù)據(jù),分辨率為256×256×225;測(cè)試瀏覽器使用FireFox。在常規(guī)模式中,結(jié)果如圖7所示,在VR模式中的結(jié)果如圖8所示,體數(shù)據(jù)內(nèi)部可視化結(jié)果如圖9所示。系統(tǒng)運(yùn)行流暢,無(wú)卡頓,顯示效果清晰。
圖7 普通模式下的可視化結(jié)果
圖8 VR模式下的可視化結(jié)果
圖9 體數(shù)據(jù)內(nèi)部可視化結(jié)果
本文實(shí)現(xiàn)了在虛擬現(xiàn)實(shí)環(huán)境中的醫(yī)學(xué)體數(shù)據(jù)可視化系統(tǒng),并針對(duì)虛擬現(xiàn)實(shí)環(huán)境設(shè)計(jì)了激光拾取、體數(shù)據(jù)內(nèi)部可視化與平面裁剪功能,提供沉浸式的可視化與交互體驗(yàn),有利于針對(duì)三維醫(yī)學(xué)影像的醫(yī)學(xué)診斷與教學(xué)工作。同時(shí),運(yùn)行于Web端,無(wú)需下載安裝軟件及其他可視化插件,可以跨平臺(tái)運(yùn)行,使用方便。下一步的工作主要包括兩方面:(1) 在交互方面,將可交互的傳遞函數(shù)直接集成到VR環(huán)境中,在VR模式實(shí)現(xiàn)對(duì)傳遞函數(shù)的操作;(2) 在體繪制方面,目前的成像效果還有不足,下一步將在體繪制算法中加入實(shí)現(xiàn)光照的算法,實(shí)現(xiàn)更好的顯示效果。