Blender2.83でUnity向けヒューマノイドを Weight Paint する

Blender2.83が出た。
なんと、LTS らしい。

ということで、

[Blender(2.79)からUnityのHumanoid互換でfbxをエクスポートする](https://qiita.com/ousttrue/items/aead1c943855561b62e7)

を自分でやりながら書き直してみる。

* Blender2.83
* Unity2018.4
* Rigify使わない

# Armatureの作成

* File - New - General で新規のシーン
* Camera, Light, Cube を削除する
* Add - Armature

## 表示設定

![armature_view.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/369ca1ed-93fb-c40f-4dea-8dfd7f1609da.jpeg)

* Name
* Axis
* In Front (最前面表示。あとでMeshを作った時に透けて見えるように)

## 左右対称

![xaxis_mirror.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/e6018fba-a7fa-7bcd-3aee-85ecfee027a0.jpeg)

* X-Axis Mirror

# ArmatureをEdit

こちら側を向いた T-Pose で作ります。

* +X 方向が 左手、左足
* -Y 方向が 前

![fullbody.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/c455d52f-6746-a015-47c8-23a91e7a1ac6.jpeg)

## ボーン構造

21本作ります。

```
* Hips(骨盤)
  * Spine(脊柱)
    * Chest(胸)
      * Neck(首)
        * Head(頭)
      * Shoulder.L(肩)
        * UpperArm.L(上腕)
          * LowerArm.L(前腕)
            * Hand.L(手)
      * Shoulder.R
        * UpperArm.R
          * LowerArm.R
            * Hand.R
  * UpperLeg.L(上腿)
    * LowerLeg.L(下腿)
      * Foot.L(足)
        * Toes.L(つま先)
  * UpperLeg.R
    * LowerLeg.R
      * Foot.R
        * Toes.R
```

## 胴体(Hips-Spine-Chest-Neck-Head)

身長1.6mとして作っていきます。
下絵とか無いので数字で決めていきます。
Hipsの位置を伸長の半分の0.8m。
Headの長さを0.3m。

|bone|長さ|head|tail|
|----|----|----|----|
|Hips||0,0,0.8||
|Spine||
|Chest||
|Neck||
|Head|0.3||0,0,1.6|

適当に分配。

|bone|長さ|head|tail|
|----|----|----|----|
|Hips|0.1|0,0,0.8|0,0.0.9|
|Spine|0.1|connected|0,0,1.0|
|Chest|0.2|connected|0,0,1.1|
|Neck|0.1|connected|0,0,1.3|
|Head|0.3|connected|0,0,1.6|

![hips_head.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/edf78e92-46d4-240d-be15-80f60588293d.jpeg)

## 腕(Shoulder - UpperArm - LowerArm - Hand)
Chestのテイルから水平に伸ばす。左右対称。

左右対称にするには２つ方法がある。

* `X-Axis Mirror` を有効にした状態で、ボーンを Extrude するときに、(Shift+E) を使って一度に２本の子ボーンを生えさせる

* 片方だけ作って、後から `Symmetrise` する

今回は、 `Symmetrise` で作業する。
股間あたりに手首が来るよう(上腕0.2, 前腕0.2)に配分。

|bone|長さ|head|tail|
|----|----|----|----|
|Shoulder.L|0.1|0.1,0,1.2|0.2,0,1.2|
|UpperArm.L|0.2|connected|0.3,0,1.2|
|LowerArm.L|0.2|connected|0.5,0,1.2|
|Hand.L|0.1|connected|0.7,0,1.2|

Connected ではないボーンを作る。Shoulder と後で出てくる UpperLeg は親ボーンの tail と接続しません(親ボーンのtailと、headが離れる。表示は点線で結ばれる)

* Chest の tail を選択
* `E` xtrude
* 右方向に `Shoulder.L` の tail を移動
* `connected` をオフにする
* `Shoulder.L` を骨ごと右に移動
* head と tail を調整

![shoulder.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/b7e07bc5-2d4c-d573-a8f2-adba607f7c10.jpeg)

👆 Connected を外して head を移動すると、点線が出る

* Shoulder.L, UpperArm.L, LowerArm.L, Hand.L を選択する
* コンテキストメニュー(右クリック) から Symmetrize を選択する(Symmetrizeする前にShoulder.L 等の名前を付けておくと、自動で Shoulder.R 等反対側の名前をつけてくれる)

![symmetrize.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/5bf4835c-8a57-982f-ca6a-5ec3c078de47.jpeg)


## 足(UpperLeg - LowerLeg - Foot)
左右対称。

hipsの高さから上腿が始まり、`toes` で着地するように配分。
foot は斜めにする。

|bone|高さ|head|tail|
|----|----|----|----|
|UpperLeg.L|0.4|0.1,0,0.8|0.1,0,0.4|
|LowerLeg.L|0.3|connected|0.1,0,0.1|
|Foot.L|0.1|connected|0.1,-0.1,0|
|Toes.L|0.0|connected|0.1,-0.2,0|

* hips の head を選択
* `E` xtrude
* 下方向の膝位置に `UpperLeg.L` のtail位置を決定
* `connected` をオフにする
* `UpperLeg.L` を右に移動する
* head と tail を調整

* UpperLeg.L, LowerLeg.L, Foot.L, Toes.L を選択して `Symmetrize` する。

![fullbody.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/c455d52f-6746-a015-47c8-23a91e7a1ac6.jpeg)

# Mesh を作る

* objectモード
* AddMesh Plane。Bodyと名付ける。
* Bodyを選択してEditモードにする。
* 4つの頂点を移動してこの状態にする。Y軸は全部0
<img src=https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F59664%2F4dd6f992-6147-86c0-e206-cfd72d910186.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=be9c68d00c0413b97a9cb36d235804a1>

* Mirror ModifierとArmature Modifierを追加する

![modifier.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/0bbc8c17-5d56-1ee8-2d2f-905baae4b435.jpeg)


* Mirror: Clipping: x軸の反対側に行けないようにする
* Armature: Object: Armatureを設定
* MirrorしてからArmatureするこの順番で

![plain.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/d9cf0b4c-0bdb-070d-9e16-69779bcc509b.jpeg)

関節を境界で挟むか(それぞれボーンウェイト100%の予定)、関節の真上(ボーンウエイト50%の予定)で適当に作った。
ボーンを微修正した。

* `Shoulder` を5cm 内に移動
* `Toes` を 1cm 上に移動

# BoneWeightをつける

* `Wireframe` と `All Edges` をチェックする。EditorモードでなくてもWire描画が見えるので頂点位置がわかって、ウェイトが付けやすくなる。

![wireframe.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/2219f4ed-8033-3b3c-7af2-9fb7ec2b1df8.jpeg)

## Lock Object Modes と 2.79互換の挙動
`2.79` では、Armature を Pose モードにしてから、Mesh を WeightPaint モードにすると２つがペアになって、WeightPaint 中にボーンの選択することができた。`2.8` ではこの挙動は無くなった(Armature が Poseモードのまま、Mesh を WeightPaint モードにできないと思う)。

![lock.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/43845a20-d385-6c0c-4d61-a7d86a6f64d8.jpeg)

Lock Object Modes のチェックを外すことで以前の挙動に戻すことができる。
が、`undo` の挙動がややこしいような気がするので避けた方がよいかもしれない。

## `2.8` の WeightPaint mode

* Object Mode. Armature を選択
* Shift を押しながら、 Mesh を選択
* Armature と Mesh の２つが選択状態で、 Mode を WeightPaint に変える 

* Ctrl + 選択ボタン でボーンの選択を変更できる

![weightpaint.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/1b881b5b-0bac-7c2e-f75f-2741457abf40.jpeg)

weight paint に Armature を持ち込めた。

本記事での `2.79` と `2.8` の最大の違いはここなので、ここを越えたら前の記事とほぼ同じ。たぶん。

## 塗る

* ctrl + 選択で対称の bone を変更
* 選択したボーンは R で回転できる(poseの変更)。alt-R で回転をクリア。少し回転させて塗ると、塗り残しがわかりやすくなる
* f でradius 変更

![tool.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/90a3263c-c4a9-cb6d-3d46-8f86581bd36e.jpeg)

`<` をクリックしてオプションを広げる。

![drawtool.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/bab81f94-7c77-a6a4-033c-e0319cda35b7.jpeg)

`Tool` tab をアクティブにしてブラシ設定を表示。

* 塗るときは Weight 1.0
* 消すときは Weight 0.0

![paint.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/39ce5945-c690-69e7-8694-0de34cbe7b8f.jpeg)

* ボーンを選択して、Weight1.0で、頂点(wireframe表示にしたので見える)をドラッグする

WeightPeint mode で右クリック。

![paint_context.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/d8ae4775-9801-45b7-29f9-bd2b9e8cb1f0.jpeg)


## ボーンウェイトの持ち方

![vertexgroup.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/c3df4ba3-2bf5-e854-3bb8-80ac315ea390.jpeg)

* VertexGroup に入っている
* VertexGroupを削除することでクリアできる

![vertex.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/81b2ee0b-351a-1d6b-e8c2-94b0b75efa43.jpeg)

* Vertex 個別の Weight 値は View 右上の `Item` でわかる(Edit mode で Vertexを選択する)

## ボーンウェイトの X-Axis Mirror

* VertexGroup Shoulder.L に対して VertexGroup Shoulder.R を作成するとミラーリングが有効になる
* Mirror 用のグループを作るタイミングは、WeightPaintの後でも先でもよい

https://docs.blender.org/manual/en/latest/sculpt_paint/weight_paint/editing.html
> vertex groups with “symmetrical names” (with components like “L”, “R”, “right”, “left”)

L, R 判定されるそれっぽい名前を付ける。

### 反対側のVertexGroupを作るのがめんどくさい場合の例

```python
import bpy

def createOtherSide(obj):
    '''
    Create if you don't have a Vertex Group on the other side
    '''
    for g in obj.vertex_groups:
        if g.name.endswith('.L'):
            otherSide = g.name[0:len(g.name)-2] + '.R'
            if otherSide not in obj.vertex_groups:                
                print('create vertexGroup:', otherSide)
                obj.vertex_groups.new(name=otherSide)
                
createOtherSide(bpy.context.view_layer.objects.active)
```

## 塗った

![done.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/a0474152-57b9-f953-19bc-22b663dd9dac.jpeg)


# TODO: FBXエクスポートして、Unityでインポートする

特に設定を変えずに file - export - fbx して、 Unity に取り込んだ。
Rig 設定を Humanoid に変更。

![unity.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/0b88e44d-f794-8b13-7585-43eb559d4b32.jpeg)

正しく、ボーンが認識された。

Z-UP, Y-UP