我写了几个函数来生成我需要的一些管状网格。然而,当我对其应用纹理时,纹理会沿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> ();
}
编辑:我正在使用的纹理就在这里。我正在添加它,因为屏幕截图有点暗。
答案 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