#memo

indiedev太郎

箱の上に上がる、柵を乗り越える

箱の上に上がりたい

CharacterMovementのパラメーターにはMaxStepHeightがあり、これは歩ける段差の最大の高さ、階段の1段
これが例えば30cmだとする、ここで乗り越えられる箱の最大の高さを決める、1mとする
すると、30cm ~ 1m の高さのオブジェクトには乗り越えられることになる

いきなりいろいろやると面倒なので、とりあえず、1mの箱の上に上がる処理を考えていく

アニメ作る
高さ可変をやるなら、手の位置がIKで変動する、考えるのがめんどくさい、1mFIXでアニメを打つ、適当にやる

https://i.gyazo.com/84e66ac2b0ded17f2c4e1843104768dc.gif
とのことです。

カプセルの移動問題
ルートモーションでうまいことできない挙動なので(うまいことやったらできるのかも)、アニメーション終了時にカプセルの位置を更新する必要がある
とりあえず思いついたのは、コンストラクションで指定ノード(BodyRootとか)とカプセル位置のオフセットを保存しておき、終了時の指定ノードからカプセル座標を逆算する

https://i.gyazo.com/0db688a10e6cd36c41d8408a559be31e.gif
https://i.gyazo.com/571674e2ecdfbf819f1992454abca37b.png

とやっていたけれど、どうしても1フレームテレポートのグリッチがでる、StateMachine使うともっと顕著になって、結果ブレンドも良くない
物理アニメとかもこのワープでかなりグリッチが出るので、ルートモーションで素直に作り直す

ルートモーションでやる
なんかコントローラーを移動させないと行けない気がしていて、ルートモーション無理とか思い込んでたけど、Rootノードを直接操作すればいい話で普通にできた
・そのままだとY方向のルートモーション聞かないので、アニメーション再生中は一時的にflyingモードに変える、終了で戻す
コリジョンも無効にする、ただ射撃があるようなゲームだと長時間無敵になってしまうので考える、乗り越えオブジェクト専用のプリセットを作成する等
・ルートモーション、AnimBP全体で使うか使わないか共通の設定なので、特定モーションで使う使わないがあると動きがおかしくなる、必要なアニメで設定を切り替えるようにする
・アニメ終了時に即ルートモーション設定切り替えると、AnimationPhysicsでグリッチが出るので、ちょっとDelayを挟む

https://i.gyazo.com/1c1c52e1204603312baaf24bb86297b0.gif
無事形にはなった

次は、のりこえ可能判定の処理を考えてみる、とりあえず2パターン

1.ジャンプ動作を乗り越え動作に変更するBoxを作る実装
https://i.gyazo.com/f6152724b1ba4fd9e1b8e5c0a682efa6.png

乗り越えが発生しそうなパターンを見ると、単に乗り越えポイントを指定するのが一番単純かつ確実そう
AND条件で、"プレイヤーが壁の方向を見ている"も入れる

・確実なマップデザインができる
・アセットが膨大になってくると絶対めんどくさい、設定し忘れ出る

2.Traceで自動的に乗り越えられる場所を判定する
・自動でやってくれるので超楽
グリッチでそう
アルゴリズム考えるのがいろいろレギュレーション出来てからになる

将来的には2をやり、今回は1でやってみる
変更するのは判定の部分だけなので、乗り越え実行とかは共通の物を使えるはず



残る問題は可変乗り越え高さに対する手のIK

問題が出たら追記

歩行のブレンドスペースの構築

三人称視点のプレイヤーはいろんな方向に動いて、それぞれで足の動きが異なる
代表的な動きを作り、ブレンドスペースを使用して360度動けるようになる、代表的な動きは前後左右の4つだけど、斜め移動も入れて8個あるとかなり見栄えが良くなる
更に移動自体にもシークエンスがあって、スティックの傾きに応じて 歩き(警戒)、歩き(通常)、走り くらいに切り替わると楽しい

とりあえずこの8*3の24アニメーション用意出来たとして、どのようにブレンドしていくかを考える

ブレンド方法、ブレンドスペースを使う以外にも、AnimBPやStateMachineがあるけれど、こちらはどちらかというと一瞬の切り替えの補完で、例えば一連の歩行モーション ⇔ しゃがみ歩行モーション とかに使用すると良さそう

なので、このようなブレンドスペースを構築してみる
https://i.gyazo.com/a2d1a7b51fe4433fc7a747d1feb867bf.png

更に、入力がゲームパッドのスティックの時、InputScaleはX軸Y軸で [-1.0, 1.0] なので、かなり都合がよい

