LoginSignup
0
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-06-08

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

ということで、

Blender(2.79)からUnityのHumanoid互換でfbxをエクスポートする

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

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

Armatureの作成

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

表示設定

armature_view.jpg

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

左右対称

xaxis_mirror.jpg

  • X-Axis Mirror

ArmatureをEdit

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

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

fullbody.jpg

ボーン構造

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

腕(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 を調整

shoulder.jpg

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

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

symmetrize.jpg

足(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

Mesh を作る

  • objectモード
  • AddMesh Plane。Bodyと名付ける。
  • Bodyを選択してEditモードにする。
  • 4つの頂点を移動してこの状態にする。Y軸は全部0

  • Mirror ModifierとArmature Modifierを追加する

modifier.jpg

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

plain.jpg

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

  • Shoulder を5cm 内に移動
  • Toes を 1cm 上に移動

BoneWeightをつける

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

wireframe.jpg

Lock Object Modes と 2.79互換の挙動

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

lock.jpg

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

2.8 の WeightPaint mode

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

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

weightpaint.jpg

weight paint に Armature を持ち込めた。

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

塗る

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

tool.jpg

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

drawtool.jpg

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

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

paint.jpg

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

WeightPeint mode で右クリック。

paint_context.jpg

ボーンウェイトの持ち方

vertexgroup.jpg

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

vertex.jpg

  • 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)

塗った

done.jpg

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

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

unity.jpg

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

Z-UP, Y-UP

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3