我想實現骨骼動畫在我的遊戲引擎和我有插值問題。GLM ::混合返回無效四元
每個幀,我想幀之間進行內插,因此我具有類似於此代碼:
// 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)
(錯誤)
(是的,我知道它是相同的值之間插值)。
我還沒有準確掌握四元數是如何工作的,但這對我來說似乎很奇怪。
這是真實的(不幸)許多三維幾何操作。例如,如果你做'cross(a,a)',你會得到什麼?不良。但是,我不明白這對於兩個四元組之間的隔離可能是一個問題。 – Puppy 2012-07-20 02:24:43
您是否認爲這只是GLM的四元數slerp實現中的一個錯誤? – 2012-07-20 03:27:54
@NicolBolas我想這是可能的。我剛開始考慮它,但經過一段時間的搜索後,我找不到任何有問題的人。我現在要睡覺了,但我會明天嘗試推出自己的斯勒普功能,看看它是否有效。 – Merigrim 2012-07-20 03:41:23