自分の手の動きをAnimationClipに保存してみる


どうも、睦月ハツカです。

今回はAnimationClipの使い方についてメモを残していきたいと思います。

0.どんなの作ったか

こんなの

これはMMDのダンスモーションを見ながら自分で踊ってました。中盤ほとんど追いつけてないですw

右側にちょこまか動いてる白い球が今回の手法を使用してAnimationClipに保存した右手の動きです。
PCの動作速度にも影響されるかもしれませんが、AnimationClipに保存してるので後から自分で調整することもできなくはないかと思います。

1.やりたいこと・使い道

今回やりたい事は、手の動きをAnimationClipに保存することです。

手の動きをどうやってとるかというとOculus touchやHTC viveのコントローラの座標とその変化をAnimationClipに保存します。

これはもともと、作成中のVR音ゲーのガイドラインとして使用するつもりでスクリプトを作成しました。
また、それ以外にも割と使い道があるんじゃないかなと思っていまして、例えば、

  • Final IKのVRIKと組み合わせてVRChatのEmoteをキャラクターの動きを作成
  • まるでおもちゃの飛行機でブンドドするようにしてアトラクションの順路を自分でなぞって作成

などができるかもしれません(実際にはまだ作ったことがないので、実装する時には相当手を加える必要があるかと思われますが…)

 

2.準備する物、使用するメソッドなど

  • VRコントローラ
    Oculus touch
    HTC vive
  • クラスとかメソッド、コンストラクタとか
    • AnimationClip
      アニメーションの情報を保存してあるクラスです。
      ここにAnimationClipのアセットをインスタンスとしてセットしたり、スクリプトから新規作成することもできます。

      • SetCurve
        アニメーションクリップにアニメーション情報をセットするメソッドです。
        セットするのはAnimationCurveインスタンスと決まっているので、先にAnimationCurveインスタンスを作成する必要があります。
    • AnimationCurve
      アニメーションの変化をカーブとして記録します。インスタンス化する時は一つのインスタンスにつき一つの変数を紐づけることができます。
      例えば、座標の動きならX座標、Y座標、Z座標と3つのAnimationCurveインスタンスを用意する必要があります。

      • AddKey
        AnimationCurveにキーフレームを挿入します。Keyframeの変数を引数に必要ですが、float型変数二つでもOKなようです。
    • Keyframe
      キーフレームの情報を格納します。格納できる変数はそれぞれfloat型で順番に時間とパラメータとなっています。
      AddKeyメソッドに使用するとKeyframeに入力した時間にAnimationCurveで設定した変数をKeyframeのパラメータの値にします。
    • Time
      Unityでゲームを実行する際の時間に関連するクラス。基礎としてよく扱われてますね。
      今回は別のスクリプトとしてスタートからの時間を数えるために使用します。

      • deltaTime
        これは次のUpdate関数が呼び出されるまでの時間を返します。つまりは1フレーム間の時間をこれで取得できます。これを累積させることで時間経過を数えます。

3.大雑把な作り方

スクリプトはAnimationCreater、TimeManagerとして分けて作成していきます。
AnimationCreaterはアニメーションを作成するためのスクリプト
TimeManagerは時間を数えるためのスクリプトでAnimationCreaterの補助的な役割をしてもらいます。

AnimationCreater
public class CreateAnimation : MonoBehaviour {
  [SerializeField] AnimationClip animationClip;
  [SerializeField] AnimationCurve animationX;
  [SerializeField] AnimationCurve animationY;
  [SerializeField] AnimationCurve animationZ;
  [SerializeField] Transform conPos;
  [SerializeField] TimeManager timeManager;

  // Use this for initialization
  void Start () {
    timeManager = GetComponent();
    animationX = new AnimationCurve();
    animationY = new AnimationCurve();
    animationZ = new AnimationCurve();
    if(!animationClip){
      animationClip = new AnimationClip();
    }
  }
  void Update () {
    animationX.AddKey(timeManager.currentTime,conPos.TransformPoint(conPos.position).x);
    animationY.AddKey(timeManager.currentTime,conPos.TransformPoint(conPos.position).y);
    animationZ.AddKey(timeManager.currentTime,conPos.TransformPoint(conPos.position).z);
    if(Input.GetKeyDown(KeyCode.Space)){ //曲が終わったら(スペースキーを押下)アニメーションを出力
      animationClip.SetCurve("",typeof(Transform),"localPosition.x",animationX);
      animationClip.SetCurve("",typeof(Transform),"localPosition.y",animationY);
      animationClip.SetCurve("",typeof(Transform),"localPosition.z",animationZ);
    }
  }
}
TimeManager
public class TimeManager{
  public float currentTime = 0f;
  
  void Update(){
    currentTime += Time.deltaTime;
  }
}

スクリプトの全体はこんな感じです。

これらのTimeManager、AnimationCreaterを適当なオブジェクトにアタッチします。
(今回の場合はCreate→Enptyで空のGameObjectを生成して、それの名前を変更してアタッチしています。)

このように、アタッチしたオブジェクトのinspectorに作成したスクリプトが表示されます。
また、[SerializeField]を先頭につけたインスタンスがエディタに表示されるようになります。

これを踏まえて簡単な手順は

  1. UnityエディタからOculus touch、HTC Viveのコントローラオブジェクトの直下にオブジェクトを配置(これをAnimationClipに保存するオブジェクトの座標として扱います。Sphereとかを配置しておくと分かりやすいです。)
  2. AnimationClipアセットを1.のオブジェクトにドラッグ&ドロップしてオブジェクトとAnimationClipを関連づけます。
  3. コントローラ直下に配置したオブジェクトをconPosに設定(これでアニメーションクリップに保存するTransformの設定が完了)
  4. AnimationClip欄にAnimationClipアセットを設定(設定したAnimationClipは情報が上書きされるので新規で作ったものを設定するように)
  5. TimeManager欄に同じオブジェクトに登録されているTimeManagerを設定(これによってキーフレームに設定する時間をカウントできるようになる)
  6. デバッグモードで再生!コントローラをもっていろいろ動いてみましょう。(再生中はずっっとAnimationClipに記録し続けています)
  7. 記録したい動作をした後はスペースキーを押してAnimationClipに保存!(間違えて再生ボタンで戻らないように!動いたデータがパアになります。)

一連の動作をするとこんな感じ

 

これでAnimationClipに自分の手の動きを保存できました。

細かいところは後々補足できたらいいなって感じです。

 

今回はこれくらいで。それでは。

Unityゲーム プログラミング・バイブル
  • 吉谷 幹人, 布留川 英一, 一條 貴彰, 西森 丈俊, 藤岡 裕吾, 室星 亮太, 車谷 勇人, 湊 新平, 土屋 つかさ, 黒河 優介, 中村 優一, 牙竜, コポコポ, かせ, hataken, monmoko
  • 価格   ¥ 4,968 prime
  • 販売者 Amazon.co.jp
クリックして今すぐチェック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です