ここで問題は
ゲームパッドの右上入力は(1.0, 1.0)ではなく、(0.7, 0.7)である(物理的にNormalizeされている)

・アニメーションの歩幅の変動が均一でない可能性
→例えば歩き(警戒)は24frameで50cm、歩き(通常)は1m、走りは2.8mになっている

・FLeft → BLeftへの補完の際、足の前後入れ替わりがある
→Left付近の補完で足がめり込むことになる

・キーボード入力はデジタルに0 or 1しか取れない

以下解決策
ゲームパッドの右上入力は(1.0, 1.0)ではなく、(0.7, 0.7)である(物理的にNormalizeされている)
・単に斜め移動のアニメーションをそのように作る
→例えば直進の移動距離が1mなら、Xに1m、Yに1m移動する足の動きを作ると良い
→→ゲーム内で実際に採用されるモーションの確認がしにくい、グリッチが出る可能性がある


アニメーションの歩幅の変動が均一でない可能性
ブレンドスペースにInputScaleの値を利用すると、InputScaleが1/3の時は歩き(警戒)、InputScaleが2/3の時は歩き、1の時は走りのモーションが再生される
この時キャラクターのスピードは、MaxWalkSpeed * InputScaleとなり、モーションの移動距離に緩急がある場合、床とモーションでズレが生じる

・Curveアセットを利用する
こんな風に、スピードとブレンドスペースの位置に応じたグラフを作成する、歩き(警戒)は50cm、歩き(通常)は1m、走りは2.8mの場合
https://i.gyazo.com/d263d7a0892fd76b4242792575502edc.png

InputScaleに対して、行う
https://i.gyazo.com/573ac19067c85c8774e0d89e6b84909b.png

https://i.gyazo.com/05b8c8a07910a9cbc33bd79713ee377e.gif
とのことです。

前移動、横移動間で移動距離が異なる、走れる方向は前方のみも同様の方法で対応する、あんまり計算増えてもダメそうだけど

・ていうかルートモーション使う
多分同様の結果、どっちのほうが負荷少ないんでしょうか、知りません


FLeft → BLeftへの補完の際、足の前後入れ替わりがある
足の前後関係がアニメ間で同じでないと綺麗な補完が出来ないのだけれど、左上への移動と左後ろへの移動ではどうしても前後関係が入れ替わってしまう
左右への移動をやってみた時、右足が常に前のパターンと、左足が常に前のパターン2種類があることから想像できる
→我慢する(消極的解決)
→横移動をカニ歩きにする(消極的解決)


キーボード入力はデジタルに0 or 1しか取れない
→デフォのwasdを0.5にして、Shift押下時は1.0とかにする、低速が重要ならそちらもキーで切り替えるようにする
→最後に押されたキーがキーボードかパッドかはこんなノードで取得できる
https://i.gyazo.com/43c66ddf925d90df78988fb2ef456866.png

UE4.13で追加されたPhysical Animationsについて

4.13で追加されたPhysical Animations
Unreal Engine 4.13 Released!

従来でも物理アニメーションはPhATを設定して、このボーン以下にどんくらい適応するみたいな事はできた
追加された機能の違いと使い方を確認する

現時点でまだドキュメントはなく、公式による解説動画がある
Physical Animations with Ian and Alex - Training Stream - YouTube

将来的にドキュメントが作成されているはずなので、そちらを参考にしてください
また、まだ実験機能ということで、仕様が変わる可能性があるので記事の日付をよく確認してください

続きを読む

足を傾斜に沿わせる

https://i.gyazo.com/dd740eb5e5caa1cfd2a803d198e1fd8a.png

やりたい
・足が傾斜に応答するようにする
・IKとTransformを使用してジョイントをプロシージャルに移動させる

いつIKを使うべきか
・基本的に足のIKはめり込み回避に使われるべき
・アイドルモーションでは、軸足でない側
→軸足にIKを使用して膝を曲げてしまうと、バランス取れてない感じになる
→アイドルモーションでは、低い位置にある方が軸足となる

移動中は、空中に浮いている側、軸足 の関係が常に成立している
軸足の膝は曲がるべきでなく、浮いている側はめり込ませたくない
→浮いている側の足に対してIKを使用する

高低差のある斜面を歩くとき
・高い側の軸足、低い側の軸足が発生する
・高い側が軸足の時、軸足にもIKが働く、完全に膝は伸びきることはない
・低い側が軸足の時、高い側の足がめり込む、面より浮かせるようにしないといけない

