OpenGL ES圆内放大、缩小、向某一点拉伸(曲线形变)算法

1.圆内放大
//圆内放大
vec2 enlargeFun(vec2 curCoord,vec2 circleCenter,float radius,float intensity,float curve)
{
    float currentDistance = distance(curCoord,circleCenter);

    {
        float weight = currentDistance/radius;

        weight = 1.0-intensity*(1.0-pow(weight,curve));//默认curve 为2 ,当 curve 越大时, 会放大得越大的,
        weight = clamp(weight,0.0,1.0);
        curCoord = circleCenter+(curCoord-circleCenter)*weight;
    }
    return curCoord;
}

这是圆内放大算法, 
输入:坐标,放大中心坐标,放大半径,放大比例系数,放大算法参数. 
返回:放大之后应该取的像素的位置.

通常 intensity = 1.0,curve = 2.0

2.圆内缩小
vec2 narrowFun(vec2 curCoord,vec2 circleCenter,float radius,float intensity,float curve)
{
    float currentDistance = distance(curCoord,circleCenter);

    {
        float weight = currentDistance/radius;
        weight = 1.0-intensity*(1.0-pow(weight,curve));//默认curve 为2 ,当curve 越大时, 会缩小得越小的,
        weight = clamp(weight,0.0001,1.0);
        curCoord = circleCenter+(curCoord-circleCenter)/weight;
    }
    return curCoord;
}

参数含义 
输入:坐标,放大中心坐标,放大半径,放大比例系数,放大算法参数. 
返回:放大之后应该取的像素的位置.
通常 intensity = 1.0,curve = 2.0

3.向某一点拉伸
// 拉伸
vec2 stretchFun(vec2 textureCoord, vec2 originPosition, vec2 targetPosition, float radius,float curve)
{
    vec2 offset = vec2(0.0);
    vec2 result = vec2(0.0);

    vec2 direction = targetPosition - originPosition;


    float infect = distance(textureCoord, originPosition)/radius;

    infect = pow(infect,curve);// 默认 curve 为1,这个值越大,拉伸到指定点越圆润,越小越尖
    infect = 1.0-infect;
    infect = clamp(infect,0.0,1.0);
    offset = direction * infect;
    result = textureCoord - offset;

    return result;
}

参数含义
输入:坐标,拉伸中心坐标,拉伸目标坐标,拉伸半径,拉伸算法参数. 
返回:放大之后应该取的像素的位置.
通常 curve = 2

具体原理分析和参数对效果的影响请参考 大神 zfgrinm
的博客 https://blog.csdn.net/zfgrinm/article/details/79291693

用途,圆内放大可以放大眼睛,圆内缩小可以缩小嘴巴,向某一点拉伸的曲线形变可以瘦脸、削脸、瘦下巴、换脸等等

形变应用请参考大神 cain_huang
https://www.jianshu.com/p/3334a3af331f

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 关于诊断X线机准直器的作用,错误的是()。 (6.0 分) A. 显示照射野 B. 显示中心线 C. 屏蔽多...
    我们村我最帅阅读 13,736评论 0 5
  • 硬派健身 摘要 自序 与更好的自己,在未来重逢。 2016-10-11 13:34:10 是谁说运动一定要持续40...
    夜上海滩阅读 13,419评论 0 50
  • 本文首发于个人博客:Lam's Blog - 【OpenGL-ES】二维纹理,文章由MarkDown语法编写,可能...
    格子林ll阅读 9,240评论 0 9
  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 10,598评论 3 23
  • 早上出门的时候,觉得天空是一副健康的样子,即使不会是艳阳天,也有很大可能不下雨,特意没有带伞,打算下午早点下班,去...
    乱侃侃阅读 3,674评论 1 13

友情链接更多精彩内容