OpenGL 实现Interpolation插值算法
这是一个静态插值算法的效果,图形学中插值算法应用十分广。如动画。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插值算法的更多相关文章
- CSharpGL(31)[译]OpenGL渲染管道那些事
CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...
- OpenGL渲染流程
一.什么是openGL OpenGL被定义为“图形硬件的一种软件接口”.从本质上说,它是一个3D图形和模型库,具有高度的可移植性,具有非常快的速度. 二.管线 管线这个术语描述了opengl渲染的整个 ...
- OpenGL ES crash notes 01 - Nice to meet you
这篇笔记完全参照<OpenGL.ES.3.0.Programming.Guide.2nd.Edition>,摘出部分内容只为学习参考. 为什么要用英文:无论是D3D的SDK还是OES的Sp ...
- OpenGL官方教程——着色器语言概述
OpenGL官方教程——着色器语言概述 OpenGL官方教程——着色器语言概述 可编程图形硬件管线(流水线) 可编程顶点处理器 可编程几何处理器 可编程片元处理器 语言 可编程图形硬件管线(流水线) ...
- 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)
在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...
- NeHe OpenGL lession 4
// lession4.c #include <OpenGL/OpenGL.h> #include <GLUT/GLUT.h> #include <stdio.h> ...
- OpenGL OpenCV根据视差图重建三维信息
代码如下: // disparity_to_3d_reconstruction.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" //Huan ...
- OpenGL着色器入门简介
说明:本文翻译自LearnOpengl经典教程,OpenGL着色器基础介绍的比较通俗易懂,特总结分享一下! 为什么要使用着色器?我们知道,OpenGL一般使用经典的固定渲染管线来渲染对象,但是随着Op ...
- OpenGL.Tutorial16_ShadowMapping
1. 2. In Tutorial 15 we learnt how to create lightmaps, which encompasses(包含) static lighting. While ...
随机推荐
- Java设计模式之认识阶段
设计模式是什么? 设计模式(Design pattern)是一套被重复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 其本质就是继承与接口的组合应用. 为什么要用设计模? 使用设计模式是为了 ...
- android开机启动应用和服务
注冊广播监听开机状态.启动应用和服务等: 监听开机的广播接收器: public class BootCompletedReceiver extends BroadcastReceiver{ @Over ...
- Eclipse关闭检查
有没有发现每次操作Eclipse过后,都会有build Workspace的操作一直在后台执行,JS校验一直validate,非常卡非常受不了有木有? 有木有?以下是我个人成功的步骤,曾经试过非常多次 ...
- [Network]Application Layer
1 Principles of Network Applications 1.1 Application Architectures Client-Server Peer-to-Peer Hybird ...
- uva10635 LCS映射转LIS
题目给定 2个序列,要我们求LCS,但是序列的长度最长是250*250, LCS的时间复杂度是O(N*N),所以无法解决 我们可以第一个序列的数字,按位置,映射为1.2.3.4.5.6.7.8.9 那 ...
- Three.js 3D打印数据模型文件(.STL)载入中
3DPrint是现在和未来10年度科技产品的主流之中.广泛的. 对于电子商务类3D打印网站.一个主要功能就是商品3D呈现的方式,那是,3D数据可视化技术. HTML5(WebGL)它可以用于构建3D查 ...
- CSS 初探
Css: 指层叠样式表 (Cascading Style Sheets),它是用来进行网页风格设计的.通俗的说就是进行网页美化的,没有html依然存在,多了css 它会更好.但是没有html,css就 ...
- 添加xml文件编辑语法提示
找到Struts的lib目录 找到struts2-core-文件并解压开 这个struts.dtd文件才是我们需要添加的文件 双击XML Catalog 点击ADD Key中复制粘贴D:\web\st ...
- Nagios监控生产环境redis群集服务战
前言: 曾经做了cacti上展示redis性能报表图.能够看到redis的性能变化趋势图,可是还缺了实时报警通知的功能,如今补上这一环节. 在redis服务瓶颈或者异常时候即使报警通知,方便d ...
- VB6.0“挑衅”.NET!
来到与两年前接触VB,现在学习VB.NET,这两个看起来真的不得不说,这是相对的似(ps:一分之差,只有三个字母),计等.但他们有又什么不同呢?都说VB.NET高级,比VB究竟高级在哪里了?是不是VB ...