?

物體重建中的定位及渲染問題研究

2020-08-27 14:09杜麗美張劍妹
關鍵詞:堆棧視點投影

杜麗美,張劍妹

(長治學院計算機系,山西長治 046011)

當今信息技術迅猛發展,隨之產生的電子產品越來越多,這就導致了人們在工作和日常生活中對虛擬事物的接觸也越來越頻繁。比如在工作和學習中可能要借助虛擬場景來解決難題,生活中要借助虛擬設備來實現各種智能控制,娛樂方面更是離不開虛擬世界。為了更好地營造虛擬場景氛圍需要將現實生活中的各類物體以虛擬物體的狀態展示在各種屏幕上,以供人類使用。

1 研究的主要問題

現實生活中的物體之所以真實是因為大多是三維的,人類用雙眼觀察這些物體會有遠處的物體小,近處的物體大的特點,再加上自然光的照射,霧的存在等使得一個普通的物體出現了各種狀態。要將真實物體變為虛擬物體,首先要解決的是虛擬物體在窗口上的定位和投影問題,其次是各種特殊效果的設置,比如光照、材質、紋理等,最后還要解決人與虛擬物體之間的交互問題。本文就從這些方面來研究對于現實世界中的三維物體如何正確而有效地轉換為虛擬物體的過程。

2 窗口建模

一個物體要想展示在計算機屏幕上,首先要確定窗口的位置和大小、視口的位置和大小、視點的位置、投影的方式等問題[1-2]。

2.1 定位

計算機屏幕所對的坐標系為世界坐標系,其X、Y和Z軸的方向如圖1所示,即垂直于屏幕向外的方向為Z軸正向。確定了坐標系后,就要確定屏幕窗口的位置和大小,可以借助函數(1)(2)來完成,其中(1)中的x0和y0表示屏幕窗口距離計算機屏幕左上角的位置坐標,(2)中的width0和height0表示屏幕窗口自身的大??;接著確定視口的位置和大小,視口可形象地理解為顯示物體的窗口,視口與屏幕窗口的關系為:屏幕窗口中包含視口,視口僅僅是屏幕窗口的一部分,大多數情況視口與屏幕窗口大小和位置完全一樣即“重疊”,視口設置函數為(3),其中x 和y 表示視口距離屏幕窗口左下角的位置坐標,width 和height 表示視口自身的大小。計算機屏幕、屏幕窗口、視口之間的關系見圖2所示。

圖1 世界坐標系

視點即對應著真實世界中人眼睛的位置坐標,眼睛位置選取的不同可以看到物體的面就不同,視點設置函數為(4),其中x1、y1和z1為人眼在世界坐標下的位置,x2、y2和z2為物體在世界坐標下的位置,x3、y3和z3為人眼看物體的方向(其實就是方向坐標)。

圖2 屏幕、窗口、視口之間的關系

2.2 投影

投影是物體建模最關鍵的一步,分為正射投影和透視投影。正射投影的特點是不管物體離視點有多遠,物體的大小都是不變的。透視投影的特點是離視點近的物體大,離視點遠的物體小,透視投影符合我們日常生活中觀察某個物體的特點,因此透視投影方式可以呈現出一種立體的效果,更接近真實場景。一般我們在三維建模中都使用透視投影的方式。兩種投影方式對應的投影函數為(5)和(6),其中(5)中的參數如圖3 所示,(6)中的參數x表示視點與裁剪面上端與下端形成的角度,y表示裁剪面的寬高比即width/height,z和h分別表示近裁剪面和遠裁剪面沿Z 軸距視點的距離如圖4 所示。不管是哪種投影方式,在調用投影函數之前都必須加上glLoadIdentity()和glMatrixMode()函數,前者表示還原當前矩陣為單位矩陣(也就是進行復位操作),后者表示投影模式(參數一般為GL_PROJECTION)。

圖3 正射投影視景體

圖4 透視投影視景體

2.3 堆棧操作

堆棧操作經常用在模型的平移、旋轉和縮放等變換中,堆棧操作[3]函數為式(7)和(8)所示。對模型進行各種變換其實就是使用各種變換矩陣M1,M2,…,與當前模型所在矩陣S進行相乘的操作,式(7)是將各種變換對應的矩陣M1,M2,…,壓入棧中,目的是使變換矩陣與物體所在矩陣S做運算,運算的結果S’即為模型經過變換之后最終的位置;式(8)是將變換后的最終矩陣S’拋出,留下最初模型對應的矩陣S。