段差予測
https://i.gyazo.com/977d0f1c9cba20e70caf3ce08790430e.png


やること
・歩きアニメで足の設置時に通知を取るようにする
→軸足の検知、IKのブレンドアルファを制御する

・カプセルより下には足は行かない
→軸足が地面に接するように体を下げる必要がある
→→1. カプセルを見た目より小さくとって、Zを上げる方法
→→2. Transformでルートジョイントを下げる方法
→→→崖とかでこれが働くとまずいので、程よい長さに制限する、崖際の見た目は諦める
https://i.gyazo.com/461c1e5e73442933d8319de3fa81d1d9.png

・CharacterMovementのMovementModeは勝手に変わってしまうので、アニメ制御用のムーブメントステートを用意する




参考
IK / FABRIK blueprint tutorial for proper foot placement with capsule collision

SubstancePainterでネジ穴

https://i.gyazo.com/f4ca4b4973365325b3db3bc8f781d845.png

Toolsにネジ穴あるけど、自分で用意出来たらハッピー
流れは、Designer側でネジのマップをまとめたsbsを作って、それをSPで使います

モデル準備
https://i.gyazo.com/2d06a89aa5f4d5c2229f40ee3d9c5351.png

・ベイク用の板ポリとベイク元のメッシュ2つを用意しておく
・ベイク元はトポロジーどうでもよく、ハイポリがいい
・ネジ穴のバッファというかへこみみたいなものもベイクしちゃったほうがそれっぽくなる

SDでベイク
https://i.gyazo.com/9b82c43ae9e121d6aecb7ad29e4e1e7e.png

・インポートした板ポリを右クリックでBake設定、必要そうなマップを追加していって(Height, Normal, AO)、ハイポリメッシュを指定する
・Cageは板ポリだと多分使えないので、MaxDistanceを適当にする、どっちも1.0で問題なさそうな感じがある
・ファイルフォーマットをpsdにしておくと、16bitでやってくれる
・デティールは貼り付けるモデルのテクセルに依存するので、こっち側のサイズはあんま関係なく、好きなサイズにしておく

アウトプット
https://i.gyazo.com/9c123fcd69cf5749b819b85ef9cfe8ea.png

好きな感じにノードをやっていく、SPで使用するチャンネルは
BaseColor
Metalic
Roughness
Normal
Height
Mask
なので、これをアウトプットするようにしておく
ネジ穴周囲のへこみは、向こう側のマテリアルなので、heightとnormalだけ乗るようにマスクをしている

SPで読み込む
Materialsのとこにsbsasを突っ込むとインポートされる、ToolsのScrewBoltを選択し、Materialを追加したものに変更すると自分だけのネジ穴が打てるようになる

Toolsに登録する
https://i.gyazo.com/ebdb17f5c34f1e957d8a0e44186ab881.png

いい感じの設定になったら、ブラシのサムネイルのとこを右クリックすると、ツールに登録できる
マテリアルとかテクスチャは、参照できるのが現在のプロジェクトからだけとかだけど(インポート時の設定)、ツールは登録した時点でプロジェクト全体から使えるようになる
sbsarファイルとかをMaterialタブに保存しておく必要はなくて、すべて.spprというファイルに書き出されている
このファイルは、マイドキュメントのSubstancePainter2\shelf\presets\toolsにあります

アニメについてのメモ

過去
ルートモーションについて
miyahuji111.hatenablog.com

09/08
歩きの種類について
歩きといっても、敵がいる状態での歩き、町中の歩き、いろいろコンテクストがある

09/11
AnimMontageについて
Unreal Engine | AnimMontage
Unreal Engine | 加算アニメーションを使用する

09/13
足のIKについて
miyahuji111.hatenablog.com

09/17
移動速度、距離について
CharacterMovementのMaxWalkSpeedは1秒間の移動距離なので、そこでいい感じの値を見つける
アニメ作るとき、この数値を1秒間で移動させる距離にする、24fpsなら24フレームでこの距離で動きを作る

Physical Animationsについて
miyahuji111.hatenablog.com

09/18
歩行のブレンドスペースの構築について
miyahuji111.hatenablog.com

AnimDynamics / 髪のシミュレーション

髪の動きやる、いくつかの方法あるのでどれが良さそうか見ていく、初音ミクちゃんくらい長い髪はまた違うと思うので、長さ別にも見る、また髪の作り方も何パターンかある、バリエーション

いくつか、以下です
1. 手付アニメ
2. PhAT(物理アセット)
3. AnimDynamics
4. APEX Clothing

続きを読む