我目前正在使用一种地图工具,可以为我的游戏生成自定义地图。我已经完美地完成了网格生成,但我无法弄清楚如何正确地对我的面部进行UV贴图以使纹理保持一致。我已经通过使用相应的坐标对完美地在地板上工作UV图,但是墙看起来效果不一样。
有谁知道将UV地图映射到垂直墙的正确方法?
我目前正在使用它进行墙壁的UV贴图
currentMesh.uvs.Add(new Vector2(0, 0));
currentMesh.uvs.Add(new Vector2(1, 0));
currentMesh.uvs.Add(new Vector2(0, 1));
currentMesh.uvs.Add(new Vector2(1, 1));
答案 0 :(得分:1)
对于这种情况,我会执行以下步骤:
1.使纹理成为正方形(用于减少下面代码中的计算)。此外,使其无缝和包装模式重复
2.找出矩形的长度和宽度,如下所示:
Length = (float)Vector3.Distance(mesh.vertices [0],mesh.vertices [1])
Width = (float)Vector3.Distance(mesh.vertices [0],mesh.vertices [3])
3.然后使用此代码进行UV贴图:
Vector2[] uv = new Vector2[mesh.vertices.Length];
float min = Length>Width?Length:Width;
for (int i = 0, y = 0; i < uv.Length; i++){
uv [i] = new Vector2 ((float)mesh.vertices [i].z / min, (float)mesh.vertices [i].y / min);
}
在这里,我选择 .z 和 .y ,因为我的飞机在yz飞机上。这段代码的作用是,找到矩形的较小臂并根据它拟合纹理 这是结果的屏幕截图:
我从这里学到了这一点:
http://catlikecoding.com/unity/tutorials/procedural-grid/
答案 1 :(得分:1)
我已经成功解决了这个问题。我最终做的是取顶点的 X 和 Z ,并根据墙的方向取两者的重量,最后得到结果我想
Vector3 heading = new Vector3(floor2.x - floor1.x, 0, floor2.z - floor1.z);
Vector3 direction = heading / heading.magnitude;
currentMesh.uvs.Add(new Vector2(((floor1.x * direction.x) + (floor1.z * direction.z)) / scale, floor1.y / scale));
currentMesh.uvs.Add(new Vector2(((floor2.x * direction.x) + (floor2.z * direction.z)) / scale, floor2.y / scale));
currentMesh.uvs.Add(new Vector2(((ceil1.x * direction.x) + (ceil1.z * direction.z)) / scale, ceil1.y / scale));
currentMesh.uvs.Add(new Vector2(((ceil2.x * direction.x) + (ceil2.z * direction.z)) / scale, ceil2.y / scale));