确定动态生成的网格的uv coords

时间:2015-03-06 20:15:44

标签: c# unity3d geometry uv-mapping

我有一个网格,表示球体表面的一部分,我在查找顶点的UV坐标时遇到了一些麻烦。

鉴于顶点的生成代码,有人可以解释/提供一个如何确定紫外坐标的例子吗?

传入的“地区”包含北,南,东和西的度数。 代码将值转换为弧度,并确定在水平和垂直方向上所需数量的顶点的步进量。

这很好用。

对于这个“区域”,会生成一个球体表面的一部分,我想在纹理的角落也是网格角落的部分放置纹理。

换句话说,如何在下面的代码中执行“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 个答案:

答案 0 :(得分:2)

你可以使用方位角和倾角:

u = (az - range.West) / (range.East - range.West);
v = (inc - range.South) / (range.North - range.South);

这简单地将您的步数从0映射到1.请注意,这将为您提供扭曲的纹理贴图,即小区域(例如球体的顶部)将使用纹理的整个宽度。如果你不想要这种扭曲,你需要放弃对网格角落的要求也是纹理的角落。