我已经陷入困境了!我正在处理我的第一人称射击游戏的延迟问题,现在只需要添加一些外推功能。 我可以外推位置;从最后两个位置和它们的速度中获取,然后将速度加到现有位置(×delta时间)。 然而,我无法为旋转执行相同的操作。 默认情况下,角度是欧拉角,但我可以(并且会)将它们转换为四元数,因为它们可能会发生万向锁定。 如何从2个先前的方向外推新的方向? 我有数据包之间的时间,2个数据包和当前方向。
我已经陷入困境了!我正在处理我的第一人称射击游戏的延迟问题,现在只需要添加一些外推功能。 我可以外推位置;从最后两个位置和它们的速度中获取,然后将速度加到现有位置(×delta时间)。 然而,我无法为旋转执行相同的操作。 默认情况下,角度是欧拉角,但我可以(并且会)将它们转换为四元数,因为它们可能会发生万向锁定。 如何从2个先前的方向外推新的方向? 我有数据包之间的时间,2个数据包和当前方向。
Quat qc = QuaternionMultiply(qb, QuaternionInverse(qa)); // rot is the rotation from qa to qb
AxisAngle axisAngleC = QuaternionToAxisAngle(qc); // find axis-angle representation
double ang = axisAngleC.angle; //axis will remain the same, changes apply to the angle
if (ang > M_PI) ang -= 2.0*M_PI; // assume rotation to take the shortest path
ang = fmod(ang * t,2.0*M_PI); // multiply angle by the interpolation/extrapolation factor and remove multiples of 2PI
axisAngleC.angle = ang;
return QuaternionMultiply(AxisAngleToQuaternion(axisAngleC),qa); // combine with first rotation
如果你将两个方向表示为向量,它们的向量叉积将给出旋转轴,而向量点积可用于找到旋转角度。
然后,您可以以与计算标量速度相同的方式计算角速度,并使用它来计算围绕先前确定的轴的外推旋转。