标签:
这是一个静态插值算法的效果,图形学中插值算法应用十分广。如动画。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); }
以上就是基本的算法代码了。
呵呵。在底层逻辑原理面前,能解开一切神奇面纱,Magic has been demistified。
有空会实现很多其它效果。
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/5078750.html