ボーンってなんなんですか...？

# はじめに

こんばんは。
VTuberが大好きなので、このアドベントカレンダーで書くことができて嬉しいです。

今回はVTuberを動かすために必須のデータであるボーンについて調べてきました。お役に立てれば幸いです。

# ボーンが必要とされる理由

たとえば3Dモデルにアニメーションを付けたいと思ったとします。
3Dモデルはメッシュの集合体なわけですが、動かすときにメッシュの座標を１つ１つ指定していてはさすがに大変です。

![2019-12-10_20h48_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/b3c26589-ab7e-5bf9-8737-ffb9ce54ad4a.png)

その問題を解決するため、**ボーン**というメッシュを簡単に動かすための仕組みがあります。
ボーンは名前の通り、3Dモデルの骨組みと言えるデータとなっています。

仮想の骨をモデルに設定し、**「その骨が動いたときにどの部分のメッシュがどの程度の影響を受けるか」**という情報を作成します。
これは正しく骨と影響のマッピングができていれば、モデルを動かすという問題は骨をどのように動かすかという問題に置き換えることができるということです。
メッシュを１つ１つ動かすよりはだいぶ現実的な話になってきたのではないでしょうか。

# ボーンの作り方

今回はBlenderを使って、下の単純な人型モデルにボーンを仕込んでみたいと思います。

![2019-12-10_21h51_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/03acf24b-45bc-e0e5-2154-fb9c53acbbf1.png)

## ボーンを入れる

Blenderではアーマチュアという仕組みを使って、ボーンを設定します。

![2019-12-10_21h53_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/0640e573-d822-2e3a-3d94-bbe80c510b98.png)

アーマチュアを選択すると、シーンに以下のような物体が出てきます。

![2019-12-10_22h16_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/b7e60271-3f71-64b7-f0cc-e3adb79c29d0.png)

実はこれがボーンで、これを複数個組み合わせて動かしたいモデルの骨組みとしていきます。
ちなみに三角錐の先端の球を「ヘッド」、根本の球を「テール」と呼びます。

今回は以下のような組み方をしてみました。

![2019-12-10_21h58_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/a161dc1b-325d-797e-3ef0-cf7cd2b95aab.png)

## ボーンを整える

次は作ったボーンに名前を付けていきたいと思います。
名前はとても大事な情報で、名前によってUnityに持っていったとき、部位の左右や「ここが腰だ」といった位置関係が判断されたりします。

今回は以下のような名前の付け方をしてみました。

![2019-12-10_22h00_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/49690077-4411-c244-8c99-d4ed4371b401.png)

|部位  |名前  |
|---|---|
|頭  |Head |
|首  |Neck |
|右肩  |Shoulder |
|右ひじ上  |Upper_Arm |
|右ひじ下  |Lower_Arm |
|右手  |Hand |
|おなか  |Spine |
|おしり  |Hips  |
|右太もも  |Upper_Leg  |
|右ふくらはぎ  |Lower_Leg  |
|右足  |Foot  |

次に、今は手と足を右側しか作っていないので、左側を作っていきたいと思います。

まずは手足を選択した状態で、「オートネーム（左右）」という処理を施します。
これは選択されたボーンが、モデルの原点から左右どちらにあるのかを調べて、名前の末尾に「.R」「.L」を追加してくれる便利機能です。

![2019-12-10_22h01_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/73bb0368-a6aa-2ffa-8e8d-c3fdd5a98950.png)

その結果、ボーン名が以下のように変化しました。

|部位  |名前  |
|---|---|
|頭  |Head |
|首  |Neck |
|右肩  |Shoulder **.R** |
|右ひじ上  |Upper_Arm **.R** |
|右ひじ下  |Lower_Arm **.R** |
|右手  |Hand **.R** |
|おなか  |Spine |
|おしり  |Hips  |
|右太もも  |Upper_Leg **.R**  |
|右ふくらはぎ  |Lower_Leg **.R**  |
|右足  |Foot  **.R**  |

更に選択している右パーツに「対称化」という処理を施します。これによって右パーツを反転させて左パーツを作ることができます。

![2019-12-10_22h03_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/89226155-6690-68dc-a9cc-43afd408451d.png)

ボーン構造は左パーツが作成されたことで以下のように変化しました。

![2019-12-11_02h38_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/50a93bc3-32a2-da2a-f7c4-8e727576c02e.png)

|部位  |名前  |
|---|---|
|頭  |Head |
|首  |Neck |
|右肩  |Shoulder.R |
|右ひじ上  |Upper_Arm.R |
|右ひじ下  |Lower_Arm.R |
|右手  |Hand.R |
|左肩  |Shoulder.L |
|左ひじ上  |Upper_Arm.L |
|左ひじ下  |Lower_Arm.L |
|左手  |Hand.L |
|おなか  |Spine |
|おしり  |Hips  |
|右太もも  |Upper_Leg.R  |
|右ふくらはぎ  |Lower_Leg.R  |
|右足  |Foot.R  |
|左太もも  |Upper_Leg.L  |
|左ふくらはぎ  |Lower_Leg.L  |
|左足  |Foot.L  |

