一種三維仿真中服裝搭配穿透問題解決方法與流程
2023-10-08 10:07:19 1

本發明涉及三維仿真技術領域,特別是涉及一種Unity3D環境下的服裝仿真穿透問題解決方法。
背景技術:
服裝仿真是三維仿真技術領域中一個重要的技術方向。隨著虛擬實境技術和服裝電子商務的快速發展,更真實、更高效的服裝仿真技術能夠提供客戶更加真實的服裝購買體驗。目前主流的服裝仿真技術有彈簧質點模型、骨骼蒙皮等。這些技術能夠很好的解決服裝在物理和動作環境中的服裝狀態問題,但是服裝模型的不均勻會產生服裝搭配之間多件服裝之間的網格穿透問題。
多件服裝之間的網格穿透會導致服裝仿真效果不真實,影響仿真效果。傳統解決服裝穿透問題大多採用遞歸查找和射線求交的方法。這些方法能夠求出兩個服裝網格之間的相交網格,但計算量很大不適用於移動端。
技術實現要素:
為了克服上述現有技術的不足,本發明提供了一種三維仿真中服裝搭配穿透問題的解決方法。本發明旨在通過較低計算量來解決多件服裝之間搭配時的網格穿透問題,使服裝仿真更加真實。
本發明所採用的技術方案是:
一種三維服裝搭配穿透問題解決方法,包括Unity 3D環境下局部透明著色器、服裝模型重疊部分計算及透明方法。
其中,Unity 3D環境下局部透明著色器部分,其特徵在於,包含:
通過Unity 3D下ShaderLab語言編寫局部透明著色器。該著色器能夠通過一張帶有特定透明通道的貼圖,將該貼圖映射至模型UV空間,再通過Shader渲染,使得模型中由貼圖透明通道為0的部分透明,實現模型局部透明效果。由於Unity 3D中具有透明通道的著色器渲染時會產生深度錯誤,所以本發明通過使用不同的pass,達到深度測試的正常化。具體實現方法如下:
1、通過多通道語言結構來人為控制渲染順序。2、採用雙pass的渲染順序來實現控制渲染順序:第一個pass實現對back部分網格的渲染,同時疊加透明通道。第二個pass實現對front部分網格的渲染,同時疊加透明通道。
對於,服裝模型重疊部分計算及透明方法,其特徵在於,包含:
本發明提出的方法針對不同的服裝類型和不同的服裝層次做出不同的處理方法,達到的最優效果。對於同時穿上上衣和褲子的情況,上衣的穿戴層次較褲子大,所以需要處理褲子穿透上衣部分的網格。這一部分的處理方法如下:
首先查找到上衣下邊緣的邊緣最高點。由於服裝邊緣是不規則的曲線,且服裝面片具有不連續性,要查找到邊緣最高點不能使用傳統找邊緣的方法來尋找邊緣最高點。本發明使用按角度切割,查找角度最低點的方法查找到近似的邊緣最高點。按角度切割面片首先需要將面片中的頂點坐標由笛卡爾坐標系轉換為極坐標系,再由極坐標系中按角度進行分割。笛卡爾坐標系轉換為極坐標系中需要進行轉換計算,將原坐標系中轉換為 ,極坐標中極坐標中,xoz平面中的半徑值,值為xoz平面中的角度值。轉化公式為:
轉化後在極坐標空間中,通過判斷一個角度範圍 中的y 值,找到該範圍中的最小值,當前的值為局部最小值。找到所有範圍中的值 ,求出所有的最大值,即可求出對應的上衣下邊緣的最大值的逼近值。
上述判斷一個角度範圍。由於服裝網格布局具有不確定性,每一個角度範圍的局部最小值不一定是服裝的下邊緣頂點值。為了保證查找算法的魯棒性,本發明專利提出了一個經驗值,即在每60度角度中查找局部最小值。找到下邊緣的最大值的逼近值後,需要求出褲子被上衣遮住的部分網格。將之前查找出的上衣最大值的逼近值,求出褲子網格中高於該值的面片,同時記錄三角面片中的三個頂點的UV坐標值。為避免覆蓋部分網格穿透,本發明提出將被覆蓋網格透明化處理的思路,由於穿透的網格透明度為0,所以避免了褲子網格穿透遮住了上衣網格。
上述將褲子模型被覆蓋網格透明化處理,通過計算被覆蓋網格UV空間所對應的貼圖方位透明通道置零實現。通過三角形向量計算算法,計算出被覆蓋的網格UV空間對應的區域。
上述計算被覆蓋網格UV空間,其方法為:
當找到褲子被上衣覆蓋的頂點之後,查找對應的點的UV空間坐標。將這部分頂點視為一個點集,同時這部分點在UV空間中所映射點所包圍的若干區域視為待透明區域。將三角頂點映射至UV空間,並將在UV空間中的坐標值擴展至二維透明貼圖空間。即 ,W為透明貼圖寬度,H為透明貼圖高度。將三角面片中三個點在透明貼圖空間求出最小包圍盒,求出包圍盒中所有貼圖像素是否在三角形內。如果在三角形內則透明化,如果不在則不透明。將所有在三角面片中的點視為一個集合,該集合就是上述透明貼圖中的透明區域。對於同時穿上上衣和褲子的情況,當褲子穿戴層次較上衣大,上衣穿透褲子部分網格。這一部分的處理方法如下:
首先查找到褲子上邊緣最低點,其方法為:
轉換褲子網格頂點的笛卡爾坐標系至三維極坐標系。將笛卡爾坐標系中 ,轉換為 ,給定一個角度區間將面片進行切分,在該角度區間中找到局部高度最大值。將按照角度切分的網格局部高度最大值集合求出該集合中的最小值,將該值視為褲子上邊緣的逼近最小值,將逼近最小值作為參數,將衣服模型網格中低於該值的所有面片視為一個集合。由於衣服網格較為複雜,所以需要進行面片過濾,將除服裝軀幹部分網格過濾。
上述所說面片過濾計算,其方法為:1、區分子網格。如果一個三角形與另一個三角形有兩個頂點索引值相同,這認為兩個三角形相連,求出兩個三角面片組成的小網格的包圍盒。2、網格過濾。求出所有相連的三角面片,可以組成若干個較大的三角網格,同時求出該網格的矩形包圍盒。對比矩形包圍盒中心點,根據服裝模型軀幹中心經驗值進行過濾得到軀幹部分網格。
上述服裝模型軀幹中心經驗值,本發明提出為0.2。根據Unity 3D中單位轉換,該值為20dm。將三角頂點映射至UV空間,並將在UV空間中的坐標值擴展至二維透明貼圖空間。即 ,W為透明貼圖寬度,H為透明貼圖高度。計算出三角面片在透明貼圖空間中的矩形包圍盒。通過三角形向量計算算法,對比矩形包圍盒中每一個像素點是否在三角形中,若點在三角形中則透明化如果不在則不透明。
上述計算貼圖像素是否在三角形內,採用三角形向量計算算法,其方法為:求出點P與三角形一點A的向量AP,與該點和其他三角形頂點B,C 的向量 ,如果所得向量在同一方向,返回為真。分別求出是否在同一邊,以及所得結果是否在同一邊,如果三次計算都在同一邊,認定該點在三角形中。
與現有技術相比,本發明的有益效果是:1、計算模型之間相交部分的計算量與計算時間,能夠很好的適用於手機等計算能力較低的移動端。2、將透明部分的渲染交給gpu渲染,提高整個方法的效率。3、採用包圍盒計算方法,極大減少計算量。4、在視覺上,減少服裝層次之間的面片穿透,提高用戶體驗。
附圖說明
圖1為服裝搭配穿透問題解決方案流程簡圖。
圖2為服裝搭配穿透問題解決方法流程圖。
圖3為褲子模型層次比衣服模型大的情況。
圖4為衣服模型層次比褲子模型大的情況。
圖5為上衣模型過濾示意圖。
具體實施方式
為了使本發明實現的技術手段、創作特徵、達成目的與功效易於明白了解,下面進一步闡述本發明。
本發明效果基於Unity 3D遊戲引擎實現。Unity3D遊戲引擎以其快速開發能力被眾多遊戲開發者接受,同時Unity 3D基於3D計算引擎OpenGL等,適合虛擬仿真、虛擬實境等應用開發,也適合3D圖形學、3D計算機仿真等實驗開發。
本發明中所提到的算法分為上衣層次高於褲子、褲子層次高於上衣兩方面對服裝上下衣的穿透進行處理。如圖1所示,圖1表示本發明所提出的服裝穿透解決方法。在輸入上衣和褲子模型後,確定兩個模型所在的層次關係,如果上衣層次較褲子層次高,則上衣模型在顯示時需要覆蓋褲子模型,則需要確定褲子模型的透明區域。如果褲子層次較上衣層次高,則褲子模型在顯示時需要部分覆蓋上衣模型,則需要確定上衣模型的透明區域。當上衣層次較褲子層次高時:首先初始化網格模型,通過Unity 3D接口獲取到上衣模型網格頂點數據,和褲子模型網格頂點數據。當初始化模型數據完成後,先通過坐標轉化公式將上衣頂點坐標所對應的笛卡爾坐標系,轉換為極坐標系。由於Unity 3D中坐標係為右手系,所以轉換為極坐標系的平面為XOZ平面。將原笛卡爾坐標系中 ,x,z值轉化為極坐標系。坐標系轉換公式如下:
在轉換後坐標系中,代表該點與中心軸連接的向量與x軸所成角度夾角,代表點離中心點的半徑。通過對頂點進行角度劃分就能找到在同一角度下的頂點的集合。找到同一角度範圍中的頂點的集合就能實現將網格豎直分割,從而避免服裝的複雜性。
轉化後在極坐標空間中,通過判斷一個角度範圍中的值,找到該範圍中的最小值,當前的值為局部最小值。由於不同服裝模型網格布局的複雜性,往往查找的最小值是衣服下邊緣的頂點最小值。為了提高本發明中提出的查找最低點算法的魯棒性,本發明中提供一個角度經驗值。即在每的角度空間中查找一個最小值。通過遍歷一個圓周中所有的角度範圍,找到所有範圍中的值,求出所有的最大值,即可求出對應的上衣下邊緣的最大值的逼近值,該值接近於衣服下邊緣的最大值。
查找到上衣下邊緣的最大值的逼近值後,需要求出褲子被上衣遮住的部分網格。首先將初始化所得到的褲子模型網格數據獲取,通過遍歷與上衣下邊緣的值進行對比,查找空間坐標系中y值到高於的所有褲子網格面片,將所有的查找的面片視為同一集合,同時記錄所有頂點的UV坐標值。
將查找到的面片集合中的頂點所對應的UV空間中的坐標值擴展至透明貼圖空間中,W為透明貼圖的寬度值,H為透明貼圖的高度值。擴展函數為:。找到不同模型頂點所對應的貼圖空間坐標值後,將單個面片的三個頂點在貼圖空間中的坐標值記錄,並查找到三角面片的x最大值 最小值 ,y的最大 最小值 ,通過這四個值構建三角形的矩形包圍盒 ,。w為包圍盒的寬,h為包圍盒的高。遍歷該包圍盒中所有像素值,判斷是否在三角形中。
本發明專利使用三角形向量算法求出像素值是否在三角面片映射在透明貼圖的二維三角形中。首先遍歷包圍盒中所有像素點,假設有像素點P,求出點P與三角形一點A的向量AP,與該點和其他三角形頂點B,C 的向量 ,如果所得向量在同一方向,返回為真。分別求出是否在同一邊,以及所得結果是否在同一邊,如果三次計算都在同一邊,認定該點在三角形中。
將計算在三角形中的每個像素點所在的透明通道值設為0。將所有被遮蓋的三角形所對應的UV空間中的透明通道設為0。在渲染時將被遮蓋三角形網格透明化,即可避免褲子網格穿透上衣網格。
當褲子模型層次高於上衣層次時:首先初始化網格模型,通過unity3D接口獲取到褲子、上衣網格模型的頂點和面片數據。
將上述獲取的褲子面片數據獲取後,首先將面片默認的笛卡爾坐標系轉化成極坐標系。將笛卡爾坐標系中,轉換為,給定一個角度區間將面片進行切分,在該角度區間中找到局部高度最大值。將按照角度切分的網格局部高度最大值集合求出該集合中的最小值,將該值視為褲子上邊緣的逼近最小值。將最小值的逼近值作為參數將衣服模型網格中低於該值的所有面片視為一個集合。之後將這個點面集合中除軀幹部分網格進行過濾。
上述所說的面片過濾計算,其流程為:1、區分子網格。如果一個三角形與另一個三角形有兩個頂點索引值相同,這認為兩個三角形相連。求出兩個三角面片組成的小網格的包圍盒。2、網格過濾。求出所有相連的三角面片,可以組成若干個較大的三角網格,同時求出該網格的矩形包圍盒。對比矩形包圍盒中心點,根據服裝模型軀幹中心經驗值進行過濾得到軀幹部分網格。
上述服裝模型軀幹中心經驗值,本發明提出為0.2。根據Unity 3D中單位轉換,該值為20dm。將查找到的面片集合中的頂點所對應的UV空間中的坐標值[0,1]擴展至透明貼圖空間中 ,W為透明貼圖的寬度值,H為透明貼圖的高度值。擴展函數為: 找到不同模型頂點所對應的貼圖空間坐標值後,將單個面片的三個頂點在貼圖空間中的坐標值記錄,並查找到三角面片的x最大值最小值,y的最大值最小值,通過這四個值構建三角形的矩形包圍盒,。w為包圍盒的寬,h為包圍盒的高。遍歷該包圍盒中所有像素值,判斷是否在三角形中。
通過上述三角形向量計算算法,對比矩形包圍盒中每一個像素點是否在三角形中,若點在三角形中則透明化如果不在則不透明。