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

C# 应用于网格时,纹理拉伸而不是平铺?,c#,unity3d,textures,mesh,C#,Unity3d,Textures,Mesh,我编写了几个函数来生成我需要的管状网格。但是,当我对其应用纹理时,纹理沿Z轴向下延伸 所以我编写了一个更简单的演示,它包含6个顶点和4个三角形。它基本上是一个立方体的两面,附在一边。纹理以我所期望的方式附着在X,Y平面中存在的一侧,但在X,Z平面中的一侧,纹理拉伸而不是平铺 结果是: 背面的正方形具有正确的纹理(白色背景,每个角落都有彩色正方形)。左边的正方形顶部有一条奇怪的紫色条纹,底部有一条绿色条纹。因为紫色不在原始纹理中,所以我假设它在纹理中以某种方式平均 我相信这是一个相当基本的问题,

我编写了几个函数来生成我需要的管状网格。但是,当我对其应用纹理时,纹理沿Z轴向下延伸

所以我编写了一个更简单的演示,它包含6个顶点和4个三角形。它基本上是一个立方体的两面,附在一边。纹理以我所期望的方式附着在X,Y平面中存在的一侧,但在X,Z平面中的一侧,纹理拉伸而不是平铺

结果是:

背面的正方形具有正确的纹理(白色背景,每个角落都有彩色正方形)。左边的正方形顶部有一条奇怪的紫色条纹,底部有一条绿色条纹。因为紫色不在原始纹理中,所以我假设它在纹理中以某种方式平均

我相信这是一个相当基本的问题,但我对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> ();

}
void textureTest(){
Vector3[]顶点=新Vector3[6];
顶点[0]=新向量3(0,0,0);
顶点[1]=新向量3(1,0,0);
顶点[2]=新向量3(0,-1,0);
顶点[3]=新向量3(1,-1,0);
顶点[4]=新向量3(0,0,-1);
顶点[5]=新向量3(0,-1,-1);
GameObject newtunel=新游戏对象(“TextureTest”);
网格newMesh=新网格();
newTunnel.AddComponent();
newTunnel.AddComponent();
newMesh.vertices=顶点;
Vector2[]uvs=newvector2[newMesh.vertices.Length];
对于(int i=0;i
编辑:我使用的纹理在这里。我添加它是因为屏幕截图有点暗

此代码:

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;
左侧正方形的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
将顶点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

成功了!非常感谢你!我显然需要仔细阅读紫外线是如何起作用的,因为我不完全明白它为什么起作用。再次感谢@我刚刚编辑了答案,并做了一些解释。我现在明白了!再次感谢您的及时回复。我已经想了好几个小时了@kidl33t同样,在调试UV纹理贴图时,最好使用这样的东西:这看起来确实比我的有点贫民区的文本模式要好得多。谢谢你的链接!我正在用它!
0 - 2 - 4 - 6 - 0
| / | / | / | / |
1 - 3 - 5 - 7 - 1