ARCore中四元数的插值算法实现

ARCore中四元数差值算法:

其中t的取值范围为[0, 1],当 t = 0 时,结果为a;当t = 1 时,结果为b。

 1   public static Quaternion makeInterpolated(Quaternion a, Quaternion b, float t) {
 2         Quaternion out = new Quaternion();
 3         float cosHalfTheta = a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
 4         if(cosHalfTheta < 0.0F) {
 5             b = new Quaternion(b);
 6             cosHalfTheta = -cosHalfTheta;
 7             b.x = -b.x;
 8             b.y = -b.y;
 9             b.z = -b.z;
10             b.w = -b.w;
11         }
12 
13         float halfTheta = (float)Math.acos((double)cosHalfTheta);
14         float sinHalfTheta = (float)Math.sqrt((double)(1.0F - cosHalfTheta * cosHalfTheta));
15         float ratioA;
16         float ratioB;
17         if((double)Math.abs(sinHalfTheta) > 0.001D) {
18             float oneOverSinHalfTheta = 1.0F / sinHalfTheta;
19             ratioA = (float)Math.sin((double)((1.0F - t) * halfTheta)) * oneOverSinHalfTheta;
20             ratioB = (float)Math.sin((double)(t * halfTheta)) * oneOverSinHalfTheta;
21         } else {
22             ratioA = 1.0F - t;
23             ratioB = t;
24         }
25 
26         out.x = ratioA * a.x + ratioB * b.x;
27         out.y = ratioA * a.y + ratioB * b.y;
28         out.z = ratioA * a.z + ratioB * b.z;
29         out.w = ratioA * a.w + ratioB * b.w;
30         out.normalizeInPlace();
31         return out;
32     }

 

posted on 2017-09-05 17:49 bky2016 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/calence/p/7479867.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值