首页 > 代码库 > OpenGL 实现Interpolation插值算法

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。

有空会实现更多效果。