為了更加清晰地了解堆棧操作在圖形變換中的重要作用,以圖5 為例來進行具體的說明,圖5中的五幅圖展示了一個長方形在進行旋轉的過程中,使用堆棧和不使用堆棧的最終效果,其中圖5(a)為確定了窗口、視口、視點以及投影方式后,在屏幕中心位置畫出的初始長方形,現對初始長方形進行旋轉變換,每次旋轉角度為5 度;圖5(b)為使用了堆棧操作后,對長方形進行的第一次旋轉,圖5(d)為不使用堆棧操作對長方形進行的第一次旋轉,由于是第一次旋轉,所以兩幅圖的結果是一樣的。圖5(c)和圖5(e)分別是使用和不使用堆棧操作對初始長方形進行的五次旋轉后的結果,比較兩次結果,假設變量i=0 為旋轉度數,旋轉一次相當于i+=5(這里的5 表示5 度),圖5(c)由于使用了堆棧操作,在每一次旋轉后都會將旋轉變換后的矩陣拋出,只剩下初始長方形所在的初始矩陣,因而在進行第五次旋轉時,i的值已經加到了25 度,25度對應的旋轉矩陣和初始長方形所在的矩陣相乘,因此在經過了第五次旋轉后最終的結果和圖5(a)比較僅僅旋轉了25度;圖5(e)沒有使用堆棧操作,可以理解為:第一次旋轉i的值為5表示模型轉動5度,第二次旋轉i的值變為10表示在第一次旋轉的基礎上再旋轉10 度,其實模型較圖5(a)已經旋轉了15度,…,第五次旋轉時i的值為25是在第四次旋轉的基礎上進行的,因此第五次旋轉后模型較圖5(a)旋轉了75度。

圖5 使用堆棧和不使用堆棧對模型進行旋轉效果對比

根據以上分析,當我們對模型進行平移、旋轉、縮放等變換時,使用堆棧操作會更加接近真實情況,為此一般情況下都需要在程序的設計中加入堆棧操作函數。

3 特殊效果設置

為了渲染出更加真實的場景,需要對模型進行光照、霧化等的設置,設置不同顏色的光照可以使物體表面呈現出不同的顏色效果,使用霧化函數可以修飾周圍的環境,更加逼近真實場景[4]。另外,為了達到人機交互的目的,可以借助鍵盤控制函數,來控制屏幕上模型的各種運動[5-6]。這些特殊效果可以使用式(9)~(12)來完成。

4 實驗結果

通過以上分析,這里分別對兩種物體進行了仿真模擬,當將窗口和視口大小均設置為(200,200),視點位置為(0,0,10),投影方式采用透視投影方式時圖6(a)和圖7(a)為對“茶壺”和“甜甜圈”兩個物體的模擬效果,從結果中看到物體都是居中顯示的。圖6(b)和圖6(c)為借助鍵盤控制函數對茶壺進行不同方向的旋轉效果。圖7(b)和圖7(c)為在透視投影下,對物體在Z 軸負方向作平移后的效果,從結果中可以看到物體變的越來越小,而且實驗中加入了霧化效果,當物體沿著Z軸負方向移動時會有霧的阻擋而顏色越來越不清晰。在圖6 和圖7 的仿真過程中,由于涉及到物體的移動問題,因此均使用了堆棧操作函數。

圖6 茶壺模型的定位及渲染效果

圖7 甜甜圈模型的定位及渲染效果

5 總結與展望

詳細介紹了物體進行仿真建模過程中的定位問題、投影問題以及堆棧操作問題,這些問題要在物體建模初期確定下來,并且其解決的好壞決定了物體后期的仿真效果。除了這些問題以外,為了能夠重建出非常逼真的模型,還需要對物體進行光照、材質、紋理[7]、霧化等的設置,這些只在文中簡要地提到,還有待進一步研究。

猜你喜歡
堆棧視點投影
全息? 全息投影? 傻傻分不清楚
投影向量問題
虛擬視點插值中參考視圖選擇策略
找投影
找投影
基于生成語法的句子理解機制
Windows棧緩沖區溢出攻擊原理及其防范
緩沖區溢出安全編程教與學
環境視點
尋找新的視點
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合