我正在尝试在我的游戏引擎中实现骨骼动画,但插值有问题。
每一帧,我想在帧之间进行插值,因此我有类似这样的代码:
// This is the soon-to-be-interpolated joint
Joint &finalJoint = finalSkeleton.joints[i];
// These are our existing joints
const Joint &joint0 = skeleton0.joints[i];
const Joint &joint1 = skeleton1.joints[i];
// Interpolate
finalJoint.position = glm::lerp(joint0.position, joint1.position, interpolate);
finalJoint.orientation = glm::mix(joint0.orientation, joint1.orientation, interpolate);
最后一行是问题所在。的方向finalJoint
有时会是(-1.#IND, -1.#IND, -1.#IND, -1.#IND)
。
这些是一些示例值及其结果(请注意,interpolation
在0.4
所有三种情况下):
joint0.orientation = (0.707107, 0.000242, 0.707107, 0.0)
joint1.orientation = (0.707107, 0.000242, 0.707107, 0.0)
finalJoint = (-1.#IND, -1.#IND, -1.#IND, -1.#IND)
(不正确)joint0.orientation = (-0.451596, -0.61858, -0.262811, -0.586814)
joint1.orientation = (-0.451596, -0.61858, -0.262811, -0.586814)
finalJoint = (-0.451596, -0.61858, -0.262811, -0.586814)
(正确的)joint0.orientation = (0.449636, 0.6195, 0.26294, 0.58729)
joint1.orientation = (0.449636, 0.6195, 0.26294, 0.58729)
finalJoint = (-1.#IND, -1.#IND, -1.#IND, -1.#IND)
(不正确)
(是的,我知道它在相同的值之间进行插值。)
我还没有完全掌握四元数是如何工作的,但这对我来说似乎很奇怪。