Mixamo のアニメーション付きキャラクターを Unity で動かす

3D モデルにボーンを入れて Unity で踊らせてみた の最後の作業としてアニメーション付きキャラクターを Unity で動かす。

3D モデルの表示

Mixamo で 3D キャラクターにアニメーションを紐付ける でできた zip ファイルを解凍し、新規に作成した Unity プロジェクトの Project ウィンドウにドラッグして読み込む。

Mixamo fbx とテクスチャ読み込み
自分の場合は Models というディレクトリを作って、その配下にドラッグした。モデルのテクスチャファイルが有ればそれも一緒に読み込んでおく。

モデルファイルをシーンに配置
3D モデルをシーン内に配置する。この場合 Hierarchy パネルに YukiTanabe をドラッグアンドドロップしている。

テクスチャの設定
テクスチャがある場合には、 Materials 以下のファイル(今回の場合 No Name という名のファイル)の Main Maps > Albedo にテクスチャファイルをドラッグアンドドロップ。3D モデルに色がつく。

これで 3D モデルの表示部分は完了。

アニメーションの設定

Animator Controller の追加
Project パネルで右クリックし Create > Animator Controller を選択。アニメーションを設定するファイルが追加される。

ファイル名は MyAnimatorController としておく
ファイル名は MyAnimatorController としておく。このファイルをダブルクリックすると Animator ウィンドウが表示されるのでそこに好きなアニメーションを追加する。

Animation の選択
いかにもカンナムスタイルらしき名前のアニメーションにする。Project パネルで選択すると Inspector に表示されるので Animations タブを選択して、下の方にある Loop Time にチェックを入れる。

Animator ウィンドウ
Animator ウィンドウに YukiTanabe@gangnam_style をドラッグアンドドロップ。

3D モデルに AnimatorController の紐付け
最後に 3D モデルに Animator Controller の紐付けを行う。Hierarchy パネルの YukiTanabe を選択した状態で、Inspector の Animator 欄の Controller に Project パネルから MyAnimatorController をドラッグする(文字で書くとかなり分かりづらい)。

ビルドすると踊りだす。

以下の動画は適当に 3D モデルを量産して再生したもの。

Mixamo で 3D キャラクターにアニメーションを紐付ける

3D モデルにボーンを入れて Unity で踊らせてみた の第二の作業として 3D キャラクターにアニメーションを紐付ける。

Unity で別途 Animation をつけることもできると思うが、自分は手っ取り早く動くか確かめたかったので Mixamo のアニメーションをそのまま使った。こちらも無料でできた。

Mixamo の My Assets
上タブの “My Assets” メニューを選択。

My Characters からアニメーションをセットするキャラクターを選択
My Characters からアニメーションをセットするキャラクターを選択。右側に出る “FIND ANIMATIONS” を選択。

Featured から Free Test Pack を選択
とりあえず今回は Free Test Pack を選択。他を選択しても後の作業は変わらないので好きなものを選んで大丈夫。

CUSTOMINZE PACK を選択
“CUSTOMINZE PACK” を選択

My Animations に追加された
My Animations に 3D モデルとアニメーション群が紐付いたパッケージが追加された。”QUEUE DOWNLOAD” を選択。

Mixamo のダウンロード設定
ダウンロード設定画面が出る。今回は Unity 用のファイルにしたいので、Format を FBX for Unity (.fbx) にして “QUEUE DOWNLOAD” を選択。

Mixamo ダウンロードページ
Downloads タブに移動すると、しばらくして DOWNLOAD ボタンが表示されるのでダウンロードする。

zip ファイルがダウンロードできたら OK。

Mixamo を使って無料で 3D モデルのリギングをする

3D モデルにボーンを入れて Unity で踊らせてみた の第一の作業として 3D モデルをリギングする。

自分がもらった 3D データはボーンのない状態だったのでボーンを入れるリギングという作業が必要だった。リギングは 3D データに骨を入れるような作業。リギング済みのデータの場合この作業は必要ない。

Mixamo という Web ツールを使ってボーンを入れていく。

まずは mixamo のユーザー登録をする。

