3

球の表面の一部を表すメッシュがあり、頂点の UV 座標を特定するのに苦労しています。

頂点の生成コードを考えると、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();
}
4

1 に答える 1

3

これには方位角と傾斜角を使用できます。

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

これは単純にステップを 0 から 1 にマップします。これにより、歪んだテクスチャ マップが得られることに注意してください。つまり、小さな領域 (球の上部など) がテクスチャの全幅を使用します。この歪みが望ましくない場合は、メッシュのコーナーがテクスチャのコーナーでもあるという要件を削除する必要があります。

于 2015-03-06T22:34:45.267 に答える