今回の記事は、アニメーションに関する記事です。
設計の大まかな指標ができたので記事を書くことにしました。
(メモ代わり)
ゲームエンジンが発展してきた今、
下位層のシステムを触る人間は少ないかもしれませんが
知っておくことで損をするということはないと思うので皆も勉強してみよう。
アニメーションシステムを作り直すことに当たって
こちらの本を読みました。(執筆段階では、まだ半分・・・)
www.amazon.co.jp
以前にも、アニメーションシステムは作成していたのですが
上位層のシステムを作ってからの作成、
クラス設計もUnityを無理に真似たので
Runtimeにリフレクションを使用して変数をクラスから貰ってくる
等、完全に独立していない状態でしたね。
この時は、スキニングなんかでアニメーションとグラフィック依存しちゃうのも
仕方ないよねと自分を納得させながらも気持ち悪さが拭えない状態でした。
ただ今回は、そこを完全に独立させ
こちら側で行列パレット(スキニングで使用するあれ)を
作るからあとはよろしく状態にしてあります。
出来たもの(未完)
ここからは、一つずつ説明していきたいと思います。
(前回の反省を踏まえて)
*Keyframe
前回と変わりませんが
struct Keyframee {float value,float time;}の2つの変数しかありません。
ベジェ曲線をまだ実装していない為,ControlPointなし
これをOgreEngineのような(うる覚え)
TransformKeyframe{Vector3,Quaternion,Vector3;}
のようにするとスケールが動かなかったりと
使用しないものが現れた時の無駄が生じるので最小のものにしました。
(上記で紹介した本にも書いてあります)
*AnimationCurve
前回とあまり変わりないので説明なし
ここからが大きく変わった所
*Skeleton
前回のAvatarと似たようなもの(変わったと言っておきながら似たようなものとは)
Avatarクラスは、上位層のシステムとの橋渡し的な存在だったもの。
行列パレットは上位層が持っておりその値を変更する流れ。
Skeletonクラスでは、行列パレットを持っており
上位層がSkeletonから行列パレット情報を貰ってくる仕組み。
上記の依存を取り払った感じになる。
*Joint
ジョイント階層構造用
親子関係処理が入っている。フォワードキネマティクス(FK)処理
前回の上位層のGameObjectが行っていたものと同じ。
*AnimationChannel
前回はなかったもの、正確には前回のAnimationProperty〇〇と似たようなもの
(変わったと言っておきながら似たようなものとは 2回目)
Propertyクラスは、Avatarクラスから変更するオブジェクトを検索
そのオブジェクトの変数ポインタを取得(なんちゃってリフレクション)
直接処理するという処理になっていた。
Channelの方では、取得したキーフレーム情報を返すだけにとどめておいてある。
(理由は後述 BlendTree,AnimationLayerに続く)
x,y,z,wでそれぞれのアニメーションカーブが、
時間に基づいたキーフレームを取得していた。
ここに関しては、
一長一短だが今回は時間を共通にしているのでキーフレーム検索回数が減る。
(非共通版も追加するかも)
*AnimationClip
前回のがMap<処理対象オブジェクト名,処理プロパティ>
といった風に一つのAvatarに対して1:1の関係になっていた。
今回のでは、AnimationChannel*[]といった
一つのジョイントに対して1:1の関係になるようにした。
*AnimationState
前回とあまり変わらない
AnimationClipからAnimationに変更された
*Animation
今回新しく追加されたもの
StateMachineを他のアニメーションにも使用したい為、導入
*SkeletalAnimation : public Animation
スケルタルアニメーション用クラス
今回から実装、AnimationClip or BlendTreeから算出されたデータを
処理する。
レイヤー情報から処理方法を変える。
*AnimationLayer
前回のものがフェイシャルアニメーション用
スケルタルアニメーション用と
レイヤーとしての面目は立っていたがそれだけで
加算レイヤーなどの処理がなかった。
*FlipbookAnimation
*SpriteAnimation
今回は、触れません。
今後、IKの処理等を入れられるようにしたい。
前回のはPMX依存の処理だった
歩きなどの地面との衝突などは考えていなかった。
グラフィックのクラス設計(うっ頭が)
環境への適応頑張るぞい!