在关键帧动画的制作过程中,动画师在k物体运动的过程中,一般要确定2个参数:

    1)运动轨迹(表示物体运动的路径);

    2)速度曲线(表示物体随时间的速度变化)。

  对于运动轨迹通常选用一定的样条曲线,通过动画师给出关键点位置,通过曲线插值产生,如之前介绍的一种Cardinal样条曲线。速度曲线就是速度根据时间变化的曲线,速度曲线在一段时间上的积分累加就是运动过的路程(不是位移)。对于简单的运动类型如匀速直线运动(速度曲线是一个常数),匀加速直线运动(速度曲线是一条加速度为斜率的直线方程)都可以直接获得路程随时间变化的方程,从而得到每个时间点在曲线上通过的路径长度。因此就需要在样条曲线上根据运动过的路径的长度来确定物体在曲线上的位置(由坐标(u, P(u))表示),这个过程就是曲线的参数化。

  如果速度曲线为V(t),对应的路程曲线为s=A(t),对于给定的一段路程s,需要在Q(u)上找到对应的u点,设样条曲线函数为Q(u),上面的弧长函数为s=A(u),,那么参数化的过程就是把弧长函数表达成反函数的形式,然后代人Q(u),就可以得到一个根据弧长算出曲线上函数值的方程

  弧长函数s=A(u)是路程在u上的积分方程,所以没有解析解(所谓解析解就是通过一个求根方程直接表达成自变量u根据方程的根,如二次函数的求根方程),因此采取数值求解的方法。求解的过程分为两步:

  1)计算弧长函数s=A(u)

  2)对给定的弧长s,通过二分查找法在A(u)中计算u的值

1.弧长函数s=A(u)的计算

弧长函数就是一个曲线积分的问题,就二维图像来说,如图:

在方程Q(u)~Q(u+du)上面每一段,对s进行积分,则

 其中,

因为上述积分函数并非解析可积,一般采用数值积分技术求解,简单的采用扩展是Simpson方法(在以后篇中介绍),则

这里的每个f(u)就是我们的样条函数Q(u),一般高阶系数就直接忽略了,对于一段积分s就可以用u值和展开式计算s的值。

2.二分查找

因为弧长函数是严格的单调递增函数(路径长度的累加),那么如图

(1)如果S3<Sa, 则u3<ua (红点),

搜索区间更新成[u3,u2].

(2)如果S3>Sa, 则u3>ua (蓝点),

搜索间更新成[u1,u3].

重复上述递归过程,直到||A(u1)-A(u2)||<指定精度ε,就把u1当作匹配的u值

  这样我们就得到了每个s值对应的u值。另外,因为对于每一段曲线的弧长函数不同,连接起来的曲线可以用一个弧长表来纪录,如纪录下第一段曲线的总弧长,在第二段曲线上就在第一段曲线的基础上加上去,查找的方法也可以减小计算的时间复杂度,方便二分查找。

曲线参数化的Javascript实现(理论篇)的更多相关文章

  1. 曲线参数化的Javascript实现(代码篇)

    在曲线参数化的Javascript实现(理论篇)中推出了曲线弧长积分的公式,以及用二分法通过弧长s来查找样条曲线上对应的u,再求Q(u)的值.弧长积分函数如下: ,其中-----公式1 Simpson ...

  2. 一步步教你轻松学支持向量机SVM算法之理论篇1

    一步步教你轻松学支持向量机SVM算法之理论篇1 (白宁超 2018年10月22日10:03:35) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...

  3. 【机器学习】Logistic Regression 的前世今生(理论篇)

    Logistic Regression 的前世今生(理论篇) 本博客仅为作者记录笔记之用,不免有非常多细节不正确之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需转载,请 ...

  4. Javascript设计模式理论与实战:工厂方法模式

    本文从简单工厂模式的缺点说起,引入工厂方法模式,介绍的工厂方法模式的基本知识,实现要点和应用场景,最后举例进行说明工厂方法模式的应用.在之前的<Javascript设计模式理论与实战:简单工厂模 ...

  5. 如何编写高质量的 JS 函数(3) --函数式编程[理论篇]

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/EWSqZuujHIRyx8Eb2SSidQ作者:杨昆 [编写高质量函数系列]中, <如何 ...

  6. PHP丨PHP基础知识之流程控制WHILE循环「理论篇」

    昨天讲完FOR循环今天来讲讲他的兄弟WHILE循环!进入正题: while是计算机的一种基本循环模式.当满足条件时进入循环,进入循环后,当条件不满足时,跳出循环.while语句的一般表达式为:whil ...

  7. PHP丨PHP基础知识之条件语IF判断「理论篇」

    if语句是指编程语言(包括c语言.C#.VB.java.php.汇编语言等)中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一. if语句概述 if语句是指编程语言(包 ...

  8. Javascript本质第二篇:执行上下文

    在上一篇文章<Javascript本质第一篇:核心概念>中,对Javascript执行上下文做了解释,但是这些都是基于Javascript标准中对执行上下文的定义,也就是说理论上的东西,本 ...

  9. RabbitMQ学习总结 第一篇:理论篇

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

随机推荐

  1. cookie的弊端

    cookie虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但还是有很多局限性的. 第一:每个特定的域名下最多生成20个cookie   1.IE6或更低版本最多20个cookie 2.I ...

  2. 【翻译】configuration changes与handler.post

    原文地址 http://corner.squareup.com/2013/12/android-main-thread-2.html 在前一部分里面previous part ,我们深入挖掘了 loo ...

  3. python 执行execute遇到的问题

    1.如下方式去查询无法查询出结果,但直接在数据库查询中去查询是能查询到结果的,郁闷中,花了很久的时间才知道原来是双引号导致的 把:name="%s" 中的%s前后的双引号去掉就对了 ...

  4. 定时器springMVC

  5. ASCII表

    ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...

  6. bcd-ascii相互转换函数

    // BCD转ASCII int Asc2Bcd(unsigned char *input, unsigned int inputLen, unsigned char *output) { unsig ...

  7. java IO之AutoCloseable,Closeable和Flushable接口

    有3个接口对于流类相当重要.其中两个接口是Closeable和Flushable,它们是在java.io包中定义的,并且是由JDK5添加的.第3个接口是AutoColseable,它是由JDK7添加的 ...

  8. artDialog 配置参数

    http://blog.csdn.net/techbirds_bao/article/details/8531083

  9. HashMap 遍历

    Map<String, String> _map = new HashMap<String,String>(); 1.方法一 for (Entry<String, Str ...

  10. php 数组的常用函数

    在php教程中数组是种强大的数据类型,他可以做的事情很多,可以存储不同的数据类型在一个数组中,下面我们列出了数组常用的操作,排序,键名对数组排序等做法. /* 数组的常用函数  *  * 数组的排序函 ...