meta-rig を組み立てる

`Blender-2.83`

これ。

https://docs.blender.org/manual/en/2.83/addons/rigging/rigify/index.html

Rigify は Rig ジェネレーターで、ジェネレートする元の Meta-Rig 、ジェネレートされた後の Rig 、双方よくわからないのである。

## 参考

2.6 の詳しいマニュアル

* https://wiki.blender.jp/Extensions:2.6/Py/Scripts/Rigging/Rigify

## Rigify の一般的な使い方

* Human(Meta-Rig) 新規追加
* 自分のモデルに位置を合わせる
* Rig をジェネレート
* ジェネレートされた Rig の Deformボーンに対して自分のモデルのボーンウェイト付ける

で、最初から機能満載でよくわからんとなる。
たぶん、

https://docs.blender.org/manual/en/2.83/addons/rigging/rigify/rig_types/index.html

に書いてある個別の `Rig Type` についての知識がないと、Human Rig のような集合体は手が出ない。

## Rigify を既存のArmatureに対して組み立てたい

自分のモデルには最初からウェイトが付いている Armature があるので、それにリグを追加したい。

* 自前の Armature に Meta-Rig 設定
* Rig をジェネレート
* RigのDEF-ボーンを消す
* RigのORGボーンの Deform を有効にする
* RigのORG-ボーンの名前を変えて元のボーンウェイトを引き継ぐ

という手が使えそう。

参考
https://github.com/trynyty/Rigify_DeformBones

## 最小限の meta-rig

blender の rigify のドキュメントを読んでいたら

https://docs.blender.org/manual/en/2.83/addons/rigging/rigify/metarigs.html#creating-a-new-meta-rig

を見つけた。

> Building your own meta-rig from scratch 

* Add - Armature - Single Bone
* Edit
* 既存のボーンを消す
* Armature の property から　Rigify Buttons - Add sample 押す

![add_sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/e93dd04a-3f94-cd98-f7b7-6d40323823b8.jpeg)


basic.copy_cahin の sample(meta-rig) が生成される

![bones.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/dac35b85-3c4d-a689-f2f2-c13ec21c8e9a.jpeg)

poseモードで眺めると

一個目のボーンに `rigify_type` 、`basic.copy_chain` が設定されている

![rigify_type.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/60c03f70-1477-e6c9-5e33-7e3dd0894333.jpeg)

https://docs.blender.org/manual/en/2.83/addons/rigging/rigify/rig_types/basic.html#basic-copy-chain

> Requirement: A chain of at least two connected bones.

なので３本出てくるぽい。rigify_type 毎に必要な構成が決まっている様子。

generate してみる。

![generate.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/432d48d5-00d1-3f46-5bd6-c5a83662e411.jpeg)

この小さいサンプルでも、ボーンの数が３倍になって９本になる。

![generated.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/38e214ab-91da-9cab-c764-4e0db6382e83.jpeg)


* ORG-bone.01-03 オリジナル。たぶんなんもしない。消してもよいのでは
* bone.01-03 表示されているボーン。たぶん操作用
* DEF-bone.01-03 スキニングにボーンウェイトを設定する用

で、この `basic.copy_chain` は使い道がよくわからなかった。human では使っていないみたいなので気にしない。

https://docs.blender.org/manual/en/2.83/addons/rigging/rigify/rig_types/basic.html#basic-copy-chain

> Copies the bone chain keeping all the parent relations within the chain untouched. Useful as a utility rig type for custom rigs.

## Human(Meta-Rig) を解読

Human(Meta-Rig) に使われている `rigify_type` の sample を眺めてみる

### limbs.leg

human 使われている limbs.super_limb のと微妙に違うのかと思ったが、
limbs.super_limb に Limb Type = Leg に設定したものが limbs.leg のような気がする。
limbs.super_limb は generate 時に、 limbs.Limb_Type で置き換えるもののようだ。

https://docs.blender.org/manual/en/2.83/addons/rigging/rigify/rig_types/limbs.html#limbs-super-limb

![limbs_leg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/4e0e902e-b038-83ea-0a85-1e161dfedb4e.jpeg)

