【发布时间】:2016-06-11 21:17:48
【问题描述】:
我正在 Unity3D 中以编程方式创建网格。网格的每个部分都设置了 4 个顶点:
// 1 ----- 2
// | a / |
// | / b |
// 3 ----- 4
我的 UV 是:
1 = 0, 1
2 = 0.125, 1
3 = 0, 0.875
4 = 0.125, 0.875
我的纹理是 2048x2048。该图块位于图像的左上角,大小为 256x256。我用一些额外的图块稍微更新了纹理,以便更好地了解我正在尝试做什么。
我在网格上的每个图块周围都出现了白色边缘。
我正在使用以下设置导入图像。
生成网格的代码(手动法线):
IEnumerator BuildMesh (int width, int height, float tileSize) {
float halfSize = tileSize / 2f;
List<Vector3> vertices = new List<Vector3> ();
List<Vector3> normals = new List<Vector3> ();
List<Vector2> uv = new List<Vector2> ();
List<int> triangles = new List<int> ();
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int tileVertIdx = vertices.Count;
float h = map.GetHeight(startX + x, startY + y);
float n = map.GetHeight(startX + x, startY + y - 1);
float s = map.GetHeight(startX + x, startY + y + 1);
float e = map.GetHeight(startX + x + 1, startY + y);
float w = map.GetHeight(startX + x - 1, startY + y);
float ne = map.GetHeight(startX + x + 1, startY + y - 1);
float nw = map.GetHeight(startX + x - 1, startY + y - 1);
float se = map.GetHeight(startX + x + 1, startY + y + 1);
float sw = map.GetHeight(startX + x - 1, startY + y + 1);
Vector3 tileCenter = new Vector3 (x * tileSize, h, y * tileSize);
Rect topUV = map.GetTopUV ((int)h);
if (n == h && s == h && e == h && w == h && ne == h && nw == h && se == h && sw == h) {
// Each tile
// 1 ----- 2
// | a / |
// | / b |
// 3 ----- 4
// top row
vertices.Add (new Vector3 (tileCenter.x - halfSize, tileCenter.y, tileCenter.z - halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, tileCenter.y, tileCenter.z - halfSize));
// bottom row
vertices.Add (new Vector3 (tileCenter.x - halfSize, tileCenter.y, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, tileCenter.y, tileCenter.z + halfSize));
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
uv.Add (new Vector2(topUV.x, topUV.y));
uv.Add (new Vector2(topUV.x - topUV.width, topUV.y));
uv.Add (new Vector2(topUV.x, topUV.y - topUV.height));
uv.Add (new Vector2(topUV.x - topUV.width, topUV.y - topUV.height));
// a
triangles.Add (tileVertIdx + 0);
triangles.Add (tileVertIdx + 2);
triangles.Add (tileVertIdx + 1);
// b
triangles.Add (tileVertIdx + 1);
triangles.Add (tileVertIdx + 2);
triangles.Add (tileVertIdx + 3);
} else {
// Each tile
// 1 - 2 - 3 14 --- 16
// |a\b|c/d\ | k / |
// 4 - 5 - 6 | / |
// |e/f|g\h| | / l |
// 7 - 8 - 9 15 --- 17
// 10 --- 11
// | i / j |
// 12 --- 13
// top row
vertices.Add (new Vector3 (tileCenter.x - halfSize, tileCenter.y, tileCenter.z - halfSize));
vertices.Add (new Vector3 (tileCenter.x, tileCenter.y, tileCenter.z - halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, tileCenter.y, tileCenter.z - halfSize));
// middle row
vertices.Add (new Vector3 (tileCenter.x - halfSize, tileCenter.y, tileCenter.z));
vertices.Add (new Vector3 (tileCenter.x, tileCenter.y, tileCenter.z));
vertices.Add (new Vector3 (tileCenter.x + halfSize, tileCenter.y, tileCenter.z));
// bottom row
vertices.Add (new Vector3 (tileCenter.x - halfSize, tileCenter.y, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x, tileCenter.y, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, tileCenter.y, tileCenter.z + halfSize));
// bottom square
vertices.Add (new Vector3 (tileCenter.x - halfSize, h, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, h, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x - halfSize, s, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, s, tileCenter.z + halfSize));
// right square
vertices.Add (new Vector3 (tileCenter.x + halfSize, h, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, h, tileCenter.z - halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, e, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, e, tileCenter.z - halfSize));
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
normals.Add (Vector3.up);
uv.Add (new Vector2(topUV.x, topUV.y));
uv.Add (new Vector2(topUV.x - (topUV.width / 2), topUV.y));
uv.Add (new Vector2(topUV.x - topUV.width, topUV.y));
uv.Add (new Vector2(topUV.x, topUV.y - (topUV.height / 2)));
uv.Add (new Vector2(topUV.x - (topUV.width / 2), topUV.y - (topUV.height / 2)));
uv.Add (new Vector2(topUV.x - topUV.width, topUV.y - (topUV.height / 2)));
uv.Add (new Vector2(topUV.x, topUV.y - topUV.height));
uv.Add (new Vector2(topUV.x - (topUV.width / 2), topUV.y - topUV.height));
uv.Add (new Vector2(topUV.x - topUV.width, topUV.y - topUV.height));
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
// a
triangles.Add (tileVertIdx + 0);
triangles.Add (tileVertIdx + 3);
triangles.Add (tileVertIdx + 4);
// b
triangles.Add (tileVertIdx + 0);
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 1);
// c
triangles.Add (tileVertIdx + 1);
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 2);
// d
triangles.Add (tileVertIdx + 2);
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 5);
// e
triangles.Add (tileVertIdx + 3);
triangles.Add (tileVertIdx + 6);
triangles.Add (tileVertIdx + 4);
// f
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 6);
triangles.Add (tileVertIdx + 7);
// g
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 7);
triangles.Add (tileVertIdx + 8);
// h
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 8);
triangles.Add (tileVertIdx + 5);
// i
triangles.Add (tileVertIdx + 9);
triangles.Add (tileVertIdx + 11);
triangles.Add (tileVertIdx + 10);
// j
triangles.Add (tileVertIdx + 10);
triangles.Add (tileVertIdx + 11);
triangles.Add (tileVertIdx + 12);
// k
triangles.Add (tileVertIdx + 13);
triangles.Add (tileVertIdx + 15);
triangles.Add (tileVertIdx + 14);
// l
triangles.Add (tileVertIdx + 15);
triangles.Add (tileVertIdx + 16);
triangles.Add (tileVertIdx + 14);
}
}
yield return null;
}
Mesh mesh = _meshFilter.mesh;
mesh.vertices = vertices.ToArray ();
mesh.triangles = triangles.ToArray ();
mesh.normals = normals.ToArray ();
mesh.uv = uv.ToArray ();
// mesh.RecalculateNormals ();
// mesh.Optimize ();
map.ChunkFinished ();
}
生成网格的代码(自动法线):
IEnumerator BuildMesh (int width, int height, float tileSize) {
float halfSize = tileSize / 2f;
List<Vector3> vertices = new List<Vector3> ();
List<Vector3> normals = new List<Vector3> ();
List<Vector2> uv = new List<Vector2> ();
List<int> triangles = new List<int> ();
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int tileVertIdx = vertices.Count;
float h = map.GetHeight(startX + x, startY + y);
float n = map.GetHeight(startX + x, startY + y - 1);
float s = map.GetHeight(startX + x, startY + y + 1);
float e = map.GetHeight(startX + x + 1, startY + y);
float w = map.GetHeight(startX + x - 1, startY + y);
float ne = map.GetHeight(startX + x + 1, startY + y - 1);
float nw = map.GetHeight(startX + x - 1, startY + y - 1);
float se = map.GetHeight(startX + x + 1, startY + y + 1);
float sw = map.GetHeight(startX + x - 1, startY + y + 1);
Vector3 tileCenter = new Vector3 (x * tileSize, h, y * tileSize);
Rect topUV = map.GetTopUV ((int)h);
if (n == h && s == h && e == h && w == h && ne == h && nw == h && se == h && sw == h) {
// Each tile
// 1 ----- 2
// | a / |
// | / b |
// 3 ----- 4
// top row
vertices.Add (new Vector3 (tileCenter.x - halfSize, tileCenter.y, tileCenter.z - halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, tileCenter.y, tileCenter.z - halfSize));
// bottom row
vertices.Add (new Vector3 (tileCenter.x - halfSize, tileCenter.y, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, tileCenter.y, tileCenter.z + halfSize));
uv.Add (new Vector2(topUV.x, topUV.y));
uv.Add (new Vector2(topUV.x - topUV.width, topUV.y));
uv.Add (new Vector2(topUV.x, topUV.y - topUV.height));
uv.Add (new Vector2(topUV.x - topUV.width, topUV.y - topUV.height));
// a
triangles.Add (tileVertIdx + 0);
triangles.Add (tileVertIdx + 2);
triangles.Add (tileVertIdx + 1);
// b
triangles.Add (tileVertIdx + 1);
triangles.Add (tileVertIdx + 2);
triangles.Add (tileVertIdx + 3);
} else {
// Each tile
// 1 - 2 - 3 14 --- 16
// |a\b|c/d\ | k / |
// 4 - 5 - 6 | / |
// |e/f|g\h| | / l |
// 7 - 8 - 9 15 --- 17
// 10 --- 11
// | i / j |
// 12 --- 13
// top row
vertices.Add (new Vector3 (tileCenter.x - halfSize, tileCenter.y, tileCenter.z - halfSize));
vertices.Add (new Vector3 (tileCenter.x, tileCenter.y, tileCenter.z - halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, tileCenter.y, tileCenter.z - halfSize));
// middle row
vertices.Add (new Vector3 (tileCenter.x - halfSize, tileCenter.y, tileCenter.z));
vertices.Add (new Vector3 (tileCenter.x, tileCenter.y, tileCenter.z));
vertices.Add (new Vector3 (tileCenter.x + halfSize, tileCenter.y, tileCenter.z));
// bottom row
vertices.Add (new Vector3 (tileCenter.x - halfSize, tileCenter.y, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x, tileCenter.y, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, tileCenter.y, tileCenter.z + halfSize));
// bottom square
vertices.Add (new Vector3 (tileCenter.x - halfSize, h, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, h, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x - halfSize, s, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, s, tileCenter.z + halfSize));
// right square
vertices.Add (new Vector3 (tileCenter.x + halfSize, h, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, h, tileCenter.z - halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, e, tileCenter.z + halfSize));
vertices.Add (new Vector3 (tileCenter.x + halfSize, e, tileCenter.z - halfSize));
uv.Add (new Vector2(topUV.x, topUV.y));
uv.Add (new Vector2(topUV.x - (topUV.width / 2), topUV.y));
uv.Add (new Vector2(topUV.x - topUV.width, topUV.y));
uv.Add (new Vector2(topUV.x, topUV.y - (topUV.height / 2)));
uv.Add (new Vector2(topUV.x - (topUV.width / 2), topUV.y - (topUV.height / 2)));
uv.Add (new Vector2(topUV.x - topUV.width, topUV.y - (topUV.height / 2)));
uv.Add (new Vector2(topUV.x, topUV.y - topUV.height));
uv.Add (new Vector2(topUV.x - (topUV.width / 2), topUV.y - topUV.height));
uv.Add (new Vector2(topUV.x - topUV.width, topUV.y - topUV.height));
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
uv.Add (Vector2.up);
// a
triangles.Add (tileVertIdx + 0);
triangles.Add (tileVertIdx + 3);
triangles.Add (tileVertIdx + 4);
// b
triangles.Add (tileVertIdx + 0);
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 1);
// c
triangles.Add (tileVertIdx + 1);
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 2);
// d
triangles.Add (tileVertIdx + 2);
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 5);
// e
triangles.Add (tileVertIdx + 3);
triangles.Add (tileVertIdx + 6);
triangles.Add (tileVertIdx + 4);
// f
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 6);
triangles.Add (tileVertIdx + 7);
// g
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 7);
triangles.Add (tileVertIdx + 8);
// h
triangles.Add (tileVertIdx + 4);
triangles.Add (tileVertIdx + 8);
triangles.Add (tileVertIdx + 5);
// i
triangles.Add (tileVertIdx + 9);
triangles.Add (tileVertIdx + 11);
triangles.Add (tileVertIdx + 10);
// j
triangles.Add (tileVertIdx + 10);
triangles.Add (tileVertIdx + 11);
triangles.Add (tileVertIdx + 12);
// k
triangles.Add (tileVertIdx + 13);
triangles.Add (tileVertIdx + 15);
triangles.Add (tileVertIdx + 14);
// l
triangles.Add (tileVertIdx + 15);
triangles.Add (tileVertIdx + 16);
triangles.Add (tileVertIdx + 14);
}
}
yield return null;
}
Mesh mesh = _meshFilter.mesh;
mesh.vertices = vertices.ToArray ();
mesh.triangles = triangles.ToArray ();
mesh.uv = uv.ToArray ();
mesh.RecalculateNormals ();
mesh.Optimize ();
map.ChunkFinished ();
}
两个版本的代码产生相同的问题。
【问题讨论】:
-
.125 业务怎么了?它不会只是 1,1 等等 .. 都是 1/0 吗??
-
@JoeBlow - 它不是完整的图像大小。目前我只有 1 块瓷砖,但还会有更多,草、泥土、水等。我现在只是想让纹理正确排列。
-
好的 - 只是一个建议:只需制作一个统一的普通四边形(即使用菜单)。把你的纹理放在上面。愚弄这些价值观,直到它们如你所愿。绝对检查它在 UNITY 提供的网格上看起来是否正确!
-
我正在尝试在单个网格上制作平铺地图。网格不仅仅是一个平面,所以我不能使用提供的网格。如果有帮助,我会发布我的代码。
-
你用谷歌搜索过这些蹩脚的想法吗? forum.unity3d.com/threads/…
标签: unity3d textures uv-mapping