2011-01-30 97 views
1

因此,我在Ogre3D中創建了一個模型,並且此模型由許多任意旋轉和位置的三角形組成。我想像許多建模程序那樣「解開」模型,以便所有的三角形都映射到2d(x,y),但三角形的尺寸是保持不變的。這是應用貼花。三角形尺寸的原因必須保持,以便紋理應用時不存在任何拉伸。從3D到2D空間展開多邊形(使用三角形)用於紋理座標

這是我在考慮去的方向,但我有麻煩可視化,並實現正確的算法:

//Verticies will have a converted bool; 

func(triangle x): 
    for each of x's vertices: 
      map to x,y coordinates if not converted; 
      check other triangles for common vertex if so call func(common_tri); 

一旦返回會有所有的三角形,這樣的改裝版他們都解開並放置在紋理上,我遇到麻煩的是映射到x,y空間。我不知道如何在三維空間中獲取三維空間到二維空間,以便保持其所有屬性(如從傾斜視圖轉到表面的透視視圖)。任何幫助都將不勝感激。

+0

如果沒有人能回答你,你可能想檢查攪拌機的來源,uv unwrapping必須在*某處*。 https://svn.blender.org/svnroot/bf-blender/trunk/blender/ – 2011-01-30 20:21:25

回答

0

我會想到頂點作爲矢量。因此,您可以對每個矢量進行歸一化,然後移除Z座標,然後再次應用乘法。 即三= VEC1,VEC2,VEC3, vec1Length = vec1.getLength() newVec1 = vec1.normalize()* vec1Length

由於這將保留矢量的大小,但它們映射到二維平面上。 (或者它應該,我不是100%,這在數學上是正確的)。

另一種方式,你可以做到這一點,是通過將三角形本身看作一個二維平面,然後從這個三角形轉換矢量當地空間到世界空間的第二架飛機。

因此,例如,世界座標系原點爲(0,0,0)

三角形本身是由三個點定義一個平面,你用一個向量作爲X座標,找到垂直於向量,你定義了y座標。你也可以用X交叉積Y來定義Z,這會給你一個來自世界原點的「偏移量」,然後你可以將它們映射回來自世界原點的X,Y向量所反映的二維平面上(即(1 ,0)和(0,1))。在很多基本的計算機圖形學書籍中應該有這樣的數學方法。