UnityでIK

疲れた

 記事を書く前にものすごく疲れてしまいました。ブログ記事の扉絵は必ず描くようにしているのですが、およそ6割描けたタイミングで悲劇が訪れました。ブルースクリーン。ブルースクリーン。ブルースクリーン。おのれ!! またお前か!! WINDOWS 7 の時はあんなに一か月以上も電源入れっぱなしで激しく使い倒しても全く落ちなかったというのに!! WINDOWS 10 !!! お前めっさ落ちまくりじゃないですか!!!

とまぁ、がんばってもう一度描き直しました。がんばって描き直したので最初より良く描けてると思う(当社比)

さて、本題に入りましょう。

IKやるぜ

 本日は Unity 公式マニュアルの IK のページを参考にしながらやってみたいと思います。 せっかくなので SculptrVR smooth beta を使用してモデリングして Blender できちんと補正して mixamo でリギングして Unity にもってきてから IK を適用するところまでやってみたいと思います。

SculptrVRでモデリング

 モデリングする様子をスクリーンショットでご覧ください。と思ったら、スクリーンショットが全部真っ黒でした。うーむ、オープンベータだから細かい不具合とかはしょうがないかな。それでもかなり描けます! できあがりはこんな感じです。 実際に作ってる画面では取れなかったので、Blender 内でレイヤー事に分けて表示したものになります。

  • まずはミラーモードにして骨を作ります

  • 骨に肉をつけてプロポーションを整えます

  • 服を着せます

  • 顔と髪の毛を追加します

 モデリングした後は、保存してから FBX 形式でエクスポートします。モデリングはここまでです。

Blender で微調整

 次は、Blender にエクスポートした FBX を読み込んで調整します。作業内訳はこんな感じです。

  • 余分なレイヤーを削除
  • 編集モードでスケールを調整し、メッシュを回転させ、原点を足元に設定
  • mixamo でリギングさせるために Blender から FBX をエクスポートする

  • Blender を起動する

  • X を押下して初期画面のキューブを削除

  • ファイル → インポート → FBX (.fbx)

  • インポートするファイルを選択して FBXをインポート をクリック

  • SculptrVR の FBX をインポートしたら SculptrVR の親子ノードを全て展開する
  • SculptrVR 内部でのレイヤーは親子関係で構成されているため、これらの親子関係を解消し、単一のオブジェクトに変換する作業を行う

  • 子階層のオブジェクトノードを一つクリック
  • マウスカーソルを 3D ビューまで移動させる
  • Alt + P を押下
  • トランスフォームを維持してクリア をクリック

  • するとこのように親子関係が解除される

とりあえず、残りのオブジェクトも全部同様に親子関係をトランスフォームを維持してクリアする

  • 今回のデータでは先に作った下書きの骨レイヤーが不要になるので削除しておく

  • 骨レイヤーを右クリックして削除する

  • 次に、親子関係を解除したオブジェクトを全て選択する
  • 最初に一つクリックした後は残りのオブジェクトを全て Shift を押しながらクリックする

  • 全部クリックした状態

  • Ctrl + J を押下し、選択したオブジェクトをひとつのオブジェクトに統合する

  • 統合した状態

  • 統合したオブジェクトを選択した状態で、モディファイアをクリック
  • 追加をクリック
  • ポリゴン数削減をクリック

  • 比率をクリック

  • 0.01 と入力して ENTER

  • 適用をクリック

  • HTAB を押下して編集モードへ移行する

  • S を押下
  • 0.01 を入力して ENTER

  • テンキーの 1 を押下
  • テンキーのピリオドを押下
  • 正面から見た状態なのに、オブジェクトは横を向いている
  • 回転させて正面を向かせる必要がある

  • R を押下
  • Z を押下
  • 270 を入力して ENTER

  • 少しズームアウトして原点を確認する
  • G を押下
  • マウス操作でオブジェクトの足元を原点まで移動させる

  • 正面から見た図で足元が原点に移動できた図

  • テンキーの 3 を押下
  • 横から見た図でも原点に足元があるので今回はこのまま
  • もし横から見た図でもズレている場合は先ほどと同様に修正を行う

**以上で Blender での修正は完了 **

  • ファイル → 名前をつけて保存 をクリック

  • ファイル名を適宜入力し、Blender ファイルを別名で保存 をクリック
  • 別に別名でなくても普通に保存でもおk

  • ファイル → エクスポート FBX (.fbx) をクリック

  • ファイル名を適宜入力して FBXをエクスポート をクリック

以上で、Blender での作業は全て完了です。

mixamoでリギングする

 Blender でリングするのは以前やったので、今回は mixamo というサイトを利用してリギングしてみます。mixamoにアクセスします。

  • 初めての人は SIGN UP FOR FREE をクリック
  • Adobe アカウントを持っている人は LOGIN をクリック
  • ごめんなさい、すでに自分はアカウントを持っているので LOGIN をクリックした手順で説明します
  • LOGIN をクリック

  • メールアドレスとパスワードを入力し、Sign in をクリック

  • UPLOAD CHARACTER をクリック

  • Blender からエクスポートした FBX を点線の枠内にドロップする

  • ドロップするとアップロードが始まり

  • キャラクターが原点にいない場合、多分キャラクターは画面の外に表示されているので結果的に何も表示されない状態になる
  • 読み込みが完了すればキャラクターが表示されるので、矢印ボタンでキャラクターを正面に向くように調整し、NEXT をクリック

  • 次に間接のマークをガイダンスに従ってキャラクターに設置する

  • 今回のモデルは指が省略しているモデルなので、2 Chain Fingers(41) を選択し、NEXT をクリック

  • リギング中・・・

  • リギングが完了
  • この図、どうみても肩間接の位置がおかしい
  • でも無視して NEXT

  • NEXT

  • 完了
  • 左のアクションから適当なものを選ぶとインポートしたキャラクターが動きます
  • 動きを確認しましょう

  • リギングした FBX をダウンロードします
  • DOWNLOADをクリック

  • とりあえずデフォルトで OK
  • DOWNLOAD をクリック

  • ダウンロードが開始され

  • ファイルを保存

