统一确定动态生成的网格的 uv 坐标
Determining uv coords for dynamically generated mesh in unity
我有一个代表球体表面部分的网格,但我在计算顶点的 UV 坐标时遇到了一些问题。
鉴于 verts 的生成代码,有人可以解释/提供我如何确定 uv 坐标的示例吗?
传入的"Region"包含东、南、西的度数。
该代码将值转换为弧度,并确定在水平和垂直方向上所需顶点数的步进量。
这么多就可以了。
为此 "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();
}
您可以为此使用方位角和倾角:
u = (az - range.West) / (range.East - range.West);
v = (inc - range.South) / (range.North - range.South);
这只是将你的步骤从 0 映射到 1。请注意,这会给你一个扭曲的纹理贴图,即小区域(例如球体的顶部)将使用纹理的整个宽度。如果你不想要这种扭曲,你需要放弃你对网格的角落也是纹理的角落的要求。
我有一个代表球体表面部分的网格,但我在计算顶点的 UV 坐标时遇到了一些问题。
鉴于 verts 的生成代码,有人可以解释/提供我如何确定 uv 坐标的示例吗?
传入的"Region"包含东、南、西的度数。 该代码将值转换为弧度,并确定在水平和垂直方向上所需顶点数的步进量。
这么多就可以了。
为此 "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();
}
您可以为此使用方位角和倾角:
u = (az - range.West) / (range.East - range.West);
v = (inc - range.South) / (range.North - range.South);
这只是将你的步骤从 0 映射到 1。请注意,这会给你一个扭曲的纹理贴图,即小区域(例如球体的顶部)将使用纹理的整个宽度。如果你不想要这种扭曲,你需要放弃你对网格的角落也是纹理的角落的要求。