アニメーションシステム

今回の記事は、アニメーションに関する記事です。

設計の大まかな指標ができたので記事を書くことにしました。

(メモ代わり)

 

ゲームエンジンが発展してきた今、

下位層のシステムを触る人間は少ないかもしれませんが

知っておくことで損をするということはないと思うので皆も勉強してみよう。

 

アニメーションシステムを作り直すことに当たって

こちらの本を読みました。(執筆段階では、まだ半分・・・)
www.amazon.co.jp

 

以前にも、アニメーションシステムは作成していたのですが

上位層のシステムを作ってからの作成、

クラス設計もUnityを無理に真似たので

Runtimeにリフレクションを使用して変数をクラスから貰ってくる

等、完全に独立していない状態でしたね。

 

github.com

この時は、スキニングなんかでアニメーションとグラフィック依存しちゃうのも

仕方ないよねと自分を納得させながらも気持ち悪さが拭えない状態でした。

 

ただ今回は、そこを完全に独立させ

こちら側で行列パレット(スキニングで使用するあれ)を

作るからあとはよろしく状態にしてあります。

 

出来たもの(未完)

github.com

 

ここからは、一つずつ説明していきたいと思います。

(前回の反省を踏まえて)

 

*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依存の処理だった

歩きなどの地面との衝突などは考えていなかった。

 

グラフィックのクラス設計(うっ頭が) 

 

環境への適応頑張るぞい!