Blender2.83が出た。
なんと、LTS らしい。
ということで、
Blender(2.79)からUnityのHumanoid互換でfbxをエクスポートする
を自分でやりながら書き直してみる。
- Blender2.83
- Unity2018.4
- Rigify使わない
Armatureの作成
- File - New - General で新規のシーン
- Camera, Light, Cube を削除する
- Add - Armature
表示設定
- Name
- Axis
- In Front (最前面表示。あとでMeshを作った時に透けて見えるように)
左右対称
- X-Axis Mirror
ArmatureをEdit
こちら側を向いた T-Pose で作ります。
- +X 方向が 左手、左足
- -Y 方向が 前
ボーン構造
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 |
腕(Shoulder - UpperArm - LowerArm - Hand)
Chestのテイルから水平に伸ばす。左右対称。
左右対称にするには2つ方法がある。
-
X-Axis Mirror
を有効にした状態で、ボーンを Extrude するときに、(Shift+E) を使って一度に2本の子ボーンを生えさせる -
片方だけ作って、後から
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 を調整
👆 Connected を外して head を移動すると、点線が出る
- Shoulder.L, UpperArm.L, LowerArm.L, Hand.L を選択する
- コンテキストメニュー(右クリック) から Symmetrize を選択する(Symmetrizeする前にShoulder.L 等の名前を付けておくと、自動で Shoulder.R 等反対側の名前をつけてくれる)
足(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
する。
Mesh を作る
-
objectモード
-
AddMesh Plane。Bodyと名付ける。
-
Bodyを選択してEditモードにする。
-
Mirror ModifierとArmature Modifierを追加する
- Mirror: Clipping: x軸の反対側に行けないようにする
- Armature: Object: Armatureを設定
- MirrorしてからArmatureするこの順番で
関節を境界で挟むか(それぞれボーンウェイト100%の予定)、関節の真上(ボーンウエイト50%の予定)で適当に作った。
ボーンを微修正した。
-
Shoulder
を5cm 内に移動 -
Toes
を 1cm 上に移動
BoneWeightをつける
-
Wireframe
とAll Edges
をチェックする。EditorモードでなくてもWire描画が見えるので頂点位置がわかって、ウェイトが付けやすくなる。
Lock Object Modes と 2.79互換の挙動
2.79
では、Armature を Pose モードにしてから、Mesh を WeightPaint モードにすると2つがペアになって、WeightPaint 中にボーンの選択することができた。2.8
ではこの挙動は無くなった(Armature が Poseモードのまま、Mesh を WeightPaint モードにできないと思う)。
Lock Object Modes のチェックを外すことで以前の挙動に戻すことができる。
が、undo
の挙動がややこしいような気がするので避けた方がよいかもしれない。
2.8
の WeightPaint mode
-
Object Mode. Armature を選択
-
Shift を押しながら、 Mesh を選択
-
Armature と Mesh の2つが選択状態で、 Mode を WeightPaint に変える
-
Ctrl + 選択ボタン でボーンの選択を変更できる
weight paint に Armature を持ち込めた。
本記事での 2.79
と 2.8
の最大の違いはここなので、ここを越えたら前の記事とほぼ同じ。たぶん。
塗る
- ctrl + 選択で対称の bone を変更
- 選択したボーンは R で回転できる(poseの変更)。alt-R で回転をクリア。少し回転させて塗ると、塗り残しがわかりやすくなる
- f でradius 変更
<
をクリックしてオプションを広げる。
Tool
tab をアクティブにしてブラシ設定を表示。
- 塗るときは Weight 1.0
- 消すときは Weight 0.0
- ボーンを選択して、Weight1.0で、頂点(wireframe表示にしたので見える)をドラッグする
WeightPeint mode で右クリック。
ボーンウェイトの持ち方
- VertexGroup に入っている
- VertexGroupを削除することでクリアできる
- Vertex 個別の Weight 値は View 右上の
Item
でわかる(Edit mode で Vertexを選択する)
ボーンウェイトの X-Axis Mirror
- VertexGroup Shoulder.L に対して VertexGroup Shoulder.R を作成するとミラーリングが有効になる
- Mirror 用のグループを作るタイミングは、WeightPaintの後でも先でもよい
vertex groups with “symmetrical names” (with components like “L”, “R”, “right”, “left”)
L, R 判定されるそれっぽい名前を付ける。
反対側のVertexGroupを作るのがめんどくさい場合の例
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)
塗った
TODO: FBXエクスポートして、Unityでインポートする
特に設定を変えずに file - export - fbx して、 Unity に取り込んだ。
Rig 設定を Humanoid に変更。
正しく、ボーンが認識された。
Z-UP, Y-UP