Meta-Rig は `thigh - shin - foot -toe` という構成。

ジェネレートする

![rig_leg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/f1ce7607-5b87-d92e-009f-125ee37b4128.jpeg)

大量のボーンが生成された。

* root
  * ORG-thigh
  * MCH-thigh_parent
  * VIS_thigh_IK_pole
  * MCH-thigh_tweak
  * DEF-thigh
* MCH-foot_IK
* MCH_thigh_IK

主に足の底にある IK ターゲットで操作すればよさそう

### basic.super_copy
### spines.basic_spine
### spines.super_head
### limbs.super_finger
### faces.super_face

## 既存の Armature に Meta-Rig を設定する

ということで、 `vroid` のモデルを Blender に持ってきたところから始まる。

![vroid.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/a9f9242f-6554-ac44-b480-513f47d461a7.jpeg)

### limb.leg を設定してみる

* Pose モードにする
* UpperLeg.L の `rigify_type` を `limbs.leg` に設定
* Generate ボタン

エラー出た。

```py
rigify.utils.errors.MetarigError: "RIGIFY ERROR: Bone 'UpperLeg.L': Heel bone not found."
Error: RIGIFY ERROR: Bone 'UpperLeg.L': Heel bone not found.
Incorrect armature for type 'leg'
```

どうやら踵ボーンが足りない。
limbs.leg のサンプル構成を参考にして適当に足してみる。

Foot.L の child にボーンを追加する。 `use_connect = False`

![heel.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/4aa2661c-2e1b-27f5-3d74-be7f37511dd0.jpeg)

* Generate ボタン

```py
rigify.utils.errors.MetarigError: "RIGIFY ERROR: Bone 'UpperLeg.L': Input to rig type must be a chain of 4 bones."
Error: RIGIFY ERROR: Bone 'UpperLeg.L': Input to rig type must be a chain of 4 bones.
Incorrect armature for type 'leg'
```

これは、 `upperLeg - lowerLeg - foot - toe - end` となっていて、末端に end が付いているのが原因だった(chainが４つである必要がある)。
end は BoneWeight の無い先端ボーンなので削除する。

* Generate ボタン

![vroid_leg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/82f53edc-fbaf-2c1f-deac-0ff079373a70.jpeg)

生成できた。

* Mesh の Armature Modifier の参照を、新たに生成された rig Armature に変更する。
* DEF- ボーン消す
* ORG- ボーンの名前から ORG- を取り除いて、deform を有効にする

したところ、`ORG-Toes.L` と `Toes.L` が存在して名前が変えられなかった(Toes.L.001になる)。
`VertexGroup` の方の名前を変える。
スクリプト作った。連続で実行しても大丈夫なように書いてあるのでprintデバッグしながら進められる。

```py
# object mode で 生成した rig をアクティブにして実行する
print()
print('### start ###')

import bpy

armature_obj = bpy.context.view_layer.objects.active
armature = armature_obj.data
print(armature)

# edit_bones にアクセスするのに必要
bpy.ops.object.mode_set(mode='EDIT')

# DEF- を消す
defs = [b for b in armature.edit_bones if b.name.startswith('DEF-')]
print(defs)
for b in defs:
    armature.edit_bones.remove(b)

# ORG- の deform を有効にする
for b in armature.edit_bones:
    if b.name.startswith('ORG-'):
        b.use_deform = True

bpy.ops.object.mode_set(mode='OBJECT')

# シーンのオブジェクトを列挙
for o in bpy.data.objects:
    # armature を生成した rig に設定
    for m in  o.modifiers:
        if m.type != 'ARMATURE':
            continue            
        m.object = armature_obj

    # vertex group の名前を変える
    for vg in o.vertex_groups:
        if vg.name.startswith('ORG-'):
            continue
        vg.name = 'ORG-' + vg.name
```

![vroid_leg_rig.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/687649dc-167e-dbc1-25cd-b285f91947c7.jpeg)

足リグの IK を動かすことができた。

### spine

ToDo

### arm

ToDo

### hand

ToDo

### face
 
ToDo

### vrm LookAt

ToDo: 作れるか

### vrm BlendShapeClip

ToDo: 作れるか