前言
如果你正在制作一种类似曲线的轨道或者公路,你可以参考该系列文章,该系列文章主要分享了我在制作自定义公路过程中所遇到的值得注意的难点。
先大体梳理以下前几篇文章。
- 通过贝塞尔函数创建一组曲线的Vector节点。
- 每个节点之间通过叉乘计算每个节点的左右顶点。
- 计算所有节点的三角面
- 计算背面的三角面
- 计算UV
正文
今天主要讲述最后一部,设置UV节点。
什么是UV:UV是一组记录着模型上的贴图应该怎么贴,贴在那里的数据,UV坐标可以理解为一个个二维[0-1]的坐标,每一个坐标对应其Mesh的顶点数据,坐标中用0-1表示贴图百分比的位置,以一个正方形mesh举例,如果想让一张贴图全部铺满,只需要将mesh中的4个顶点的UV分别设置为(0,0)左下角、(0,1)右下角、(1,0)左上角、(1,1)右上角,这样分别对应贴图的四个角。
先看效果:
由于我的mesh是一个多节点的mesh,每一个节点之间是一个四边形也就是两个三角面组成,它的横向坐标上只有2列,也就是x的uv固定是(0,n)和(1 , n),x固定后我只需要对每个节点的y设置UV坐标。
如何设置Y轴的UV信息,公式如下:
【1.0f / 节点数 * 缩放系数】
这里的1.0表示整个贴图的最大值,除以节点数表示每一个节点之间的距离,也就是将节点平均分布在贴图上,或者反过来说也可以。
最后的缩放系数是自定义的一个值,因为一条路面可能会多节贴图,所以后期根据贴图动态修改缩放系数来调节路面的贴图效果。
以下是UV的核心代码:
/// <summary>
/// 生成UV坐标
/// </summary>
/// <param name="posarray">节点数</param>
/// <param name="uvOffset">UV缩放系数</param>
/// <returns></returns>
Vector2[] getUVs(int posarray, float uvOffset = 1) {
Vector2[] uvs = new Vector2[posarray * 2 * 2];
//每个节点之间的uv平均值
float uv_l = 1.0f / posarray / uvOffset;
for (int i = 0; i < posarray; i++)
{
uvs[i * 2] = new Vector2(0 , i * uv_l);
uvs[i * 2 + 1] = new Vector2(1, i * uv_l);
uvs[posarray * 2 + i * 2] = new Vector2(0, i * uv_l);
uvs[posarray * 2 + i * 2 + 1] = new Vector2(1, i * uv_l);
}
return uvs;
}
多节点自动生成UV
网友评论