Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Animator As Code As JSON As Model

Animator As Code As JSON As Model

Animator As Code のコードを Rust から作るために JSON を Blender から吐く話です。まわりくどすぎるだろ

https://github.com/kb10uy/sk2aac

Yū Kobayashi

July 31, 2022
Tweet

More Decks by Yū Kobayashi

Other Decks in Programming

Transcript

  1. Animator As Code
    As JSON
    As Model
    kb10uy / 日下夏稀

    View Slide

  2. はじめに (02:32:25)
    ● 各スライドを書きはじめた時刻を見出しに付与しています
    ● もう 19 時間しかないですね
    ● まず寝ます

    View Slide

  3. 自己紹介 (02:33:19)
    ● kb10uy / 日下夏稀
    ● VRC-LT 登壇 2 回目
    ● Rust や HLSL を書いたり、
    オンゲキ15.7 や Arcaea11.6 をプレイしている
    ○ どっちもデカいアプデとエンディングがやってきて大変
    ● Skeb 依頼納品数が 30 を超えた(今朝も納品された)
    ● Pixel 6a を買った

    View Slide

  4. 動機 (12:33:26)

    View Slide

  5. 僕のアバターセットアップについて (12:33:47)
    ● 表情はハンドサインではなく Action Menu からパーツごとに調整可能なように設計
    している
    ● つまり Animator Controller のレイヤーが表情パーツ単位になる
    ● 更に BlendShape 単位で Animation が生える
    ● するとどうなる?

    View Slide

  6. 誰か助けてください (12:35:01)
    ● これら全て手作業で作っています
    ● 1 アバター
    あたり
    2~3 時間
    かかる

    View Slide

  7. どう考えても自動化できる (12:47:05)
    ● BlendShape それぞれに対応する安全な名前の Animation を作る
    ● Expression Parameter をパーツごとに割り当てる
    ● Int/Bool に応じて Enter → Disabled → Enabled (No.*) → Exit という
    流れの Animator Layer を作る
    ● 助けて Haï えも~ん!

    View Slide

  8. Animator as Code (13:02:19)
    ● Haï~ 氏による UnityEditor 拡張
    ● "Fluent" に Animator Controller などの
    構成を記述できる
    ● むしろ今までなんで使ってなかったんだよ
    と言われればそうなんだが……

    View Slide

  9. UnityEditor の C# コードを書きたくない (13:04:38)
    ● UI パネルとか作るのを考えるとダルそうすぎてやりたくなかった
    ● あと一旦 BlendShape とパーツ名の対応の情報を書き出してもう一回 JSON か何
    かで戻してあげる必要があるのも美しくない
    ● 微妙に古い C# を書きたくない
    ● さてどうしよう?

    View Slide

  10. そうだ! Blender 拡張だ! (13:07:07)
    ● 改変をするときは毎回 Blender を経由している
    ● ではその時点で Shape Key の情報を出力してあげればいいのではないか?
    ● まあオブジェクトのコンテキストメニュー生やすぐらいだし簡単やろ(適当)
    ● でも入力・生成部分で C# 書かなきゃいけないのは変わらなくない?

    View Slide

  11. そうだ! Rust だ! (13:08:35)
    ● もはや Rust を書きたいだけでは?
    ● Blender で出力した情報を Rust で書いた専用アプリに食わせる
    ● 専用アプリから、「Animator as Code を使って Animator Controller を構築する
    C# コード」を吐かせる
    ● UnityEditor C# と格闘しなくて済む!やったね!(本当かな?)

    View Slide

  12. 今から実装します (13:10:28)

    View Slide

  13. Blender プラグインができました (15:26:20)
    ● 選択したオブジェクトの Shape Keys をいい感じの構造
    の JSON にしてログメッセージに出力する
    ● もはやファイルに出力すらしない
    ● アニメーション名やグループの編集だけは手動でやるし
    かない
    ○ 何らかのヒューリスティックな補助は実装できるかも
    ● あとはいい感じに階層構造を調整
    ● ちなみに顔のオブジェクトだけで数百行の JSON が生成
    されます

    View Slide

  14. 対応する serde 用構造体が定義できた (16:58:21)
    ● まあこれは大体書くだけ
    ● serde は本当によくできたシリアライゼーションフ
    レームワークなので他言語メインの人も適宜調べて
    みてね
    ● #[serde(flatten)] 本当にありがとう

    View Slide

  15. AAC の生成メイン部分が生成できた (18:42:45)

    View Slide

  16. まあこれだけでは動きませんが (18:43:30)
    ● Create() するべき中身だけ書いているので実際に MonoBehaviour として動かす
    にはもうちょっと細工が必要
    ● でも多分動くでしょう(?)
    ● さすがにこれ以上動作を詰めてると間に合わないか?

    View Slide

  17. 間に合った (19:39:07)

    View Slide

  18. まとめ
    ● やたら迂回して AnimatorController の生成を楽にした
    ● 人間やれば割と間に合う
    ● GitHub: kb10uy/sk2aac

    View Slide