四元数slerp插值绕远的处理方法

本文详细介绍了四元数slerp插值的公式,并指出当两个四元数乘积小于0时会出现绕远问题。为解决这个问题,提出了在计算角度前对其中一个四元数取反的解决方案,确保四元数插值的平滑性和正确性。通过示例代码展示了如何在实际应用中实施这一修正方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在很多资料上都可以找到四元数slerp插值的公式:
q t = S l e r p ( q 0 , q 1 , q 2 ) = s i n ( ( 1 − t ) θ ) s i n θ q 0 + s i n ( t θ ) s i n θ q 1 q_t = Slerp(q_0,q_1,q_2) = \frac{sin((1-t)\theta)}{sin\theta}q_0+\frac{sin(t\theta)}{sin\theta}q_1 qt=Slerp(q0,q1,q2)=sinθsin((1t)θ)q0+sinθsin(tθ)q1
其中, θ = c o s − 1 ( q 0 , q 1 ) \theta=cos^{-1}(q_0,q_1) θ=cos1(q0,q1)
但是直接套用在 q 0 ⋅ q 1 q_0 \cdot q_1 q0q1小于0时会绕远。
因此需要对其中一个取反。
例如:

if (glm::dot(glm::normalize(q1), glm::normalize(q2)) < 0) 
	q1 = -q1;
theta = acos(glm::dot(glm::normalize(q1), glm::normalize(q2)));//slerp插值得到四元数
q3 = sin((1 - between / total_time) * theta) / sin(theta) * glm::normalize(q1) + sin(between / total_time * theta) / sin(theta) * glm::normalize(q2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值