Mixamo Store ページ
ユーザー登録が完了したら、上部の Store タブを選択して、Store ページに移動。UPLOAD ボタンを選択。

Mixamo ファイルアップロード
3D データ file (.OBJ など) をドラッグする。

Mixamo ファイルアップロード中
アップロードするとプログレスバーが出るのでしばらく待つ。

Mixamo アップロード完了
アップロードが完了すると 3D モデルが表示される。 NEXT を選択。

Mixamo リギング開始
リギングの設定画面が表示される。右の手本を参考にして、色付きの丸をドラッグしていく。左右対称の場合は “Use Symmetry” をチェックしたままで簡単に設定できる。自分のモデルは少し傾いていたのでチェックをはずして設定した。

Mixamo リギング設定
ちゃんと配置できたら NEXT を選択。

Mixamo リギング完了
暫く待つと、リギングが完了する。完了すると 3D モデルが動き出す。

ここまでできればリギング完了。

3D モデルにボーンを入れて Unity で踊らせてみた

先日 TechShop Japan で doob が展示されており、3D データを作ることができた。今回はそのデータにボーンを入れて Unity 上で踊らせてみる。

必要な作業

以下の作業が必要だった。1 と 2 の作業は今回は mixamo という Web ツールを使う。自分がやった範囲だと無料で全てできた。

説明のためにスクショを貼りまくるため、それぞれページを分けて説明する。

  1. リギング
  2. アニメーションを追加
  3. Unity 上でアニメーション設定

完成形はこちら

いかにもカンナムスタイルみたいなやつを踊らせてみた。

Unity で VR モード時にカメラの位置を固定する

Unity で VR モードにして Oculus Rift, HTC Vive などのヘッドマウントディスプレイでプレイすると、自動的に hmd とセンサーとの距離からカメラの位置が動く。

これは、 Unity 公式ドキュメント:VR 概要 の “カメラを理解する” のセクションに記載されている。

カメラの Transform は、ヘッドトラッキングされた姿勢で上書きされます。

カメラの位置 (position) は固定して回転 (rotation) のみ有効にしたい場合がある。そのためには、カメラの親となるゲームオブジェクトにカメラの動きを無効化するための処理を加える必要がある。

もしもカメラを動かしたい場合は、別のゲームオブジェクトの子としてアタッチし、そのゲームオブジェクトのルートを動かしてください。

Unity の VR モードでカメラの位置を固定してみる

Unity VR モードのカメラを固定

今回は CameraController という空のゲームオブジェクトを配置し、その中に Main Camera を挿入した。CameraController にスクリプト CameraController.cs を Add Component した状態。

スクリプトの中身は以下のようにする。

CameraController.cs

using UnityEngine;
using UnityEngine.VR;
using System.Collections;

public class CameraController : MonoBehaviour {

void Update () {
    // TODO: ここで固定したい位置があれば指定しておく
    Vector3 basePos = Vector3.zero;

    // VR.InputTracking から hmd の位置を取得
    Vector3 trackingPos =
            InputTracking.GetLocalPosition(VRNode.CenterEye);

    // CameraController 自体の rotation が
    // zero でなければ rotation を掛ける
    // trackingPosition = trackingPos * transform.rotation;

    // 固定したい位置から hmd の位置を
    // 差し引いて実質 hmd の移動を無効化する
    transform.position = basePos - trackingPos;
}

}

CameraController の position に、固定したい位置から VR.InputTracking のポジションを引いた値を代入している。 Update メソッドに処理を書くことで常に hmd の動きを無効化するようにしているが、初期位置のみ固定したい場合は Start メソッド内に処理を移動すればオッケー。

また、ローテーションを無効化したい場合も同じように固定したい rotaiton との減算を行えば大丈夫。

補足

位置固定はできるが、実際にこれで Oculus, Vive などでプレイすると実際の動きとの差で VR 酔いを起こしてしまうかもしれない。自分の場合は少し気持ち悪さを感じたので、本番のプロジェクトでは導入しない予定。

特定のケースに限定して、同しようもない場合にこのような実装にしたほうが良いと思う。また、 Unity で位置やローテーションの無効化をサポートしそうな気もするので最新情報をキャッチしてから組み込んだほうが良いかも。既にあったりしたら教えてください。

