所以我有一个无缝的纹理。图中的黑线表示重复纹理。然后我有一系列已知x,y坐标和已知高度和宽度的块。在Unity中,纹理具有“缩放”和“偏移”。
缩放是将在块上显示的纹理量。因此,从0,0开始的块将具有大约(.2,1.3)的标度。它的宽度是单个纹理宽度的.2倍(为了简单的数字),它的高度约为纹理高度的1.3倍。
偏移然后移动纹理的起点。 0,0处的块将具有0,0的偏移量,因为它与角完全对齐但是右边的块将具有大约.2,0的纹理,因为纹理需要以大约0.2个单位开始。正确对齐据我所知,这是抵消。我很确定这是正确的,但如果我错了,请随时纠正我。
现在,当您将块纹理应用于块时,自动缩放纹理以从块的左上角开始并适当地拉伸它以适合该空间内的1次完整迭代。我显然不想要这个。
我的问题是用(x,y)坐标标记的三个块。我已经尝试了几个小时几个小时才能把它弄好,但没有成功。
那么我如何接受x,y位置和宽度/高度来创建正确的比例和偏移量,以便这些块看起来像它们应该在纹理中的确切位置?
这不是一个特别困难的概念,但在盯着它后,我没有更多的想法。
为了问题,假设单个纹理是12x12。 x,y和宽度/高度是已知值,但是是任意的。
我知道发布尝试代码通常是一种好习惯,但我宁愿看到一个好方法,也就是看到试图修复失败尝试的答案。但是如果人们想要看到我自己尝试过或者我最初尝试过的话,我会发布代码。
答案 0 :(得分:1)
什么是UV地图
纹理通过所谓的UV贴图应用于模型。这个想法是每个(x,y,z)顶点分配了两个(u,v)坐标。 UV坐标定义纹理上的哪个点应对应于该顶点。如果你想了解更多,我建议真棒(和免费)Udacity 3D graphics course。第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;
每次阻止位置变化时都必须这样做。