在Unity中确定动态生成网格的UV坐标

3

我有一个网格,表示了一个球面的一部分表面,我在确定顶点UV坐标时遇到了一些困难。

给定生成顶点代码后,是否可以解释/提供一个示例,以便我可以确定UV坐标?

传入的“Region”包含北、南、东、西的度数。该代码将这些值转换为弧度,并确定所需数量的顶点在水平和垂直方向上的步长大小。

到目前为止,这一切都很好。

对于此“区域”,生成了一个球面的一部分,我想在该部分上放置纹理,其中纹理的角落也是网格的角落。

换句话说,在以下代码中如何完成“todo”...

public void BuildVerts(Voxels.Objects.PlanetRegion region, int planetSize, int verticals, int horizontals, out Vector3[] verts, out Vector2[] uvs)
{
    // determine range and stepping variable
    var range = region.ToRadians();
    var verticalStep = (range.East - range.West) / horizontals;
    var horizontalStep = (range.North - range.South) / verticals;

    // define result containers
    var vertList = new List<Vector3>();
    var uvList = new List<Vector2>();

    // ok lets do this 
    for (double az = range.West; az <= range.East; az += horizontalStep)
    {
        for (double inc = range.South; inc <= range.North; inc += verticalStep)
        {
            var newVert = new Vector3(
                (float)(planetSize * Math.Sin(az) * Math.Cos(inc)),
                (float)(planetSize * Math.Sin(az) * Math.Sin(inc)),
                (float)(planetSize * Math.Cos(az))
            );

            //TODO: Determine this!
            var newUv = new Vector2();

            vertList.Add(newVert);
            uvList.Add(newUv);
        }
    }

    verts = vertList.ToArray();
    uvs = uvList.ToArray();
}
1个回答

3
您可以使用方位角和倾角来实现这一点:
u = (az - range.West) / (range.East - range.West);
v = (inc - range.South) / (range.North - range.South);

这只是将您的步骤从0到1映射。请注意,这将给您带来扭曲的纹理贴图,即小区域(例如球体顶部)将使用您的纹理的全部宽度。如果您不想出现这种扭曲,您需要放弃网格角落也是纹理角落的要求。


天啊,我刚回来就发现你已经提供了完全相同的解决方案!!!你真是太厉害了 :) - War
纹理不会失真,因为它是由一个球形噪声函数产生的结果,该函数考虑到了这一点。 - War

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接