Unity で VR 端末に対応する

Unity で Oculus や HTC Vive 用のアプリケーションを作成するためには VR 端末に対応する簡単な設定をする必要がある。

Player Settings > Other Settings > Virtual Reality Supported を ON にすれば良いのだが一応スクショも貼って丁寧に説明する。

Unity のメニューから File > Build Settings を選択” /><br />
Unity のメニューから File > Build Settings を選択</p>
<p><img src=
Player Settings を選択

Unity の Inspector が開くので Other Settings を展開
Unity の Inspector が開くので Other Settings を展開

Virtual Reality Supported を ON にする
Virtual Reality Supported を ON にする

以上。

Unity x HTC Vive で The Lab のようなワープを簡単に実装する

Unity x HTC Vive で The Lab みたいに簡単にワープできないかと、色々と模索していたら意外に簡単にできたので忘却録の意味も込めて記事にする。

流れは以下の通り。以下の流れの前に PC で Vive が動作している & Unity の VR 設定ができていることを前提に記述する。完成したサンプルは https://github.com/tanabee/ViveTeleporter にて入手。

  1. SteamVR Plugin を Unity にインポート
  2. Hierarchy パネルに CameraRig を配置
  3. Main Camera を Deactivate or 削除
  4. Laser Pointer と Teleporter を Controller に Add Component

1. SteamVR Plugin を Unity にインポート

SteamVR Plugin を Unity の Asset Store タブなどからダウンロードしてインポートする。

これが現状では HTC Vive 対応するための標準ライブラリらしい。

Unity で Asset Store タブを選択
Unity で Asset Store タブを選択。

Asset Store で SteamVR Plugin を探す
Asset Store で SteamVR Plugin を探す。ダウンロードボタンをクリック。

SteamVR Plugin の import
SteamVR Plugin のダウンロードが完了すると import を求められるので import をクリック。

Steam VR Plugin のダイアログ
ダイアログが出るので、とりあえず Accept All しとく。

2. Hierarchy パネルに CameraRig を配置

Project パネルの SteamVR > Prefabs 以下に [CameraRig] というプレハブがあるので、これをドラッグして Hierarchy パネルにドロップ。

SteamVR/Prefabs/CameraRig を見つける
SteamVR/Prefabs/CameraRig を見つける

SteamVR/Prefabs/CameraRig を Hierarchy パネルにドロップ
SteamVR/Prefabs/CameraRig を Hierarchy パネルにドロップ

この中にカメラと左右のコントローラが含まれている。この状態でビルドすると

3. Main Camera を Deactivate or 削除

Main Camera が不要であれば削除する。Oculus などの他の端末のために残して、 Vive 用だけこのカメラを利用する場合には Deactivate する。

この状態でビルドすると、Vive の hmd を装着して Scene ファイル内の映像が見えてコントローラーが表示されているはず。

4. Laser Pointer と Teleporter を Controller に Add Component

SteamVR/Extras/ 以下の SteamVR_LaserPointer と SteamVR_Teleporter を CameraRig 以下の Controller に Add Component する。SteamVR_Teleporter の Teleport On Click にチェックを入れるとトリガーを引いた時にレーザーがあたっている Y=0 のポイントに移動する。

CameraRig 以下の Controller を選択
CameraRig 以下の Controller を選択

SteamVR_LaserPointer と SteamVR_Teleporter を Add Component
SteamVR_LaserPointer と SteamVR_Teleporter を Add Component

まとめと補足

以上で Vive でコントローラーを表示し、ビームが出て、ビームと Y=0 の設置点に移動できるようになった。さらに進んで背景の地面の高さに合わせた設定をするためには、 Telepot Type を変更して背景オブジェクトのコライダーを設定すれば良さそう。

また、この Camera Rig を 特定のゲームオブジェクト内に挿入するとそのゲームオブジェクトの回転の影響でビームが逆に出たりするのでその場合には親のゲームオブジェクトの rotation を考慮して内部のコードをいじればいけた。(が、美しい方法ではないのでいい方法があれば教えて欲しい)