ゲームエンジンにスケルタルアニメーションを実装しようとしていますが、補間に問題があります。
各フレーム、フレーム間を補間したいので、次のようなコードがあります。
// 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)
。
これらはいくつかの値の例とその結果です(3つのケースすべてにあることに注意してください)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)
(正しくない)
(はい、同じ値の間を補間していることを認識しています。)
クォータニオンがどのように機能するかはまだ正確には把握していませんが、これは私には奇妙に思えます。