• OpenGL 实现Interpolation插值算法


    这是一个静态插值算法的效果,图形学中插值算法应用十分广。如动画。photoshop, autocAD等软件画曲线,还有shader中的渐变上色也是一个硬件支持的插值算法。

    Interpolation是非常低层的算法,在图形学中能够说无处不在。

    本程序通过设置两个vector。然后就能够在这两个vector之间插入点,得到不同的效果

    如两个vector不同长度能够得到:



    假设长度同样。就能够得到一个扇形:



    所有自家定义的函数实现的,主要代码:

    一)计算两个向量的夹角。返回夹角大小:

    float calVecTheta(Vector2f vfir, Vector2f vsec)
    {
    	float r = sqrtf(vfir.x * vfir.x + vfir.y * vfir.y);
    	Vector2f vfirNor;
    	vfirNor.x = vfir.x / r;
    	vfirNor.y = vfir.y / r;
    	
    	r = sqrtf(vsec.x * vsec.x + vsec.y * vsec.y);
    	Vector2f vsecNor;
    	vsecNor.x = vsec.x / r;
    	vsecNor.y = vsec.y / r;
    
    	float theta = acosf(vfirNor.x * vsecNor.x + vfirNor.y * vsecNor.y);
    	return theta;
    }

    二) 实现插值公式

    void interpolateTwoVectors(Vector2f &vout, Vector2f &vfir, Vector2f &vsec,
    					  float theta, float t)
    {
    	float a = sinf((1.0f-t) * theta) / sinf(theta);
    	float b = sinf(t * theta) / sinf(theta);
    
    	vout.x = a * vfir.x + b * vsec.x;
    	vout.y = a * vfir.y + b * vsec.y;
    }

    三)产生顶点缓冲:

    void createGeoAndBuffer()
    {
    	Vector2f vers[SEGMENTS*2+2];
    	Vector2f vfir(1.f, 0.f);
    	Vector2f vsec(-1.f/sqrtf(2.0f), 1.f/sqrtf(2.0f));
    	vers[1] = vfir, vers[3] = vsec;
    
    	float theta = calVecTheta(vfir, vsec);
    	for (int i = 4, d = 1; i < SEGMENTS*2+2; i += 2, d++)
    	{
    		interpolateTwoVectors(vers[i+1], vfir, vsec, theta, 
    			float(d) / (float)SEGMENTS);
    	}
    
    	glGenBuffers(1, &VBO);//注意是1, &VBO
    	glBindBuffer(GL_ARRAY_BUFFER, VBO);
    	glBufferData(GL_ARRAY_BUFFER, sizeof(vers), vers, GL_STATIC_DRAW);
    }


    以上就是基本的算法代码了。


    插值算法还能够实现非常多有趣的效果,由于它乃是动画的最底层算法,如非常多人玩的flash动画,flash会自己主动产生连贯的帧,实现动画效果。非常奇妙吧? 事实上产生的动画效果就是使用了这个插值算法的。

    呵呵。在底层逻辑原理面前,能解开一切神奇面纱,Magic has been demistified。

    有空会实现很多其它效果。


  • 相关阅读:
    MySQL配置文件
    Linux安装MySQL以及版本说明
    RabbitMQ之Routing(路由有选择的接收)
    RabbitMQ之Publish/Subscribe(发布/订阅)
    RabibitMQ之Work Queues
    RabbitMQ简单生产者消费者(一对一)发送消息
    Linux下安装RabbitMQ
    PyQt5+qtdesigner开发环境配置
    利用sql语句建立全国省市区三级数据库
    完整项目:网上图书商城(一、MySQL数据库设计)未完
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5078750.html
Copyright © 2020-2023  润新知