0

所以我有一个无缝的纹理。图片中的黑线代表重复的纹理。然后我有一系列已知 x,y 坐标和已知高度和宽度的块。在 Unity 中,纹理具有“比例”和“偏移”。

比例是将在块上显示的纹理数量。因此,从 0,0 开始的块将具有大约 (.2,1.3) 的比例。它的宽度是单个纹理宽度的 0.2 倍(为了简单的数字),它的高度大约是纹理高度的 1.3 倍。

偏移然后移动'纹理的起点。0,0 处的块将具有 0,0 的偏移量,因为它与角完美对齐,但紧邻它的块将具有大约 0.2,0 的纹理,因为纹理需要从大约 0.2 个单位开始正确对齐。这是据我了解的偏移量。我很确定这是正确的,但如果我错了,请随时纠正我。

现在,当您将纹理应用于块时,unity 会自动缩放纹理以从块的左上角开始并适当地拉伸它以适应该空间内的 1 次完整迭代。我显然不想要这个。

我的问题是针对标有 (x,y) 坐标的三个块。我已经在几个星期内尝试了几个小时以使其正确,但未成功。

那么如何获取 x、y 位置和宽度/高度以创建正确的比例和偏移量,以便这些块看起来就像它们应该在纹理中的确切位置?

这不是一个特别困难的概念,但盯着它看后我没有更多的想法。

为了这个问题,假设单个纹理是 12x12。x,y 和宽度/高度是已知值,但是是任意的。

我知道发布尝试过的代码通常是一种好习惯,但我宁愿看到一种好的方法,也不愿看到试图修复我失败的尝试的答案。但是如果人们想看到我自己尝试过或者我最初是如何尝试的,我会发布代码。

在此处输入图像描述

4

1 回答 1

1

什么是 UV 贴图

纹理通过所谓的 UV 贴图应用于模型。这个想法是每个 (x,y,z) 顶点都分配了两个 (u,v) 坐标。UV 坐标定义纹理上的哪个点应对应于该顶点。如果您想了解更多信息,我建议您参加很棒的(免费的)Udacity 3D 图形课程。第 8 单元讨论了 UV 映射。

如何使用 UV 贴图解决您的问题

让我们忽略所有不可见的顶点 - 您的块基本上是矩形。您可以指定一个 UV 映射,其中每个顶点的世界位置将转换为其 UV 坐标。这样,所有块将在纹理空间中具有相同的原点(世界位置的 0,0 对应于纹理上的 0,0)。代码如下所示:

Mesh mesh = GetComponent<MeshFilter>().mesh;
Vector3[] vertices = mesh.vertices;
Vector2[] uvs = new Vector2[vertices.Length];

for (int i = 0; i < uvs.Length; i++)
{
    // Find world position of each point
    Vector3 vertexPos = transform.TransformPoint(vertices[i]);
    // And assign its x,y coordinates to u,v.
    uvs[i] = new Vector2(vertexPos.x, vertexPos.y);
}
mesh.uv = uvs;

每次您的区块位置发生变化时,您都必须这样做。

于 2013-11-05T15:26:23.040 回答