標籤:c 動畫 3d c++ animation
接第一章 http://blog.csdn.net/zhuyingqingfen/article/details/38110611 4.2 Vectors 和 Quaternions
Vectors 和 quaternions 是CAL3D庫中比較重要的部分。骨骼的移動,蒙皮定點的位置、蒙皮法線的朝向都儲存在一個vector中。每當一個旋轉的時候就會用到Quaternions,比如一個關節。相比於旋轉矩陣matrices ,在interpolation和 memory usage 方面 quaternions有著巨大的優勢。這就是為什麼在Cal3d庫中你看不到Matrices的身影。如果你從矩陣matrices中的旋轉資訊,你可以很容易地轉換為quaternions 的形式。
4.3 Skeletons 和 Bones
Cal3D被設計成基於骨架的動畫系統。意思是說動畫模型所有的蒙皮頂點都被依附在一個或幾個骨架結構的骨骼上。這就使得整個模型的動畫變得很容易,你只需要調整骨架的姿態,蒙皮就會自動的進行調整姿勢。這種把蒙皮依附在骨骼 的階層上的方法被稱作”Skinning“.
一個骨骼(bone)是通過相對於其父骨骼的相對轉換(transformation)來定義。這個變換資訊被分成兩個獨立的部分:相對平移(translation)資訊儲存在一個vector中,而相對旋轉資訊儲存在一個quaternion中。一個骨骼的絕對變換是在一個Animation幀後通過遞迴計算得到的。
回想一下Cal3D中共用資料概念,核心骨架類(core skeleton)和 它的核心骨骼類(core bones)包含有如初始化骨架姿態、骨骼名稱和他們繼承關係的資料。而骨架和骨骼執行個體只儲存了當前的轉換資訊和對應當前骨架或骨骼的連結資訊。
4.4 Animations、Tracks、Keyframes
Cal3d中在Core model類中的Core animation裡儲存了每個運動如行走、跳躍、揮手等等。這些動畫針對每個受具體運動影響的骨骼(bone)都包含一個核心的軌跡(core track)。
Example 4-2 揮著手的步行者
比如一個像人的模型正揮著他的右手行走。在這個想定中含有兩個動畫,一個是行走動畫,另一個是揮手動畫。那個行走動畫最有可能為每個有著完整動畫模型的骨骼包含有一個track。而那個揮手的動畫可能是會被定義成局部的,這樣只有右手、胳膊、肩膀或者可能還有脖子的資料被儲存。這種選擇性的包含允許我們有一個強大的混合。
一個骨骼(bone)的轉換資料事實上儲存在對應軌跡(track)中的幾個核心幀(core keyframes)類中,每一幀在一個具體的時間點上含有一個相對於父骨骼的平移和旋轉資訊。這些值通過CAL3D進行在兩幀之間插值來獲得平滑的運動效果。
上面這些所有的這些資料可以被不同的模型執行個體進行共用,因而這些資料全部儲存在核心類裡(core classes)。而動畫的啟用和融合狀態(blending state )使得他們在執行個體之間各不相同,所以這些值在每個執行個體中分開定義(存貯)。