以上で、mixamo での作業は完了です。「VRChatインしてみるか」の記事から mixamo でのリギングまでの手順を確認に来た人は、このあとの作業はこちらをクリックして戻れます。

UnityでIK制御する

  • Unity を起動する

  • New

  • 適宜プロジェクト名を入力し、Create project をクリック

  • 先ほど mixamo からダウンロードした FBX を Unity の Project ビューへドロップしてインポート

  • Project ビューのモデルをクリック
  • Inspector ビューの Rig をクリック
  • Animation Type を Humanoid に設定
  • Apply をクリック

  • Project ビューのモデルを Hierarchy ビューへドロップし、シーン内にモデルを配置する

  • Hierarchy ビューのモデルのツリーを展開し、Camera と Lamp を Ctrl + クリックで2つ選択状態にする
  • 反転状態になったファイル名を右クリックし、Delete をクリック

  • プレハブとの関連性が壊れるけどいいの? と聞かれるけど構わず Continue する

  • ドーン!!
  • 色がついてない
  • 頂点カラーを有効にするために頂点カラーシェーダを適用する
  • 頂点カラーシェーダー をダウンロードする

  • ダウンロードしたファイルを Project ビューにドロップする

  • Project ビューの VertexColor シェーダを VertexColor マテリアルにドロップする

  • Project ビューの VertexColor マテリアルを Scene ビューのモデルにドロップする

  • シャキーン!!!
  • それにしても手なげぇなおい!!

  • Project ビューで右クリック → Create → Animation Controller をクリック

  • Animation Controller 名を Girl にする

  • Hierarchy ビューの モデルオブジェクトを選択
  • Project ビューの Animation Controller を Inspector ビューの Controller プロパティにセット

  • Project ビューの Animation Controller をダブルクリック

  • Project ビューの 最初にインポートしたモデルのノードを展開
  • mixamo.com と名前の付いたアニメーションデータを Animator ビューにドロップする

  • このような状態になる

  • Animator ビューの Base Layer の歯車マークをクリック
  • IK Pass をチェック

  • 次は IK 制御用のスクリプトを作成します
  • Project ビューで何もないところを右クリック
  • Create → C# Script をクリック

  • IKController と命名し、作成した IKController をダブルクリックして Visual Studio を起動して編集
using UnityEngine;

[RequireComponent(typeof(Animator))]
public class IKController : MonoBehaviour
{
    protected Animator animator;

    public bool ikActive = false;
    public Transform rightHandObj = null;
    public Transform lookObj = null;

    void Start() {
        animator = GetComponent<Animator>();
    }

    //a callback for calculating IK
    void OnAnimatorIK() {
        if (animator) {

            //if the IK is active, set the position and rotation directly to the goal. 
            if (ikActive) {

                // Set the look target position, if one has been assigned
                if (lookObj != null) {
                    animator.SetLookAtWeight(1);
                    animator.SetLookAtPosition(lookObj.position);
                }

                // Set the right hand target position and rotation, if one has been assigned
                if (rightHandObj != null) {
                    animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
                    animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1);
                    animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandObj.position);
                    animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandObj.rotation);
                }

            }

            //if the IK is not active, set the position and rotation of the hand and head back to the original position
            else {
                animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 0);
                animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 0);
                animator.SetLookAtWeight(0);
            }
        }
    }
}
  • 編集したら保存する

  • Project ビューの IKController を Hierarchy ビューのモデルにドロップする

  • Hierarchy ビューの何もないところを右クリックする
  • 3D Object → Cube をクリック

  • Hierarchy ビューで先ほど追加した Cube を選択する
  • Inspector ビューでスケールを XYZ 全て 0.01 にする

  • Hierarchy ビューで Cube を選択した状態にする
  • Scene ビューで Cube をモデルの右上あたりにドラッグして動かしておく

  • Hierarchy ビューのモデルを選択状態にする
  • Hierarchy ビューの Cube を Inspector ビューの Right Hand Obj と Look Obj のプロパティに設定
  • Hierarchy ビューの Ik Active プロパティをチェック

  • 実行!!

  • 動いた!
  • ちゃんと Scene ビューで Cube を動かすと手が Cube に追従します

プログラムは簡単でしたが

 はっきりいってモデリングやら準備やらの方に時間がかかりました。今日の記事を書くのに要した時間がおよそトータルで11時間くらい。でもまぁ、また次回同じ事をやろうとした時に色々忘れててまた同じことを調べる手間を考えれば作業記録を残すというのはとても良い事です。それに記録に残すために細かい作業をしたことも記憶の強化に繋がります。

というわけで、次回は Oculus Touch のコントローラに連動して動かしてみたいと思います。

ではまた!

ツイートツイート