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

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

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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

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

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;
}

二) 实现插值公式

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">:

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。

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

OpenGL 实现Interpolation插值算法的更多相关文章

  1. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

  2. OpenGL渲染流程

    一.什么是openGL OpenGL被定义为“图形硬件的一种软件接口”.从本质上说,它是一个3D图形和模型库,具有高度的可移植性,具有非常快的速度. 二.管线 管线这个术语描述了opengl渲染的整个 ...

  3. OpenGL ES crash notes 01 - Nice to meet you

    这篇笔记完全参照<OpenGL.ES.3.0.Programming.Guide.2nd.Edition>,摘出部分内容只为学习参考. 为什么要用英文:无论是D3D的SDK还是OES的Sp ...

  4. OpenGL官方教程——着色器语言概述

    OpenGL官方教程——着色器语言概述 OpenGL官方教程——着色器语言概述 可编程图形硬件管线(流水线) 可编程顶点处理器 可编程几何处理器 可编程片元处理器 语言 可编程图形硬件管线(流水线) ...

  5. 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)

    在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...

  6. NeHe OpenGL lession 4

    // lession4.c #include <OpenGL/OpenGL.h> #include <GLUT/GLUT.h> #include <stdio.h> ...

  7. OpenGL OpenCV根据视差图重建三维信息

    代码如下: // disparity_to_3d_reconstruction.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" //Huan ...

  8. OpenGL着色器入门简介

    说明:本文翻译自LearnOpengl经典教程,OpenGL着色器基础介绍的比较通俗易懂,特总结分享一下! 为什么要使用着色器?我们知道,OpenGL一般使用经典的固定渲染管线来渲染对象,但是随着Op ...

  9. OpenGL.Tutorial16_ShadowMapping

    1. 2. In Tutorial 15 we learnt how to create lightmaps, which encompasses(包含) static lighting. While ...

随机推荐

  1. Java设计模式之认识阶段

    设计模式是什么? 设计模式(Design pattern)是一套被重复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 其本质就是继承与接口的组合应用. 为什么要用设计模? 使用设计模式是为了 ...

  2. android开机启动应用和服务

    注冊广播监听开机状态.启动应用和服务等: 监听开机的广播接收器: public class BootCompletedReceiver extends BroadcastReceiver{ @Over ...

  3. Eclipse关闭检查

    有没有发现每次操作Eclipse过后,都会有build Workspace的操作一直在后台执行,JS校验一直validate,非常卡非常受不了有木有? 有木有?以下是我个人成功的步骤,曾经试过非常多次 ...

  4. [Network]Application Layer

    1 Principles of Network Applications 1.1 Application Architectures Client-Server Peer-to-Peer Hybird ...

  5. uva10635 LCS映射转LIS

    题目给定 2个序列,要我们求LCS,但是序列的长度最长是250*250, LCS的时间复杂度是O(N*N),所以无法解决 我们可以第一个序列的数字,按位置,映射为1.2.3.4.5.6.7.8.9 那 ...

  6. Three.js 3D打印数据模型文件(.STL)载入中

    3DPrint是现在和未来10年度科技产品的主流之中.广泛的. 对于电子商务类3D打印网站.一个主要功能就是商品3D呈现的方式,那是,3D数据可视化技术. HTML5(WebGL)它可以用于构建3D查 ...

  7. CSS 初探

    Css: 指层叠样式表 (Cascading Style Sheets),它是用来进行网页风格设计的.通俗的说就是进行网页美化的,没有html依然存在,多了css 它会更好.但是没有html,css就 ...

  8. 添加xml文件编辑语法提示

    找到Struts的lib目录 找到struts2-core-文件并解压开 这个struts.dtd文件才是我们需要添加的文件 双击XML Catalog 点击ADD Key中复制粘贴D:\web\st ...

  9. Nagios监控生产环境redis群集服务战

    前言:     曾经做了cacti上展示redis性能报表图.能够看到redis的性能变化趋势图,可是还缺了实时报警通知的功能,如今补上这一环节. 在redis服务瓶颈或者异常时候即使报警通知,方便d ...

  10. VB6.0“挑衅”.NET!

    来到与两年前接触VB,现在学习VB.NET,这两个看起来真的不得不说,这是相对的似(ps:一分之差,只有三个字母),计等.但他们有又什么不同呢?都说VB.NET高级,比VB究竟高级在哪里了?是不是VB ...