zoukankan      html  css  js  c++  java
  • 2 球面线性插值计算机动画笔记

    转载自:http://gislu.blog.163.com/blog/static/104326128200832345255631/

    3D空间中,在等长度的两个交角为theta的向量v1(x1,y1,z1),v2(x2,y2,z2)之间进行球面线性插值。
    实例:
    做一个行星在围绕太阳等速旋转的动画,假设只采样到旋转过程中的两个位置p1,p2,现在想要用软件模拟行星是怎么从p1运动到p2的。

    思路:
    1. 一般线性插值:

    我们知道一般两个量之间进行线性插值的方法为:
    v(t) = v1 + t*(v2-v1)(0<=t<=1)(因为t是一次方的,所以是线性的。)

    这里,考虑v,v1,v2是向量,由几何学的知识,v2-v1即为v1,v2组成的三角形的另外一条边。因为|v1| = |v2|,所以v1 + t*(v2-v1)的长度肯定小于|v1|或|v2|,当0<t<1时。得到的插值向量v(t)的端点沿着v2-v1行进。

    一般线性插值由于长度发生变化,不能满足案列的要求,我们需要保持向量长度不变的插值,即球面线性插值。


    2.一般球面线性插值:

    如上图所示,将一般线性插值得到的结果乘以放大系数k(t),使其长度放大到|v1|或|v2|,即得保持向量长度不变的插值:
    v(t) = k(t)*(v1 + t*(v2-v1))

    其中k(t) = |v1|/|v(t)|=|v1|/|v1+t*(v2-v1)|.

    这样,插值向量v(t)的端点就会沿着v1,v2端点构成的圆弧行进。因为v1,v2是等长的,这个圆弧实际上是位于v1,v2构成的球面上的一段,所以又叫球面线性插值,

    这个插值解决了3D空间中旋转的插值,在关键帧动画中可以用来计算两个关键帧之间的动画。但是,由于它的插值不是等角速度的,而是变速的。所以如果用来实现案例中的效果的话还需进一步处理。

    注:一般球面线性插值v(t)与v1的夹角theta(t)不是t的线性函数。

    证明:由向量点积可得cos(theta(t)) = (v(t)*v1)/|v(t)|*|v1|,(这个证明还没细看)
    theta(t) = arcos((v(t)*v1)/|v1|^2),由反证法,假设theat(t)为线性函数,则 theat(t) = k*t + b,又theta(0) = 0,故 b = 0,theat(t) = k*t,将t'= 2t代入得,theta(2*t) = arcos((v(2*t)*v1)/|v1|^2)并不等于 2*theta(t),所以theat(t)不可能是t的线性函数。

  • 相关阅读:
    数组协变性
    tomcat源码阅读23
    用枚举来实现单例模式
    CSS 的 zindex 属性
    屏幕大小与视区大小
    CSS 生成的模态窗口
    事件处理程序的绑定
    事件对象的属性和使用
    android打电话,接电话,挂电话过程
    ubuntu 12.04编译ics
  • 原文地址:https://www.cnblogs.com/dawn/p/2443523.html
Copyright © 2011-2022 走看看