插值技术之Bezier插值(1) -- Bezier Curve
作者:i_dovelemon
来源:CSDN
日期:2015 / 7 / 11
主题:Interpolate,Bezier Curve
引言
从今天開始。将会陆陆续续的向大家介绍什么是插值技术?以及在计算机视频游戏开发中常常使用的插值技术有哪些。
这种技术能够在诸如动画系统等游戏内容中得到使用。就拿动画系统举例。如今的动画系统大都流行一种 url=-3Fh4jngiJPLBEr1rVZdeI4iDLYUNu8lcYID7S25flxFym68iLVfsMmikE8SwjqYEif3aSM6nKB7xwKdj63o-a">基于关键帧的动画
美术人员在一些动画制作软件中。如flash。制作好动画的关键帧。然后就将该动画导出成一个文件。
这个文件里仅仅保存了每个动画的关键运动部分。
那么。当我们在游戏中使用的时候,就须要通过程序来补充每两个关键帧之间的帧状态数据。这种通过两个首尾值来构建中间部分值的技术就称之为插值技术。本文就会向大家展示当中一种常常使用的插值技术的数学技术。它的实际应用将在兴许章节向大家展示。
Bezier Curve
它是一些曲线几何的总称。在本文中,将会向大家展示三种Bezier Curve。各自是Linear Bezier Curve, Quadratic Bezier Curve, Cubic Bezier Curv。
这三种Bezier Curve都是经经常使用到的曲线。而且各自是一次曲线。二次曲线和三次曲线。其它更高维度的曲线将不再讲述。关于Bezier Curve的具体解说。大家能够看下这篇Wiki:Bezier
Curve.
Linear Bezier Curve
Quadratic Bezier Curve
Cubic Bezier Curve
绘制Bezier Curve
<span style="font-family:Microsoft YaHei;"><html>
<script>
var _2dContext = 0; /*Begin Solve Bezier Curve method*/
function LinearBezierCurve(p0,p1,t)
{
return p0 + (p1 - p0) * t;
} function QuadBezierCurve(p0,p1,p2,t)
{
var current = 0;
var InvT = 1 - t;
var InvT_2 = InvT * InvT;
var T2 = t * t;
current = InvT_2 * p0;
current += 2 * InvT * t * p1;
current += T2* p2;
return current;
} function CubicBezierCurve(p0,p1,p2,p3,t)
{
var current = 0;
var InvT = 1 - t;
var InvT_2 = InvT * InvT;
var InvT_3 = InvT_2 * InvT;
var T2 = t * t;
var T3 = T2 * t;
current += InvT_3 * p0;
current += 3 * InvT_2 *t * p1;
current += 3 * InvT * T2 * p2;
current += T3 * p3;
return current;
}
/*End Solve Bezier Curve*/ //Draw a point in the cavans
function DrawPoint(context,x,y,color)
{
context.beginPath();
context.moveTo(x,y);
context.lineTo(x + 1,y);
context.closePath();
context.strokeStyle = color;
context.stroke();
} /*Begin Draw Bezier Curve*/
function DrawLinearBezierCurve(context,p0_x,p0_y,p1_x,p1_y,step,color)
{
var t = 0;
for(;t<=1;t+=step)
{
//Calculate the new position
var current_x = LinearBezierCurve(p0_x,p1_x,t);
var current_y = LinearBezierCurve(p0_y,p1_y,t); //Draw the point
DrawPoint(context,current_x,current_y,color);
}
} function DrawQuadBezierCurve(context, p0_x,p0_y,p1_x,p1_y,p2_x,p2_y,step,color)
{
var t = 0;
for(;t<=1;t+=step)
{
//Calculate the new position
var current_x = QuadBezierCurve(p0_x,p1_x,p2_x,t);
var current_y = QuadBezierCurve(p0_y,p1_y,p2_y,t); //Draw the point
DrawPoint(context,current_x,current_y,color);
}
} function DrawCubicBezierCurve(context,p0_x,p0_y,p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,step,color)
{
var t = 0;
for(;t<=1;t+=step)
{
//Calculate the new position
var current_x = CubicBezierCurve(p0_x,p1_x,p2_x,p3_x,t);
var current_y = CubicBezierCurve(p0_y,p1_y,p2_y,p3_y,t); //Draw the point
DrawPoint(context,current_x,current_y,color);
}
}
/*End Draw Bezier Curve*/ function gameInit()
{
//Get the canvas context
_2dContext = document.getElementById("canvas").getContext("2d"); //enable game loop
setInterval(gameLoop,100.0);
} function gameLoop()
{
//Clear the canvas
_2dContext.clearRect(0,0,1024,768); //Draw the linear bezier curve
DrawLinearBezierCurve(_2dContext,100,100,1000,100,0.001,"rgb(255,0,0)"); //Draw the Quadratic bezier curve
var qp1_x = Math.random() * 1024;
var qp1_y = Math.random() * 768;
DrawQuadBezierCurve(_2dContext,100,400,qp1_x,qp1_y,1000,400,0.001,"rgb(0,255,0)"); //Draw the Cubic bezier curve
var cp1_x = Math.random() * 1024;
var cp1_y = Math.random() * 768;
var cp2_x = Math.random() * 1024;
var cp2_y = Math.random() * 768;
DrawCubicBezierCurve(_2dContext,100,600,cp1_x,cp1_y,cp2_x,cp2_y,1000,600,0.001,"rgb(0,0,255)");
}
</script>
<body>
<body onLoad="gameInit();">
<canvas id="canvas" width="1024" height="768">
您的浏览器不支持Canvas特性!!。请使用Chrome,Firefox!!
</canvas>
</body>
</html></span>
插值技术之Bezier插值(1) -- Bezier Curve的更多相关文章
- 多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]
全域多项式插值指的是在整个插值区域内形成一个多项式函数作为插值函数.关于多项式插值的基本知识,见“计算基本理论”. 在单项式基插值和牛顿插值形成的表达式中,求该表达式在某一点处的值使用的Horner嵌 ...
- 空间插值文献阅读(Geostatistical approaches for incorporating elevation into the spatial interpolation of rainfall)
空间插值技术应用必读论文---P. Goovaerts, Geostatistical approaches for incorporating elevation into the spatial ...
- 从零开始一起学习SLAM | 用四元数插值来对齐IMU和图像帧
视觉 Vs. IMU 小白:师兄,好久没见到你了啊,我最近在看IMU(Inertial Measurement Unit,惯性导航单元)相关的东西,正好有问题求助啊 师兄:又遇到啥问题啦? 小白:是这 ...
- angularjs——插值字符串
一.何为插值字符串? 其实插值字符串的意思就是:拥有字符插值标记的字符串.如: hello,{{ to }}....字符插值标记:相当于我们平时在字符串替换中使用到的占位符.上面的例子中的{{to}} ...
- 建模算法(八)——插值
插值:求过已知有限个数据点的近似函数 拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义下在这些点的误差最小 (一)插值方法 一.拉格朗日多项式插值 1.插值多项式 就是做出一个 ...
- 对Vector3.Lerp 插值的理解
有时,我们在做游戏时会发现有些跟随动作不够圆滑或者需要一个缓冲的效果,这时,一般会考虑到插值.所以对插值的理解是必需的.(比如摄像机跟随主角) 插值是数学上的一个概念,在这里用公式表示就是:from ...
- h.264 fast,1/2,1/4像素运动估计与插值处理
Hadamard Transform 在1/2,1/4像素运动估计这一阶段中,对于像素残差,可以选择采用哈达玛变换来代替离散余弦变换进行高低频的分离. 优点:哈达玛矩阵全是+1,-1,因此只需要进行加 ...
- (转)Unity3D 之插值计算
在unity3D中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间.两个向量之间.两个浮点数之间.两个颜色之间,其函数原型如下: Material.Lerp 插值 funct ...
- arcgis api for js实现克里金插值渲染图--不依赖GP服务
本篇的亮点是利用kriging.js结合arcgis api for js,实现克里金插值渲染图,截图如下: 具体实现的思路如下: 1.kriging.js开源js,可以实现针对容器canvas克里金 ...
随机推荐
- 在rhel7上搭建centos7的yum源
1. 再查看现在主机上的yum源,并将它们删除 [root@localhost ~]# rpm -qa|grep yum | xargs rpm -e --nodeps # --nodeps 不管有没 ...
- 垃圾回收算法与 JVM 垃圾回收器综述(转)
垃圾回收算法与 JVM 垃圾回收器综述 我们常说的垃圾回收算法可以分为两部分:对象的查找算法与真正的回收方法.不同回收器的实现细节各有不同,但总的来说基本所有的回收器都会关注如下两个方面:找出所有的存 ...
- bind1st bind2nd的使用
STL中的函数 bind1st. bind2nd用于将一个二元算子转换成一元算子,需要两个 参数,要转换的bf和一个值v. 参考:http://blog.csdn.net/simahao/articl ...
- POJ 3278 Catch That Cow(简单BFS)
题目链接:http://poj.org/problem?id=3278 题目大意:给你两个数字n,k.可以对n执行操作(n+1,n-1,n*2),问最少需要几次操作使n变成k. 解题思路:bfs,每次 ...
- SVN文件上感叹号、加号、问号等图标的原因
黄色感叹号(有冲突): --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别 ...
- C++的黑科技(深入探索C++对象模型)
周二面了腾讯,之前只投了TST内推,貌似就是TST面试了 其中有一个问题,“如何产生一个不能被继承的类”,这道题我反反复复只想到,将父类的构造函数私有,让子类不能调用,最后归结出一个单例模式,但面试官 ...
- 获取对象的key【键】和分别获取数组的key【键】和值
一.先说对象,如何获取key[键]: var obj={ name:"websong", qq:289483936 } 想要获取这个obj对象的键“name”和"qq&q ...
- 使用gradle建立java application
建立项目目录mkdir java-democd java-demo 初始化项目目录gradle init --type java-application 编译./gradlew build 运行./g ...
- poj1950 Dessert(DFS)
题目链接 http://poj.org/problem?id=1950 题意 输入一个整数n(3<=n<=15),将1,2,..n顺序排列,在数字中间插入'+','-','.',这样会产生 ...
- PHP原理之对象(一)
作者: Laruence( ) 本文地址: http://www.laruence.com/2008/08/22/412.html 转载请注明出处 或许你知道,或许你不知道,PHP是一个弱类型,动 ...