ボーンはこれにて完成です。

## メッシュとボーンをマッピングする

作ったボーンと3Dモデルを合体させる作業を最後に行いたいと思います。
ここの工程で**「この骨を動かしたら、モデルのこの部分が動く」**というのを確定させることになります。

一見面倒そうですが、今回はBlenderの機能でポチッと終わらせたいと思います。

3Dモデルとアーマチェアを両方選択した状態で「Ctrl+P」を押すと以下のようなウィンドウが出てくるので、その中から「自動のウェイトで」を選択します。

![2019-12-10_22h04_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/ce1cb97f-65ec-d2d9-7488-5b37d2cf71e8.png)

こうすると、自動でいい感じにボーンとモデルの対応付けを終わらせてくれます。

![2019-12-10_22h04_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/53cdbb81-9a7a-edee-3521-47972f56a303.png)

動かしてみるとボーンとメッシュがそれっぽく連動しているのがわかります。

この機能は便利なのですが、機械的にウェイトを設定しているため、たまに意図しない設定になってしまうことはあります。
そういう場合は、以下の対応を行う必要が出てきます。

**1. 補助ボーンを増やす**
**2. 自分でウェイトペイントを行う**

## ウェイトペイントする

今回は「自分でウェイトペイントを行う」も試してみたいと思います。

先ほど自動設定でウェイトを設定しましたが、データ的にはこのようになっています。

![2019-12-10_22h08_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/df25e6f8-472e-5888-2cd1-48166e4b4557.png)

これはSpineを動かすと色の付いた部分のメッシュが動くことを示しています。
色にも意味があり、赤に近い部分ほど強くボーンの影響を受けるようになっています。
この色はBlenderでブラシを使って好きなように塗ることができます。

塗った部分が動くというのを検証するため、試しに右足のボーンに対して変な塗り方を試してみます。

![2019-12-10_22h09_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/8e3a7e07-2d4c-8d62-cbe2-3031ea300722.png)

![2019-12-10_22h10_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/c4abf0ff-bc34-8d1b-3b60-46de662eb733.png)

結果、右足を動かすと左胸も動くというデータを作ることができました。

# Unityでの扱い方

## fbx

上のデータをBlenderからUnityに持ってきましょう。
Fbxをエクスポートして、Unityにドラッグアンドドロップすれば大丈夫です。
割愛しますが、データを正しく持ってきたい場合にはグリッドの単位や座標系の設定には注意が必要です。

## Humanoid

fbxをUnityにインポートできたら、インスペクターでリグ情報を見てみましょう。
デフォルトでは恐らく下のような「Generic」に設定されているので、「Humanoid」に変更します。

![2019-12-16_00h38_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/f7beb621-10ea-cf48-d373-30300767911e.png)

Humanoidは後述する**アバター**という仕組みに人型モデルのボーンを割り当てることで、また異なるボーン設定で作られたモデルのアニメーションを使い回せるようになる...というものです。

アバターはこのようなものになっています。
先程作ったボーンのGameObjectをインスペクタ上で、それぞれ対応する部位にの対応する部位にアタッチすることで作られます。

![2019-12-16_21h10_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/1fa41784-7896-7d53-92f0-3a74d38e45af.png)

![2019-12-16_00h43_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/11c3d026-5d4f-5c61-07c8-ec4104ae792d.png)

![2019-12-16_21h11_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/861e2d5f-e972-09b5-744b-95cd2030977c.png)

ここで注目なのは破線の部位は必ずしも設定する必要はないというところです。
実は胸や肩、指といったボーンがなくてもHumanoidのデータとして成立するのですね。

また、シーンビューではボーンがどのように当たっているかを3Dで見ることもできます。

![2019-12-16_00h46_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/cc450e17-bd2f-2efd-b1c8-e8d0c48eaa2c.png)

## アニメーションデータを流用してみる

それでは最後にUnityちゃんのアニメーションデータを作成した人型モデルに流用してみます。
正しくボーンとHumanoidの設定が行われていれば同じ動きを取ることができるはずです。

![2019-12-16_00h50_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227584/e22bd3ec-0833-463b-a730-38725e8d7727.png)

雑なモデルですが、横に並べたUnityちゃんと比較してそれっぽい手足の曲がり方をしていると思います。

# まとめ

今回は以下の2点に注目して記事を書いてみました。

**・モデリングソフトでどのようにボーン情報が作られるのか**
**・作ったボーン情報がUnityでどのように扱われるのか**

Blenderでデータを作るのはすごく面倒ですが、VTuberを動かすイメージが付きやすくなったのでやってよかったと思います。

# 参考文献

今回記事を作成するにあたり、以下の文献、Webサイト様の情報を参考にさせていただきました。
誠にありがとうございました。

UWAN CHANNEL!
https://www.youtube.com/channel/UCxp8AZy1RtU9klpBomXoBeg

【Unity】Humanoid / Genericアニメーションについての基礎知識
http://light11.hatenadiary.com/entry/2019/01/29/234442

Blender 3Dキャラクター メイキング･テクニック
https://www.amazon.co.jp/dp/B019GCBKUG/