2014-03-31 44 views
0

我寫了幾個函數來生成一些我需要的管形網格。但是,當我對其應用紋理時,紋理沿Z軸向下延伸。當應用於網格時紋理拉伸而不是平鋪?

所以我寫了一個更簡單的演示,其中包含6個頂點和4個三角形。它基本上是立方體的兩面,連在一邊。紋理重視我在X,Y平面上存在的方向,但在X,Z平面上,紋理伸展而不是平鋪。

的結果是這樣的:

enter image description here

在後面的廣場上有正確的紋理(這是一個白色的背景,在每個角落的彩色方塊)。左邊的正方形頂部有一條奇怪的紫色條紋,底部有一條綠色條紋。由於紫色不在原始紋理中,我假設它以某種方式在紋理或其他物體上進行平均。

我確定這個問題是相當基礎的,但我對Unity非常陌生。提前致謝!

產生這是代碼:

void textureTest(){ 

    Vector3[] vertices = new Vector3[6]; 

    vertices [0] = new Vector3 (0,0,0); 
    vertices [1] = new Vector3 (1,0,0); 
    vertices [2] = new Vector3 (0,-1,0); 
    vertices [3] = new Vector3 (1,-1,0); 

    vertices [4] = new Vector3 (0,0,-1); 
    vertices [5] = new Vector3 (0,-1,-1); 

    GameObject newTunnel = new GameObject ("TextureTest"); 
    Mesh newMesh = new Mesh(); 
    newTunnel.AddComponent<MeshFilter>(); 
    newTunnel.AddComponent<MeshRenderer>(); 

    newMesh.vertices = vertices; 

    Vector2[] uvs = new Vector2[newMesh.vertices.Length]; 
    for (int i = 0; i < uvs.Length; i++) { 
     uvs [i] = new Vector2 (newMesh.vertices [i].x, newMesh.vertices [i].y); 
    } 
    newMesh.uv = uvs; 

    int[] triangles = new int[]{0,1,2,3,2,1,5,4,0,2,5,0}; 

    newMesh.triangles = triangles; 

    newMesh.RecalculateNormals(); 

    newTunnel.GetComponent<MeshFilter>().mesh = newMesh; 

    if (blockMaterial) { 
     newTunnel.renderer.material = blockMaterial; 
    } 

    newTunnel.AddComponent<MeshCollider>(); 

} 

編輯:我使用貼圖就在這裏。我添加它是因爲屏幕截圖有點黑。

enter image description here

回答

1

此代碼:

Vector2[] uvs = new Vector2[newMesh.vertices.Length]; 
for (int i = 0; i < uvs.Length; i++) { 
    uvs [i] = new Vector2 (newMesh.vertices [i].x, newMesh.vertices [i].y); 
} 
newMesh.uv = uvs; 

等效於此:

Vector2[] uvs = new Vector2[6]; 
uvs[0] = new Vector2(0,0); 
uvs[1] = new Vector2(1,0); 
uvs[2] = new Vector2(0,-1); 
uvs[3] = new Vector2(1,-1); 
uvs[4] = new Vector2(0,0); 
uvs[5] = new Vector2(0,-1); 
newMesh.uv = uvs; 

的UV座標左邊的正方形是(0,0),(0, -1),(0,0),(0,-1)。所以它是沿紋理的右邊界的0像素寬的垂直條。插值得到平均值(紅色,藍色)=>(紫色)和平均值(綠色,黃色)=>(綠黃色)。

試試這個:

Vector2[] uvs = new Vector2[6]; 
uvs[0] = new Vector2(0,0); 
uvs[1] = new Vector2(1,0); 
uvs[2] = new Vector2(0,-1); 
uvs[3] = new Vector2(1,-1); 
uvs[4] = new Vector2(-1,0); 
uvs[5] = new Vector2(-1,-1); 
newMesh.uv = uvs; 

你的困惑是因爲你與關聯世界位置的UV座標。不要這樣做。改用頂點索引。例如,訂購您的三角形帶的頂點是這樣的:

0 - 2 - 4 - 6 - 8 
|/|/|/|/| 
1 - 3 - 5 - 7 - 9 

頂點集UV座標我到(i/2, i % 2)

組三角形來(0,1,2),(1,2,3),(2,3,4),(3,4,5),...

如果你想管那環繞,只要確保讓最後兩個三角形引用兩個頂點,就像這樣:

0 - 2 - 4 - 6 - 0 
|/|/|/|/| 
1 - 3 - 5 - 7 - 1 
+0

這做到了!非常感謝!我顯然需要閱讀如何紫外線的工作,因爲我不完全*爲什麼*的作品。再次感謝! – kidl33t

+0

@ kidl33t我剛剛編輯了一些更多解釋的答案。 –

+0

我現在看到!再次感謝您的及時回覆。我一直試圖弄清楚這個好幾個小時! – kidl33t