OpenGL三角形绘制平滑线

整体思路:

  • 根据给定的点P,做插值均分,得到N个P点
  • 将N个P点进行求角平分线(TB)
  • 然后再角平分线(TB)的正反方向进行D距离的拓宽,得到PT,PB,算出T点、B点
  • 将所有的T点、B点进行连接,使用triangle strip进行绘制

关于插值均分算法,参考:

  • https://discuss.cocos2d-x.org/t/beding-warping-sprites-by-bezier/33758/8
  • https://medium.com/@intmainreturn00/drawing-smooth-lines-with-cocos2dx-d057c41b8af2
    理解上上述算法后,你会发现当三个点如果组成了锐角(或者小于一定角度)的情况下:

上图是将2个输入点之间插入了2个均分点,也就是将一条线段切成了3份。

仔细观察绘制结果,会发现三角形会相互叠加,顶点比较乱。

优化方案:

  • 对原始的点P进行二阶贝塞尔,将P2变为贝塞尔曲线t=0.5的位置,这样所可能会让曲线偏离设定的目标点。


  • 优化后,线条的确好了很多,但是转角处还是不够顺滑


  • 同理,对生成的T点、B点进行再次进行贝塞尔曲线t=0.5的优化


经过上述优化,基本上整体已经非常平滑了,基本满足使用需求,但是当出现大幅度的锐角弯时,还是有点问题,这个只能从制作层面避免啦,暂时没有好的优化方案。

你可能感兴趣的:(OpenGL三角形绘制平滑线)