问题:

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

***********************************************

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

***********************************************

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的线性函数。

***************************************

3。改进的球面线性插值:

要想进行等速的球面线性插值,有几个方法:

1)。用四元数工具:

变换方法:

---------------------------------------------

构造单位四元数q(cos(theta),sin(theta)*v1'),r(cos(theta),sin(theta)*v2')(v1'和v2'为单位v1,v2向量),以

及参数t(0<=t<=1),则构造四元数变换:

a.四元数 s(w,v') = r*(q-1)exp(t)*q

即为球面线性插值变换。其中,s的虚部v'即为v1'和v2'间的插值向量,乘以长度sqrt(x1^2+y1^2+z1^2)即得v1,v2间插值向量v。

b.另一种变形形式是对四元数进行插值变换:

s(w,v') = a*q + b*r

其中a = sin(alpha*(1-t))/sin(alpha),b = sin(alpha*t))/sin(alpha), cos(alpha) = x1*y1+y1*y2+z1*z2+w1*w2.

s的虚部v'即为v1'和v2'间的插值向量,乘以长度sqrt(x1^2+y1^2+z1^2)即得v1,v2间插值向量v。

两种变换都可以。

----------------------------------------------

复杂度:

以b方法为例:时间主要花在三角函数上,四元数乘以实数只需4次乘法。cost = 1*Tat + 3*Tt + 2Td + 3*4Tm

2)。利用旋转矩阵:

变换方法:

--------------------------------------------

v = v1*Trot

其中,Trot即饶任意轴旋转的矩阵变换矩阵(见上篇:探讨:物体绕任意向量的旋转-四元数法VS.旋转矩阵法的性能比较),因为v1到v2间的插值可以看成是v1饶垂直于v1,v2组成的平面的向量的旋转,所以实际上就是个饶轴旋转的问题,不过相应参数变成:theta = t*theta,轴q(q1,q2,q3)变成向量v1Xv2/|v1Xv2| = (y1*z2-z1*y2,z1*x2-x1*z2,x1*y2-y1*x2)/sin(theta)

--------------------------------------------

复杂度:

基本和饶任意轴旋转矩阵的复杂度一样。主要是多了个向量叉积操作。 cost =2*Tt + 6*Tm + 42*Tm = 2*Tt +48*Tm

综合来看,未经过优化前,效率应该差不多。

mysql实现线性插值法_向量之间的插值-四元数法VS.旋转矩阵法的性能比较相关推荐

  1. mysql实现线性插值法_线性插值法

    线性插值法(linear interpolation) 什么是线性插值法 线性插值法是指使用连接两个已知量的直线来确定在这两个已知量之间的一个未知量的值的方法. 如何进行线性插值 假设我们已知坐标(x ...

  2. 物体绕任意向量的旋转——四元数法、旋转矩阵法、欧拉角法的比较

    3D空间中的旋转可用旋转矩阵.欧拉角或四元数等形式来表示,他们不过都是数学工具,其中在绕任意向量的旋转方面,旋转矩阵和四元数两种工具用的较多,欧拉角由于存在万向节死锁等问题,使用存在限制. (本文假设 ...

  3. 向量的夹角余弦公式_向量空间模型(VSM)的余弦定理公式(用余弦定理来表示向量之间的相似度)...

    相信很多学习向量空间模型(Vector Space Model)的人都会被其中的余弦定理公式所迷惑.. 因为一看到余弦定理,肯定会先想起初中时的那条最简单的公式cosA=a/c(邻边比斜边),见下图: ...

  4. python算两个点的距离公式_计算Python Numpy向量之间的欧氏距离实例

    计算Python Numpy向量之间的欧氏距离,已知vec1和vec2是两个Numpy向量,欧氏距离计算如下: import numpy dist = numpy.sqrt(numpy.sum(num ...

  5. 两个向量之间的夹角公式_关于平面向量夹角求参数取值范围的两种基本解法介绍...

    平面向量的夹角问题是考察高中向量知识掌握程度的常考内容,主要涉及到的知识点是平面向量的数量积公式.在这里介绍一道常见的平面向量题目,通过两种最基本的解法,来帮助同学们理解向量之间的夹角. 填空题第15 ...

  6. pca各个向量之间的相关度_详细推导PCA算法

    本文主要思路如下: 1 PCA优化目标 PCA(主成分分析)是一种数据降维的方法,即用较少特征地数据表达较多特征地数据(数据压缩,PCA属于有损压缩).PCA推导有两种主要思路: 最大化数据投影后的的 ...

  7. python计算向量的模_计算Python Numpy向量之间的欧氏距离实例

    计算Python Numpy向量之间的欧氏距离,已知vec1和vec2是两个Numpy向量,欧氏距离计算如下:import numpy dist = numpy.sqrt(numpy.sum(nump ...

  8. python 欧氏距离_计算Python Numpy向量之间的欧氏距离实例

    计算Python Numpy向量之间的欧氏距离,已知vec1和vec2是两个Numpy向量,欧氏距离计算如下: import numpy dist = numpy.sqrt(numpy.sum(num ...

  9. JAVA利用数组求两点距离_利用java、js或mysql计算高德地图中两坐标之间的距离

    利用java.js或mysql计算高德地图中两坐标之间的距离 2019-09-19 编程之家收集整理的这篇文章主要介绍了利用java.js或mysql计算高德地图中两坐标之间的距离,编程之家小编觉得挺 ...

最新文章

  1. centos7安装Oracle12(完整版)
  2. java BASE64流 输出图片。
  3. 【CodeForces】960 F. Pathwalks 主席树+动态规划
  4. MapReduce Java API-多输入路径方式
  5. javascript弹出div(一)
  6. 当AR落地B端行业应用,它的无限可能在哪?
  7. mysql 全连接查询合并字段
  8. Linux之软件安装YUM
  9. 数据源管理 | 主从库动态路由,AOP模式读写分离
  10. Java序列化的这三个坑千万要小心
  11. 【python】导入自定义模块
  12. 统计分析——假设检验、中心极限定理
  13. 用于创建此对象的程序是 Equation。您的计算机尚未安装此程序或此程序无响应。 若要编辑此对象,请安装 Equation或确保 Equation中的任何对话框都已关闭
  14. python保存视频中的每一帧
  15. 达摩院命名实体识别及其在阿里小蜜的应用(v2020-05-11)
  16. 中国各地区政府招投标数据
  17. Vue知识点囊括清单
  18. ccf公共钥匙盒python_CCF/CSP 公共钥匙盒
  19. 【媒体管家】媒体邀约以及媒介投放策略
  20. 110道 Elasticsearch面试题及答案(持续更新)

热门文章

  1. DevEco Studio 登录华为账户无法找到应用程序
  2. 安装centos7(从u盘启动)报错:/dev/root does not exist 问题处理过程
  3. 【Markdown】上下标
  4. DeepFM学习笔记
  5. UiBot 判断流程
  6. java后端获取前端请求参数
  7. 吴永辉5-6 (归并排序,模拟优先队列,set,哈希存储)
  8. 值得尝试的几个副业推荐
  9. web设计网页规划与设计:企业电子网站设计——简单的电子产品公司官网模板(5页)HTML+CSS+JavaScript
  10. 【转载】AT32 RT-Thread使用指南