在纹理贴图里,默认uv被均匀地切成了[0, 1)

在纹理贴图里,默认UV被均匀地切成了[0,1]×[0,1]的小方块,无论是正方形还是长方形。这就导致了长方形区域里宽度会出现胖瘦不均的情况,而正方形区域里画直线完全没问题。我们用WidthDivHeight这个宽高比的反来解决这个问题,把UV的y轴拉长或缩短,像素的保留决定权就回到你手上。这给纹理贴图的坐标采样带来变化。具体公式就是y' = WidthDivHeight y。 把坐标系旋成极坐标来画雷达图时,问题又来了。因为弧长等于半径乘角度乘一个系数,dx随着极径P线性放大,宽度就会走样。把这道题做好了,雷达图里的线条就能保持粗细一致。 为了让线条宽度自动缩放,我们需要把WidthDivHeight升级成动态版。先算出一圈的长度xLen等于yLen乘2乘π;让WidthDivHeight等于2乘π实现一圈归一;每算一个角度e,利用dx和P的线性关系反向推算局部dw,这样线条怎么歪都能保持视觉上的一致。 最后就是关于雷达图的幻想:在极坐标里线条的胖瘦为什么会失控?这是因为水平线上看起来没事,是因为极径P把dy固定住了;但倾斜线就像是被拉面师傅拽了一头——弧长是半径乘角度再乘个系数,dx随着P线性放大,宽度瞬间就走样了。 上图就是典型的“车祸现场”。我们把UV均匀分布的陷阱搞懂了以后,就可以利用WidthDivHeight把宽度拉回正轨了。