应用于网格时纹理拉伸而不是平铺?

时间:2014-03-31 22:00:21

标签: c# unity3d textures mesh

我写了几个函数来生成我需要的一些管状网格。然而,当我对其应用纹理时,纹理会沿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 个答案:

答案 0 :(得分: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>像素宽的垂直条带和纹理的右边界。插值产生平均(红色,蓝色)=&gt; (紫色)和平均(绿色,黄色)=&gt; (黄绿色)。

请改为尝试:

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

将顶点i的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