【《三維網(wǎng)格模型變形問(wèn)題研究》20000字(論文)】_第1頁(yè)
【《三維網(wǎng)格模型變形問(wèn)題研究》20000字(論文)】_第2頁(yè)
【《三維網(wǎng)格模型變形問(wèn)題研究》20000字(論文)】_第3頁(yè)
【《三維網(wǎng)格模型變形問(wèn)題研究》20000字(論文)】_第4頁(yè)
【《三維網(wǎng)格模型變形問(wèn)題研究》20000字(論文)】_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

[20]:q=(2-14)公式(2-13)也就是一個(gè)實(shí)數(shù)與一個(gè)向量的組合(向量可以看作是實(shí)數(shù)部分為0的四元數(shù)、實(shí)數(shù)也可以看作是虛數(shù)部分為零的四元數(shù))。四元數(shù)的加減就是按照實(shí)數(shù)部分相加減,虛數(shù)部分相加減的規(guī)則進(jìn)行運(yùn)算,但是四元數(shù)的乘法則比較復(fù)雜,假設(shè)q1=a+bi+cj+dk,q1q2=(2-15) 如果令v=b,c,dv·u=(bf+cg+dh)(2-16)v×u=(2-17)這里i、g、k是向量的基,所以如果用標(biāo)量向量和有序?qū)?lái)表示四元數(shù)乘法的話:q(2-18)必須要注意的是,四元數(shù)的乘法運(yùn)算并不符合交換律,也就是說(shuō)q1另外,如果兩個(gè)四元數(shù)q1=a+bi+cj+dk,q2 本文已經(jīng)給出四元數(shù)的定義和簡(jiǎn)單的運(yùn)算方法,下面介紹如何用四元數(shù)表示旋轉(zhuǎn)。首先我介紹一下三維空間中向量的旋轉(zhuǎn)。表示三維向量空間中的旋轉(zhuǎn)方法很多,這里介紹軸角式的旋轉(zhuǎn),也就是給定一個(gè)旋轉(zhuǎn)軸和旋轉(zhuǎn)角度,計(jì)算被旋轉(zhuǎn)后的向量的方法。 給定一個(gè)經(jīng)過(guò)原點(diǎn)(如果旋轉(zhuǎn)軸不經(jīng)過(guò)原點(diǎn)可以先將其平移到原點(diǎn),進(jìn)行旋轉(zhuǎn)之后再將其平移到原處,不會(huì)影響旋轉(zhuǎn)的結(jié)果)的旋轉(zhuǎn)軸u=(x,y,z)T,使一個(gè)向量v沿著這條旋轉(zhuǎn)軸旋轉(zhuǎn)θ度,變換到圖2-2三維空間內(nèi)向量的旋轉(zhuǎn) 本篇論文默認(rèn)使用右手坐標(biāo)系,根據(jù)右手定則上圖所表示的方向(逆時(shí)針)即旋轉(zhuǎn)的正方向。在這里我們只需要使向量繞著u的方向進(jìn)行旋轉(zhuǎn),所以我們可以規(guī)定旋轉(zhuǎn)軸為單位向量也就是:u= 在向量旋轉(zhuǎn)的過(guò)程中,把向量分解為兩個(gè)向量,一個(gè)是平行于旋轉(zhuǎn)軸的向量v||,另一個(gè)是垂直于旋轉(zhuǎn)軸的向量v圖2-3旋轉(zhuǎn)向量的分解 那么向量v=v 然后可以分別旋轉(zhuǎn)v的分量v⊥和v||得到v⊥'和v||',將他們相加便可以得到旋轉(zhuǎn)后的向量: 實(shí)際上可以將向量v||看作是向量v在旋轉(zhuǎn)軸uv(2-19)那么根據(jù)向量的合成與分解:v(2-20)從圖中可以看出,旋轉(zhuǎn)過(guò)后在平行于旋轉(zhuǎn)軸方向上的分向量沒(méi)有發(fā)生變化,所以我們可以得到結(jié)論(1):當(dāng)v||與旋轉(zhuǎn)軸平行時(shí),旋轉(zhuǎn)后的向量與旋轉(zhuǎn)的角度無(wú)關(guān),且與旋轉(zhuǎn)之前相等即:v現(xiàn)在分析垂直于坐標(biāo)軸的分量v⊥圖2-4向量分解 但是在這個(gè)平面內(nèi)只有一個(gè)向量v⊥,我們需要構(gòu)造另一個(gè)向量來(lái)表示旋轉(zhuǎn),這個(gè)向量可以由u和vω=u×(2-21) 因此旋轉(zhuǎn)后的向量v⊥'可以由ω和v⊥經(jīng)過(guò)伸縮變換后合成。因?yàn)橄蛄縲的模長(zhǎng)w=u×v⊥v⊥(2-22) 所以我們得到結(jié)論(2):當(dāng)v⊥與旋轉(zhuǎn)軸垂直時(shí)旋轉(zhuǎn)之后的向量v⊥' 根據(jù)結(jié)論(1)(2)可以得到向量v繞軸u旋轉(zhuǎn)θ度后的結(jié)果:v'=(2-23) 將v||=(u?v)u、v=vcosθ+(2-24) 上述公式就是三維坐標(biāo)的旋轉(zhuǎn)變換公式,只需要確定一個(gè)旋轉(zhuǎn)軸和旋轉(zhuǎn)角度即可通過(guò)公式(2-24)得到經(jīng)過(guò)旋轉(zhuǎn)變換后的向量坐標(biāo)。 將四元數(shù)跟三維旋轉(zhuǎn)聯(lián)系起來(lái),用四元數(shù)表示三維旋轉(zhuǎn)。為了方便區(qū)分四元數(shù)與向量的表示,將四元數(shù)表示為Q(a),那么我們可以定義以下四元數(shù):Qv=Qv⊥ 同理可以定義Qv∥、Q(v∥')、 根據(jù)四元數(shù)的加法運(yùn)算法則:Q(2-25)Q(2-26) 根據(jù)公式(2-22),如果用四元數(shù)代替向量,根據(jù)四元數(shù)的運(yùn)算法則,下列等式仍然成立:Q((2-27) 我們期望將這個(gè)等式寫(xiě)成全部是四元數(shù)的運(yùn)算形式,對(duì)上式進(jìn)行變形:Q(2-28) 不妨令QqQ(2-29) 也就是說(shuō),如果旋轉(zhuǎn)軸u的坐標(biāo)為(x,y,z)T,旋轉(zhuǎn)角度為θQ(2-30) 下面再考慮v∥用四元數(shù)表示旋轉(zhuǎn)的方式,很容易得到Q 至此可以獲得向量在三維空間中旋轉(zhuǎn)用的四元數(shù)表達(dá)式:Q(2-31) 在對(duì)這一等式進(jìn)行簡(jiǎn)化之前,必須先聲明幾個(gè)引理: (1)如果Qq=[cosθ,usinθ],且u為單位向量,那么 (2)假設(shè)一個(gè)純四元數(shù)Qv∥=[0,v∥],Qq=[α,βu],其中向量u是單位向量, (3)假設(shè)一個(gè)純四元數(shù)Qv⊥=[0,v⊥],Qq=[α,βu],其中向量u是單位向量, (4)單位四元數(shù)的逆與其共軛四元數(shù)相等即Q 這些引理根據(jù)四元數(shù)的運(yùn)算法則和性質(zhì)可以得到證明,這里不具體展開(kāi)證明。由引理(1)(2)(3)(4)得:Qv'=Qv(2-32) 在上述過(guò)程中,本文使用Qq的形式表示一個(gè)四元數(shù),以避免對(duì)四元數(shù)和向量的表示出現(xiàn)混亂。一般的,四元數(shù)用一個(gè)小寫(xiě)字母來(lái)表示。把公式(2-32)換成一般的形式,也就是:v'=pvp',在這里p和p 在這里,q=pq=Q(2-33) 根據(jù)引理(1):p=cos?(θ/2)+sin?(θ/2)xi+sin?(θ/2)yi+sin?(θ/2)zi(2-34) 也就是說(shuō)v'=pvp'這個(gè)變換公式代表的意義就是將以四元數(shù)v虛數(shù)部分為坐標(biāo)的向量按照坐標(biāo)軸 至此關(guān)于四元數(shù)的表示方法及旋轉(zhuǎn)原理已經(jīng)簡(jiǎn)單介紹完畢,如過(guò)要將一個(gè)向量v按照旋轉(zhuǎn)軸n旋轉(zhuǎn)θ度,那么旋轉(zhuǎn)后的向量表示為:v(2-35)2.3unity3d簡(jiǎn)介Unity3D也稱(chēng)Unity,是一個(gè)可以進(jìn)行三維視頻游戲、建筑可視化、實(shí)時(shí)三維動(dòng)畫(huà)等類(lèi)型互動(dòng)內(nèi)容的多平臺(tái)的綜合型游戲開(kāi)發(fā)工具。 3D游戲是unity引擎的重要應(yīng)用方向之一。從最開(kāi)始的文本游戲到二維游戲、三維游戲、網(wǎng)絡(luò)三維游戲,游戲的保真度和浸入感始終得到改善和增強(qiáng),同時(shí)保持實(shí)時(shí)性和交互性。圖2-5unity3d應(yīng)用于游戲開(kāi)發(fā)腳本用來(lái)控制物體和獲取的狀態(tài)、3D腳本用來(lái)界定用戶在游戲中的行為,是游戲制作中不可或缺的一部分,它能實(shí)現(xiàn)各個(gè)模型的數(shù)據(jù)交換和數(shù)據(jù)修改,并監(jiān)測(cè)模型的狀態(tài),之前Unity3D支持3種語(yǔ)言:C#、UnityScript(也就是JavaScriptforUnity)以及Boo。但是自Unity5.0后,Unity公司不再支持Boo語(yǔ)言。C#語(yǔ)言編輯腳本在編程理念上更符合Unity3D引擎原理,本文使用C#語(yǔ)言來(lái)進(jìn)行程序設(shè)計(jì)。圖2-6創(chuàng)建一個(gè)unity3d項(xiàng)目 下面以鍵盤(pán)輸入控制物體的移動(dòng)為例簡(jiǎn)單介紹Unity的使用: (1)打開(kāi)unity3d創(chuàng)建一個(gè)正方體,并創(chuàng)建一個(gè)地板作為正方體的移動(dòng)場(chǎng)景圖2-7創(chuàng)建一個(gè)正方體和地板 (2)創(chuàng)建一個(gè)腳本,掛載到正方體上:點(diǎn)擊正方體,再屏幕右側(cè)會(huì)顯示關(guān)于正方體的位置信息和其他信息,選擇Addcomponent>>NewScript,并給新添加的腳本命名。圖2-8創(chuàng)建C#腳本 (3)創(chuàng)建完成后可以在整個(gè)屏幕的下方查找以及創(chuàng)建的腳本,雙擊打開(kāi)腳本輸入代碼。圖2-9編輯腳本(4)腳本存后回到unity運(yùn)行代碼即可通過(guò)鍵盤(pán)實(shí)現(xiàn)正方體的交互移動(dòng)。2.4Libigl簡(jiǎn)介 Libigl是一個(gè)簡(jiǎn)單的C++幾何處理庫(kù),可以構(gòu)造稀疏的離散微分幾何算子和有限元矩陣,例如拉普拉斯矩陣和對(duì)角化質(zhì)量矩陣,libigl的大多數(shù)功能依賴(lài)于Eigen庫(kù),包括矩陣的構(gòu)造和運(yùn)算與Eigen庫(kù)十分相似。在libigl中,三維網(wǎng)格被儲(chǔ)存為兩個(gè)N×3的頂點(diǎn)矩陣和三角形連接關(guān)系矩陣:圖2-10一個(gè)由四個(gè)頂點(diǎn)兩個(gè)三角形構(gòu)成的網(wǎng)格表示 這種表示方法占用的內(nèi)存較少,并且使用索引而不是指針來(lái)保存網(wǎng)格的拓?fù)浣Y(jié)構(gòu)極大的簡(jiǎn)化了調(diào)試過(guò)程。Libigl提供了輸入和輸出函數(shù)供使用者調(diào)用:igl::readOFF(TUTORIAL_SHARED_PATH"/cube.off",V,F);igl::writeOBJ("cube.obj",V,F); libigl還提供了一個(gè)基于glfw的查看器,可以加載并繪制網(wǎng)格,另外libigl還支持與鼠標(biāo)和鍵盤(pán)的交互、修改網(wǎng)格的顏色,libigl還支持多個(gè)網(wǎng)格的同時(shí)渲染,每個(gè)網(wǎng)格設(shè)置自己的屬性,對(duì)網(wǎng)格進(jìn)行旋轉(zhuǎn)平移縮放等操作。圖2-11根據(jù)笛卡爾坐標(biāo)的大小繪制不同的網(wǎng)格顏色 另外除了這些基礎(chǔ)的操作、libigl也支持網(wǎng)格材質(zhì)捕捉(也成為環(huán)境貼圖)、計(jì)算法線、曲率值及方向、計(jì)算微分坐標(biāo)、構(gòu)造拉普拉斯矩陣、進(jìn)行拉普拉斯平滑等進(jìn)階的操作、libigl也支持對(duì)矩陣進(jìn)行特征分解、多種形狀變形方法、網(wǎng)格簡(jiǎn)化等復(fù)雜的操作。 下面是利用libigl對(duì)矩陣進(jìn)行特征分解的代碼:SparseMatrix<double>L,M;igl::cotmatrix(V,F,L);igl::massmatrix(V,F,igl::MASSMATRIX_TYPE_DEFAULT,M);Eigen::MatrixXdU;Eigen::VectorXdS;igl::eigs(L,M,5,igl::EIGS_TYPE_SM,U,S); 本文只用到了libigl進(jìn)行特征分解和等高線計(jì)算,對(duì)于其他的操作不做過(guò)多介紹。第三章特征骨架構(gòu)造及其優(yōu)化本章介紹特征骨架構(gòu)造及利用等高線進(jìn)行優(yōu)化的過(guò)程,并對(duì)優(yōu)化后的結(jié)果進(jìn)行分析評(píng)價(jià)。3.1特征骨架構(gòu)造 按照第二章第一節(jié)的理論對(duì)三維網(wǎng)格進(jìn)行采樣重構(gòu),首先要計(jì)算三維網(wǎng)格的拉普拉斯矩陣,三維網(wǎng)格的拉普拉斯矩陣定義為L(zhǎng)=D?1Ww(3-1)D為對(duì)角矩陣,D=diaga0,a1 構(gòu)造完拉普拉斯矩陣后,對(duì)拉普拉斯矩陣L進(jìn)行特征分解,矩陣的特征分解算法有很多,比如雅可比迭代法、QR分解法等,本文利用libigl(一個(gè)c++圖形庫(kù))調(diào)用Matlab進(jìn)行特征分解:圖3-1調(diào)用matlab對(duì)矩陣特征分解代碼這樣得到的U是拉普拉斯矩陣的前k個(gè)特征向量。圖3-2拉普拉斯矩陣可視化 利用前k個(gè)特征向量進(jìn)行重構(gòu),根據(jù)公式(2-10)至(2-12)得到重構(gòu)后的網(wǎng)格頂點(diǎn)的坐標(biāo),如圖2-3所示,左側(cè)是原始網(wǎng)格模型,該模型共有7056個(gè)頂點(diǎn),往后依次是用6、10、15個(gè)特征向量對(duì)原始網(wǎng)格進(jìn)行重構(gòu)的結(jié)果:圖3-3用不同特征向量對(duì)網(wǎng)格重構(gòu)的結(jié)果圖2-4是具有7202個(gè)頂點(diǎn)的三維網(wǎng)格依次用6、10、15個(gè)特征值進(jìn)重構(gòu)的結(jié)果:圖3-4用不同特征向量對(duì)網(wǎng)格重構(gòu)的結(jié)果 從實(shí)驗(yàn)結(jié)果可以看到,使用的特征向量越少,重構(gòu)之后得到的網(wǎng)格特征越明顯、細(xì)節(jié)越模糊。一個(gè)好的骨架評(píng)價(jià)標(biāo)準(zhǔn)應(yīng)該是最基本的特征能夠保留,多余的細(xì)節(jié)充分的丟棄。但是如果我們繼續(xù)減少特征向量對(duì)骨架進(jìn)行重構(gòu),得到的骨架反而會(huì)與網(wǎng)格的視覺(jué)差距越來(lái)越大,如圖2-5:圖3-5僅前三個(gè)特征值構(gòu)造的特征骨架(右)與原始網(wǎng)格(左)對(duì)比 使用三個(gè)特征值和特征向量進(jìn)行重構(gòu)就會(huì)使重構(gòu)后的特征骨架與原始網(wǎng)格差距變大,圖中骨架的手臂部分向上舉起,然而原始網(wǎng)格的手臂處于自然下垂。這是因?yàn)榍皫讉€(gè)特征值編碼的頻率震蕩幅度已經(jīng)很少了,也就是說(shuō)前幾個(gè)特征值編碼的低頻信號(hào)更主要的使記錄網(wǎng)格的整體特征,我們把這一部分特征向量棄之后造成了重構(gòu)后的特征骨架與原始網(wǎng)格的特征不一致。 因此我們可以采用比較少(通常在6-15之間)的特征向量對(duì)網(wǎng)格進(jìn)行重構(gòu),使得特征骨架能夠充分的保留網(wǎng)格的基本特征,然后再采用其他方式對(duì)特征骨架進(jìn)行優(yōu)化,得到一個(gè)更理想的骨架。3.2基于等高線的骨架優(yōu)化下面我們介紹三角網(wǎng)格等高線(也叫等值線)生成算法,這一算法將在網(wǎng)格上生成一組等高線,這組等高線上的點(diǎn)的某個(gè)值一定相等,這個(gè)相等的值取決于構(gòu)造等高線時(shí)所使用的標(biāo)量值列表,這個(gè)值可以是原始網(wǎng)格的坐標(biāo)的x軸分量,也可以是y、z軸分量,也可以是某個(gè)特征值的特征分量。等值線的繪制方法根據(jù)構(gòu)造方式的不同可以分為兩大類(lèi),插值法和曲線擬合法,從實(shí)際效果上看,插值算法總體上要比曲線擬合法效果更好。插值算法中的三角網(wǎng)方式在繪制過(guò)程中需要構(gòu)造三角網(wǎng)格,而我們?cè)谌蔷W(wǎng)格上繪制等高線則恰好可以省略這一步過(guò)程。由于三角網(wǎng)格的頂點(diǎn)大部分情況下都不會(huì)跟等值點(diǎn)重合,所以我們需要在三角形的邊上找插值等值點(diǎn):我們首先要找到網(wǎng)格中的一個(gè)頂點(diǎn)滿足zd?za(zd?zb)<0,其中zd表示等高線的值,za因?yàn)榈雀呔€是一個(gè)閉合的曲線,所以與三角形面片一定有兩個(gè)交點(diǎn),因此如果三角形的一條邊上存在一個(gè)等高線插值,則可以判斷另外兩條邊,一定可以找到另一個(gè)等值點(diǎn)。本論文中使用的igl圖形庫(kù)提供了一個(gè)等高線構(gòu)造函數(shù),我們可以把三角網(wǎng)格拉普拉斯矩陣的第一個(gè)非零向量作為等值標(biāo)量,計(jì)算出的30條等高線圖像如下:圖3-6等高線圖像如果我們把每一條等高線和每一個(gè)頂點(diǎn)對(duì)應(yīng)起來(lái),一個(gè)點(diǎn)只對(duì)應(yīng)一條等高線,并且是對(duì)應(yīng)到距離他平面距離最近的等高線,那么我們就可以把三維網(wǎng)格的頂點(diǎn)按照等高線分成若干組。然后把拉普拉斯矩陣的特征向量的分量按組平均化,即:tu(3-2)確定對(duì)應(yīng)點(diǎn)的每組等高線對(duì)應(yīng)的網(wǎng)格頂點(diǎn)的算法如下:(1)任取一組等高線上的一個(gè)等高點(diǎn)a,如果點(diǎn)a在三角網(wǎng)格的邊i,j上,那么將頂點(diǎn)vi、vj添加到Group1,然后取a的下一個(gè)臨界等高點(diǎn)b,將點(diǎn)b所在邊的頂點(diǎn)添加到Group(2)取另外一組等高線,重復(fù)步驟(1),主要這次對(duì)應(yīng)的點(diǎn)應(yīng)該添加到Group2,并且在添加時(shí)判斷等高線所在邊的頂點(diǎn)是否已經(jīng)有對(duì)應(yīng)的等高線,如果有,則判斷該點(diǎn)與兩條等高線的測(cè)地距離,如果距離當(dāng)前等高線更近,則將其從原來(lái)對(duì)應(yīng)的Group中刪除,添加到當(dāng)前Group(3)重復(fù)步驟(2)直到所有的等高線都遍歷完為止。按照?qǐng)D信號(hào)的重構(gòu)公式:V=(3-3)因?yàn)槊恳唤M網(wǎng)格頂點(diǎn)對(duì)應(yīng)的特征向量的分量都相等,所以重構(gòu)之后的網(wǎng)格更加簡(jiǎn)化,并且保留了更多特征,我們將其稱(chēng)之為等高線骨架。圖3-7原始網(wǎng)格與等高線骨架對(duì)比通過(guò)對(duì)比優(yōu)化前后的特征骨架圖3-3、圖3-5以及圖3-7,發(fā)現(xiàn)利用等高線優(yōu)化后的骨架形態(tài)更接近原始網(wǎng)格,且細(xì)節(jié)刪除的更充分。本文后續(xù)的工作基于等高線骨架而展開(kāi),因此骨架構(gòu)造的優(yōu)劣程度將影響整個(gè)網(wǎng)格的變形效果。第四章基于等高線骨架的網(wǎng)格編輯本章將介紹等高線骨架的變形方法及變形過(guò)程,并且通過(guò)對(duì)變形后的骨架進(jìn)行細(xì)節(jié)還原(細(xì)節(jié)定義為原始網(wǎng)格與骨架之間頂點(diǎn)坐標(biāo)的差)得到變形后的三維網(wǎng)格。網(wǎng)格變形的整個(gè)步驟為:(1)讀取網(wǎng)格M=(2)對(duì)網(wǎng)格進(jìn)行特征重構(gòu)并用等高線進(jìn)行優(yōu)化。(3)編輯骨架。(4)計(jì)算細(xì)節(jié)編輯后的位置和方向,并將其添加到骨架中,得到編輯后的網(wǎng)格。(5)重復(fù)步驟(3)、(4)使網(wǎng)格達(dá)到目標(biāo)變形效果。4.1等高線均值骨架編輯 首先介紹等高線均值骨架的編輯方法,這一步我們借助Unity3d這一三維模型編輯軟件進(jìn)行操作,能夠識(shí)別用C#語(yǔ)言編輯的腳本,易于學(xué)習(xí)、操作簡(jiǎn)單。 我們從最簡(jiǎn)單的編輯方法開(kāi)始,首先選取需要編輯的頂點(diǎn)集,也就是ROI區(qū)域,三維網(wǎng)格模型的坐標(biāo)是三維世界坐標(biāo),把這些坐標(biāo)投影到屏幕上需要進(jìn)行一個(gè)由三維世界坐標(biāo)到二維屏幕坐標(biāo)的轉(zhuǎn)換。選取ROI的步驟為:從屏幕中選取兩個(gè)點(diǎn)R1,R遍歷三維網(wǎng)格的頂點(diǎn),將頂點(diǎn)的坐標(biāo)從世界坐標(biāo)轉(zhuǎn)化為屏幕坐標(biāo)。判斷轉(zhuǎn)換為屏幕坐標(biāo)后頂點(diǎn)是否在矩形R1下面是選取ROI區(qū)域的C#部分代碼:point3=this.transform.TransformPoint(mesh.vertices[i]);point=Camera.main.WorldToScreenPoint(point3);if((point[0]-point1[0])*(point[0]-point2[0])<0&&(point[1]-point1[1])*(point[1]-point2[1])<0){ IndexOfChecked.Add(i); ischecked.Add(1);} else ischecked.Add(0); 其中Camera.main.WorldToScreenPoint()是將世界坐標(biāo)轉(zhuǎn)化為屏幕坐標(biāo)的函數(shù),point是轉(zhuǎn)化后的點(diǎn)的屏幕坐標(biāo),是一個(gè)二維向量,point[0]和point[1]分別表示x、y軸的坐標(biāo),point1、point2分別是圖4-1選取ROI區(qū)域 下一步我們要選取handle區(qū)域,也就是“手柄區(qū)域”,移動(dòng)這個(gè)手柄使得骨架的ROI區(qū)域跟隨handle進(jìn)行變形,這一部分過(guò)程跟選取ROI區(qū)域相同。然后拖動(dòng)handle到目標(biāo)位置,計(jì)算ROI點(diǎn)的位置坐標(biāo)。v(4-1) 其中vi,vi'表示頂點(diǎn)編輯前后的坐標(biāo),vh,vh 如果要使待編輯區(qū)域的頂點(diǎn)的坐標(biāo)位置與handle的目標(biāo)位置的平方成線性關(guān)系,則按照以下公式計(jì)算即可:v(4-2) 下面介紹handle的拖動(dòng)以及位置獲取方法,首先我們?cè)赨nity3d中創(chuàng)建一個(gè)空物體,命名為handle,然后我們就可以通過(guò)腳本獲取這個(gè)物體的位置信息,也可以改變這個(gè)物體的坐標(biāo)位置。確定好handle區(qū)域之后計(jì)算handle內(nèi)頂點(diǎn)的坐標(biāo)平均位置作為handle的初始位置。 然后可以通過(guò)拖動(dòng)這個(gè)空物體的方向軸改變物體的坐標(biāo),如圖:圖4-2改變handle的位置 然后計(jì)算ROI區(qū)域內(nèi)頂點(diǎn)經(jīng)過(guò)編輯后的位置并重新寫(xiě)入模型,刷新模型即可得到編輯好的骨架:圖4-3編輯前后的骨架對(duì)比4.2恢復(fù)網(wǎng)格細(xì)節(jié)編輯好骨架之后需要將網(wǎng)格的細(xì)節(jié)還原回去,在這一步本文借鑒了骨骼蒙皮的算法,只不過(guò)骨骼蒙皮方法是將皮膚與某個(gè)骨骼或關(guān)節(jié)綁定,本文介紹的恢復(fù)細(xì)節(jié)算法是將每個(gè)細(xì)節(jié)與每個(gè)骨架頂點(diǎn)綁定,由于本文把細(xì)節(jié)定義為原始網(wǎng)格與骨架頂點(diǎn)的差值:D=V?S。其中D是由細(xì)節(jié)向量組成的矩陣,V是原始網(wǎng)格的頂點(diǎn)坐標(biāo)矩陣,S是所構(gòu)造的等高線均值骨架的頂點(diǎn)坐標(biāo)。所以不需要花費(fèi)時(shí)間使細(xì)節(jié)向量和原始網(wǎng)格的定點(diǎn)相互對(duì)應(yīng),也就省略了骨骼蒙皮中“綁定”的環(huán)節(jié)。 所以目標(biāo)網(wǎng)格的頂點(diǎn)坐標(biāo)可以通過(guò)公式V'=S'+D本文利用四元數(shù)對(duì)向量進(jìn)行旋轉(zhuǎn),所以需要確定這個(gè)旋轉(zhuǎn)的旋轉(zhuǎn)軸和旋轉(zhuǎn)角度。按照實(shí)際情況可以想到可以令細(xì)節(jié)的旋轉(zhuǎn)過(guò)程與骨架編輯前后法線的旋轉(zhuǎn)過(guò)程相同,那么我們就可以計(jì)算骨架編輯前后的法線,然后計(jì)算法線向量的旋轉(zhuǎn)軸和旋轉(zhuǎn)角度,進(jìn)而構(gòu)造細(xì)節(jié)的旋轉(zhuǎn)四元數(shù)。 設(shè)骨架的法線矩陣為N=(n1,nd(4-3) 其中:pi(4-4) 這里的角度是ni與ncos(4-5) 旋轉(zhuǎn)軸n=(n 但是由于骨架之間頂點(diǎn)的位置差距不大,所以在編輯過(guò)程中法線的變化比較敏感,僅僅移動(dòng)很小的距離法線就會(huì)造成比較大的偏轉(zhuǎn),另外在邊緣點(diǎn)的法線會(huì)比較雜亂。根據(jù)這種方法還原的網(wǎng)格會(huì)產(chǎn)生比較大的錯(cuò)誤。圖4-4骨架經(jīng)過(guò)編輯后部分點(diǎn)的法線偏轉(zhuǎn)角度不規(guī)律 對(duì)于這種情況可以對(duì)法線進(jìn)行優(yōu)化,但是本文從另一種角度,即尋找另一個(gè)向量幫助對(duì)細(xì)節(jié)進(jìn)行旋轉(zhuǎn),這個(gè)向量要能夠體現(xiàn)骨架編輯前后細(xì)節(jié)的偏轉(zhuǎn)角度。由于我們編輯骨架的時(shí)候使用的是最簡(jiǎn)單的編輯方式。即:v(4-6) 這意味著我們是將骨架的ROI按照某一個(gè)頂點(diǎn)區(qū)域整體繞著某一旋轉(zhuǎn)軸旋轉(zhuǎn)了相同的角度,這個(gè)旋轉(zhuǎn)軸就是handle初始位置的坐標(biāo)與ROI邊緣頂點(diǎn)的差與handle目標(biāo)位置的坐標(biāo)與ROI邊緣頂點(diǎn)的差的差乘,即:n=(4-7)旋轉(zhuǎn)的角度則是向量vh?v那么經(jīng)過(guò)還原后網(wǎng)格頂點(diǎn)的位置為:v(4-8)其中si和s圖4-5網(wǎng)格撕裂 本文參考骨骼蒙皮算法的優(yōu)化思路,可以使網(wǎng)格的“皮膚”不僅綁定在ROI區(qū)域,也讓細(xì)節(jié)向量的旋轉(zhuǎn)受固定部分(非ROI區(qū)域)的影響,給每一個(gè)細(xì)節(jié)向量一個(gè)分配一個(gè)權(quán)重,最終細(xì)節(jié)向量的旋轉(zhuǎn)是固定部分旋轉(zhuǎn)量和ROI區(qū)域旋轉(zhuǎn)量的加權(quán)平均。實(shí)際上固定部分并不發(fā)生旋轉(zhuǎn),所以最后的旋轉(zhuǎn)角度實(shí)際上是從0到θ的插值。 也就是說(shuō)靠近ROI邊緣部分的細(xì)節(jié)向量的旋轉(zhuǎn)角度滿足:θ(4-9) 其中?max實(shí)驗(yàn)結(jié)果:圖4-6不同角度下胳膊原始網(wǎng)格(左一)與編輯后的網(wǎng)格(中間、右一)對(duì)比圖4-7網(wǎng)格變形前后整體對(duì)比 我們可以看到,經(jīng)過(guò)優(yōu)化后的算法ROI邊緣部分的基本不會(huì)產(chǎn)生較大的撕裂。而且從整體來(lái)看變形后的三維網(wǎng)格保證了視覺(jué)合理性。 整個(gè)細(xì)節(jié)恢復(fù)的算法為:計(jì)算原始網(wǎng)格和骨架的差,也就是細(xì)節(jié)向量:D=VM?計(jì)算細(xì)節(jié)的偏轉(zhuǎn)角度和旋轉(zhuǎn)軸構(gòu)造每個(gè)頂點(diǎn)對(duì)應(yīng)的細(xì)節(jié)的旋轉(zhuǎn)四元數(shù),靠近ROI邊緣的部分點(diǎn)的旋轉(zhuǎn)角度取0到θ之間的插值利用四元數(shù)對(duì)細(xì)節(jié)進(jìn)行旋轉(zhuǎn)將旋轉(zhuǎn)后細(xì)節(jié)添加到變形后的等高線骨架上得到變形后的三維網(wǎng)格4.3實(shí)驗(yàn)操作及結(jié)果分析本文基于unity3d構(gòu)造了一個(gè)簡(jiǎn)單的交互系統(tǒng)。下面給出該系統(tǒng)的創(chuàng)建過(guò)程: 第一步:創(chuàng)建兩個(gè)空物體,并將其命名為Mesh和Skeleton,表示網(wǎng)格和骨架、另外再創(chuàng)建一個(gè)空物體命名為Handle,表示選定的handle區(qū)域。 第二步:在unity3d的MainCamera(主攝像機(jī))上添加腳本Move.cs,用該腳本控制網(wǎng)格模型的移動(dòng)和旋轉(zhuǎn)縮放等查看操作,并且另寫(xiě)一個(gè)腳本Mouse.cs用于獲取鼠標(biāo)的位置,以及腳本Draw.cs用于畫(huà)選擇框的操作。 Draw.cs利用鼠標(biāo)交互獲取鼠標(biāo)按下和抬起狀態(tài),并從Mouse.cs中獲取此時(shí)候鼠標(biāo)的位置,利用畫(huà)矩形的算法畫(huà)出以鼠標(biāo)按下點(diǎn)和抬起點(diǎn)為對(duì)角線的矩形,并將這兩個(gè)點(diǎn)記錄下來(lái)。 第三步:在Mesh和Skeleton上分別掛一個(gè)腳本,該腳本用于改寫(xiě)網(wǎng)格的頂點(diǎn)位置以及網(wǎng)格模型的重置。 在Skeleton.cs腳本中:首先根據(jù)骨架的地址讀取骨架網(wǎng)格,并將網(wǎng)格顯示到屏幕上,然后根據(jù)Draw.cs提供的鼠標(biāo)坐標(biāo)位置選擇ROI區(qū)域和Handle區(qū)域,并記錄下來(lái)。然后將Handle區(qū)域的的平均坐標(biāo)位置傳給handle.cs(handle.cs掛到Handle上)。然后Skeleton.cs實(shí)時(shí)獲取handle的位置,按照公式(4-1)并對(duì)網(wǎng)格進(jìn)行修改編輯。 在Mesh.cs中:同樣首先獲取原始網(wǎng)格的位置,然后計(jì)算出細(xì)節(jié)矩陣。并根據(jù)Sketeton中ROI區(qū)域前后變化的位置實(shí)時(shí)計(jì)算出每個(gè)細(xì)節(jié)的旋轉(zhuǎn)四元數(shù),并且用該四元數(shù)對(duì)細(xì)節(jié)進(jìn)行旋轉(zhuǎn)并添加回骨架網(wǎng)格得到變形后的網(wǎng)格坐標(biāo)并實(shí)時(shí)更新。 第四步:在Handle中添加腳本Handle.cs用于記錄Handle的實(shí)時(shí)位置坐標(biāo)以及根據(jù)Skeleton.cs提供的Handle目標(biāo)位置坐標(biāo)對(duì)Handle的位置進(jìn)行修改。 以上是創(chuàng)建系統(tǒng)的大致過(guò)程,下面介紹該系統(tǒng)的使用過(guò)程: 第一步:將所需要的資源(原始網(wǎng)格、等高線骨架)放入unity工程的資源文件圖4-7unity3d項(xiàng)目的資源存放位置 第二步:將Skeleton.cs和Mesh.cs腳本中原始網(wǎng)格和骨架的目錄改為相應(yīng)的目錄。 第三步:在運(yùn)行開(kāi)始后,需要先選擇骨架的ROI區(qū)域和Handle區(qū)域,所以在運(yùn)行開(kāi)始之前,先隱藏原始網(wǎng)格模型,隱藏后的模型上面掛載的腳本不會(huì)運(yùn)行。圖4-8隱藏Mesh網(wǎng)格模型 第四步:運(yùn)行unity程序,分別選擇ROI區(qū)域和Handle區(qū)域。圖4-9選擇ROI區(qū)域及Handle區(qū)域 第五步:將隱藏的原始網(wǎng)格恢復(fù)顯示。并且拖動(dòng)handle對(duì)網(wǎng)格進(jìn)行實(shí)時(shí)交互式變形圖4-10拖動(dòng)Handle(在網(wǎng)格模型右手附近)進(jìn)行變形下面展示幾組實(shí)驗(yàn)結(jié)果圖:表4-1實(shí)驗(yàn)結(jié)果對(duì)照表原始圖像變形后角度一變形后角度二第一個(gè)模型的手臂變化和下肢變化基本不會(huì)在ROI邊緣區(qū)域出現(xiàn)較大的斷層和不平滑現(xiàn)象。第二個(gè)模型由于手臂和下肢部分比較平滑,且網(wǎng)格的頂點(diǎn)比較稀疏,所以在大角度網(wǎng)格變形時(shí)難免出現(xiàn)一定的不平衡現(xiàn)象。最后一個(gè)模型馬的頭部偏轉(zhuǎn)也取得了良好的效果,基本能夠還原模型的細(xì)節(jié)和形態(tài)。從實(shí)驗(yàn)結(jié)果可以看到變形的效果基本可以達(dá)到的預(yù)期,但是不可避免的存在ROI邊緣部分不平衡的現(xiàn)象。4.4實(shí)驗(yàn)環(huán)境及配置操作系統(tǒng)采用windows10家庭版構(gòu)造等高線均值骨架采用c++語(yǔ)言,使用的IDE是VisualStudio2017Professional,可在微軟官網(wǎng)下載。目前已更新到VisualStudio2019。使用了c++第三方圖形庫(kù)Libigl,網(wǎng)址:https://libigl.github.io/,可以從網(wǎng)上找到安裝教程。編譯libigl使用Cmake3.16.0。編譯過(guò)程中要注意版本的兼容性問(wèn)題,版本不對(duì)應(yīng)可能會(huì)出現(xiàn)編譯不成功。在解特征矩陣的時(shí)候需要用到Matlab,本人使用的是Matlab2017a。對(duì)特征骨架的編輯主要在Unity3d內(nèi)完成,對(duì)版本沒(méi)有特別的要求,本文實(shí)驗(yàn)用到的版本編號(hào)是2018.4.22f1第五章總結(jié)和展望 雖然基于等高線均值骨架的三維網(wǎng)格編輯基本完成,但是仍然有不完善的地方:1)在大角度變形會(huì)增加靠近邊緣部分的網(wǎng)格的不平滑,如圖圖5-1大角度變形時(shí)ROI邊緣區(qū)域不平滑現(xiàn)象2)只按照最簡(jiǎn)單的變形公式做了骨架編輯,并且后續(xù)的變形都是基于這一編輯,如果使用公式:v(5-1)或v(5-2)等公式對(duì)骨架進(jìn)行非線性的變形,那么網(wǎng)格的還原方式可能會(huì)失效,因?yàn)榇藭r(shí),每個(gè)細(xì)節(jié)的旋轉(zhuǎn)軸和旋轉(zhuǎn)角度不再與整體的旋轉(zhuǎn)軸和旋轉(zhuǎn)角度相等。 對(duì)于第一個(gè)問(wèn)題,我們可以使用網(wǎng)格平滑算法對(duì)網(wǎng)格進(jìn)行平滑,常見(jiàn)的三維網(wǎng)格平滑算法是拉普拉斯平滑。這個(gè)算法的思想是將每個(gè)點(diǎn)的坐標(biāo)移動(dòng)到這個(gè)點(diǎn)相鄰頂點(diǎn)的平均位置,這個(gè)平滑算法有很多改進(jìn)方式,其中一種就是改變各鄰接點(diǎn)的平均權(quán)重。給每一個(gè)鄰接點(diǎn)賦權(quán)后在進(jìn)行平均操作。比如采用余切權(quán)重等。由于我們?cè)龠M(jìn)行圖信號(hào)分解重構(gòu)的過(guò)程中已經(jīng)構(gòu)造了圖的余切權(quán)重拉普拉斯矩陣,所以平滑后的點(diǎn)的坐標(biāo)可以寫(xiě)為:V(5-3) 其中N是頂點(diǎn)Vi的一鄰域點(diǎn)的集合,L?,j是拉普拉斯矩陣的第?行,第 除了拉普拉斯平滑,我們還可以借鑒基于多分辨率的網(wǎng)格編輯的思想,把我們已經(jīng)變形好的網(wǎng)格作為“猜測(cè)位置”。通過(guò)解一個(gè)能量最小化方程V(5-4)使變形前后的微分坐標(biāo)整體保持一致,這樣也可以達(dá)到平滑網(wǎng)格的目的。 對(duì)于第二個(gè)問(wèn)題。我們?cè)跇?gòu)造等高線均值骨架的時(shí)候,使tu(5-5) 根據(jù)圖信號(hào)重構(gòu)的公式:V=(5-6) 重構(gòu)后每一組等高線內(nèi)的所有點(diǎn)的坐標(biāo)值會(huì)相等,也就是說(shuō)每組等高線對(duì)應(yīng)的點(diǎn)會(huì)坍縮于一點(diǎn)記為vGroupi。我們把這一點(diǎn)與下一組等高線對(duì)應(yīng)點(diǎn)vk(5-7) 不難理解,網(wǎng)格變形前后要保持向量ki與第i組內(nèi)細(xì)節(jié)向量的角度一致。換句話說(shuō)如果我們得到骨架編輯前后ki與ki'的旋轉(zhuǎn)軸和旋轉(zhuǎn)向量,就可以構(gòu)造v其中:

pn=θ=arc

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論