2009-10-03 113 views
4

我有一些球形經度/緯度座標,用於需要形象化的球體上的點。爲此,我將點轉換爲笛卡爾座標,並構建了一個可以用VTK渲染的三角形網格。迄今爲止工作。球體上的紋理錯誤

現在我想使用球體模型的紋理。因此我將球形座標轉換爲紋理座標並將其分配給每個點。這適用於球體的大部分表面三角形,並且結果看起來可以接受。

但是,對於素數子午線對面紋理包裹的三角形,三角形被錯誤地紋理化:不是重複紋理和映射「越過紋理邊界」,整個紋理被擠壓到單個三角形。

這裏是它的外觀像一個畫面:

sphere-texture

的濟科,扎克線顯然是錯誤的,藍線應該是可見的,而不是。整個紋理映射到三角形上,產生紅色和白色條紋。這是有道理的,因爲對於所討論的三角形,紋理座標跨越整個紋理空間。

爲了說明這個問題,這是不特定的領域,但所有封閉的對象,我創建瞭如下圖所示:

texture-seam

在上面的矩形,我們看到,橫跨紋理三角形計算出的紋理座標A,B和C的邊界。由於紋理可以平鋪,這就是我想要渲染三角形的方式。

下面的三角形顯示當前如何解釋紋理座標。邊A,B和C的座標是相同的,但是這一次,大部分紋理用於三角形,而不是在邊界處平鋪紋理。

我相信我有一個很常見的錯誤,但我沒有找到任何幫助我的東西。對我有任何提示嗎?

+0

在過去的一天左右,我一直在爲此苦苦掙扎,主要是在檢測哪些面有錯誤。結果發現錯誤的面具有反時鐘順序的紋理座標。 – 2011-12-07 21:00:29

回答

5

答案很簡單,您需要將紋理座標映射到邊緣。實現取決於你的數據集,但這是一個刺探問題。

在計算機圖形中,紋理座標存儲在面上而不是頂點上,並且問題顯示原因。當你圍繞一個球體繪製紋理時,讓我們從0.0開始的10個步驟中說,然後以0.1爲增量繼續。如果沿着素數子午線使用紋理座標,則會得到紋理座標爲0.9和0.0的面。圖形硬件完成它所說的內容,並在0.0和0.9之間插入紋理。

要解決您的問題,您需要將紋理從0.9映射到1.0。

如果可以,可以使用這種方法創建多邊形或使用其他紋理座標複製違規頂點。

+0

複製一些頂點似乎是迄今爲止最實際的解決方案 - 我會嘗試一下。感謝提示。 – 2009-10-05 13:27:56

+0

您可否詳細說明「以這種方式創建多邊形?」我明白爲什麼會發生這種情況,但似乎不得不創建一排退化的面孔來修復接縫。 – 2011-10-16 17:20:20

+0

您不是創建退化的面,面是好的,只是得到具有紋理座標0.0和1.0的重複頂點。如果您依賴連接信息,這是一個問題,但渲染和網格操縱是兩回事。 – rioki 2011-11-01 13:49:35

2

首先,您可能不希望僅將球形座標映射到覆蓋球體的單個矩形紋理,因爲紋理分辨率在表面上變得非常不均勻。

更好的方法是使用地圖集。 「地圖集」是將表面參數化爲多個「圖表」,每個「圖表」都是連接區域。例如,您可以將球體映射到大致6個與立方體邊相對應的圖表,並且每個圖表都會更好地保留球體部分的形狀。你可以谷歌多圖參數化或類似的東西。如果你想要走這條路線,DirectX已經建立在UVAtlas世代。由於三角形總是位於一個圖表內,所以在圖表之間的接縫處做什麼的問題實際上更簡單,並且完全是另一個問題。這就是說,爲了處理你的案例中的接縫,你需要知道(球形)網格的哪個三角形邊緣與邊界(子午線或其他)相交。然後,您必須將這些邊緣上的三角形分解爲不跨越邊界的碎片,並正確應用紋理座標。

+0

感謝您爲介紹地圖集方法所做的努力。事實上,我想讓事情變得簡單,因爲我只需要將數據可視化,而且我不開發遊戲或類似的東西。我現在意識到我必須調整幾何形狀才能擺脫接縫,我會提出你的答案來指出這一點。 – 2009-10-05 13:26:56

1

回覆一個非常古老的問題,因爲我認爲有一個更簡單的答案,使用vtk的內置方法vtkSphereSource

您希望「打破」球體,以便在球體周圍的0.9和0.0之間不會獲得紋理插值。在python中,調用sphere.SetEndTheta(360 - 1.e-4),這實際上會從球體中取出一小塊。這樣就可以爲紋理提供最終的一組頂點,一直映射到1.0。