Blender初心者が最初に覚えるべき内容をまとめたページは、このリンクにあります。
このページは、Blender(Portable_4.1.1)のPythonスクリプトで
ライブラリ(beditsub.pyを利用してスクリプトで人型モデリングを試みた実験の記録です。
なお、
「リギング:Rigify」のアドオン時に使える「アーマチュア」の「Human (Meta-Rig)」を利用しています。
この「Human (Meta-Rig)」の周りに肉体のメッシュを追加する試みた内容です。
なお「リギング:Rigify」のアドオンは、「編集」メニューの「プリファレンス」より、「アドオン」を選択して「rig」の検索し、
「リギング:Rigify」にチェックを入れます。
これでオブジェクトモードで「追加」メニューの「アーマチュア」の「Human (Meta-Rig)」のメニュー項目が選択できる状態であれば、以下のスクリプトが実行できます。
import sys sys.path.append('D:\\work') from importlib import reload #import test #reload( test ) import bpy import bmesh import mathutils import beditsub # 自作モジュール bpy.ops.object.mode_set(mode='OBJECT')# オブジェクトモードに切り替え for obj in bpy.data.objects:# 'Camera' と 'Light' 以外を全て削除する if obj.name=='Camera' or obj.name=='Light': continue bpy.data.objects.remove( obj ) # 「リギング:Rigify」アドオン時に使える「アーマチュア」の「Human (Meta-Rig)」追加 bpy.ops.object.armature_human_metarig_add() #ボディの編集 z=0.95#高さ bpy.ops.mesh.primitive_circle_add(location=(0, 0, z), scale=(1, 1, 1), vertices=16,radius=0.01)#円の追加 obj = bpy.context.active_object # 直前でアクセスしたオブジェク obj.name = "body" # 名前を付ける bpy.ops.object.mode_set(mode='EDIT')# オブジェクトモードに切り替え bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.1)})# 押し出し処理 bpy.ops.transform.resize(value=(18, 18, 1))# サイズ変更処理 bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.1)})# 押し出し処理 bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.08)})# 押し出し処理 bpy.ops.transform.resize(value=(0.6, 0.6, 1))# サイズ変更処理(0.6倍に) bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.12)})# 押し出し処理 bpy.ops.transform.resize(value=(1.2, 1.2, 1))# サイズ変更処理 bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.08)})# 押し出し処理 bpy.ops.transform.resize(value=(1.4, 1.4, 1))# サイズ変更処理 bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.1)})# 押し出し処理 bpy.ops.transform.resize(value=(1.1, 1.1, 1))# サイズ変更処理 bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.1)})# 押し出し処理 bpy.ops.transform.resize(value=(0.8, 0.8, 1))# サイズ変更処理 bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.05)})# 押し出し処理 bpy.ops.transform.resize(value=(0.35, 0.35, 1))# サイズ変更処理 bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='VERT') # 頂点選択モード bpy.ops.mesh.select_all(action='SELECT') # 全て選択
beditsub.deselect_all_elements(obj) # objの内部を全て非選択にする。 beditsub.set_select_renage(obj,ymin=0.01) # ボディの後側頂点選択 # yが0.01以上の位置にある頂点を選択状態にする beditsub.set_select_renage(obj,zmax=0.21, setSelect=False)# お尻を選択状態から外す。 # zが0.21以下の位置にある頂点を、非選択状態にする次にこの選択状態の頂点を、緑の矢印方向に、痩せるように移動する。
# (お尻以外の背中の頂点だけが選択状態で、実行する。) beditsub.move_parallel_y(obj,param=0.3,selected=True) # 選択域のお尻以外の背中を?せさせる(Y軸の幅を、0.3倍に減らす) beditsub.move_parallel_y(obj,param=0.4,selected=False) # ボディ全体を痩せさせる(Y軸の幅を0.4倍に減らす) bpy.ops.mesh.select_all(action='SELECT') # 全て選択この実行のイメージが下記の通りで、デフォルト引数base_Y=0の位置の方向に、選択状態の頂点を移動し、
import sys DRV='D' # windows system ドライブ名 libpath=f'{DRV}:\\work' # 追加モジュールパス if not (libpath in sys.path): sys.path.append(libpath) # from importlib import reload import bpy import bmesh import mathutils import beditsub # 自作モジュール #reload( beditsub ) def add_object(): #ボディの編集------------------------------------------------------------------------------------------------- bpy.ops.mesh.primitive_circle_add(location=(0, 0, 0.95), scale=(1, 1, 1), vertices=16,radius=0.01)#円の追加 obj = bpy.context.active_object # 直前でアクセスしたオブジェク obj.name = "body" # 名前を付ける bpy.ops.object.mode_set(mode='EDIT')# 編集モードに切り替え bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='EDGE') # 辺選択モード # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.1)})# 押し出し処理 bpy.ops.transform.resize(value=(18, 18, 1))# サイズ変更処理(お尻下) bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.1)})# 押し出し処理 bpy.ops.transform.resize(value=(1, 1, 1))# サイズ変更処理(お尻上) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.08)})# 押し出し処理 bpy.ops.transform.resize(value=(0.6, 0.6, 1))# サイズ変更処理(0.6倍に)(腰の始まり) waist_indices=beditsub.get_selected_vertex_indices(obj) # 選択状態の頂点の添え字群リスト取得(腰の情報) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.12)})# 押し出し処理 bpy.ops.transform.resize(value=(1.2, 1.2, 1))# サイズ変更処理(肺の下のライン) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.08)})# 押し出し処理 bpy.ops.transform.resize(value=(1.4, 1.4, 1))# サイズ変更処理 bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.1)})# 押し出し処理 bpy.ops.transform.resize(value=(1.1, 1.1, 1))# サイズ変更処理(脇の下のライン) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.05)})# 押し出し処理 bpy.ops.transform.resize(value=(1, 1, 1))# サイズ変更処理(腕の付け根のライン) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.07)})# 押し出し処理 bpy.ops.transform.resize(value=(0.8, 0.8, 1))# サイズ変更処理(肩のライン) bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.035)})# 押し出し処理 bpy.ops.transform.resize(value=(0.3, 0.3, 1))# サイズ変更処理(首の付け根のライン) # neck_indices=beditsub.get_selected_vertex_indices(obj) # 選択状態の頂点の添え字群リスト取得(首の情報) bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.1)})# 押し出し処理 bpy.ops.transform.translate(value=(0, -0.03, 0))# 選択(ここでは頂点)の移動 # # ここからボディの変形(奥行を縮める) bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='VERT') # 頂点選択モード beditsub.deselect_all_elements(obj) # objの内部を全て非選択にする。 waist_z=beditsub.get_at(obj, waist_indices[0]).z # 腰位置z取得get_selected_vertex_indices neck_z =beditsub.get_at(obj, neck_indices[0]).z # 首位置z取得 beditsub.set_select_renage(obj, ymin=0.01, zmin=waist_z-0.001, zmax=neck_z-0.001) # ボディの後側頂点選択 # beditsub.move_parallel_y(obj,param=0.3,selected=True) # 選択域のお尻以外の背中を?せさせる(Y軸の幅を、0.3倍に減らす) beditsub.set_select_renage(obj, zmax=neck_z-0.001) # ボディの後側頂点選択 beditsub.move_parallel_y(obj,param=0.4,selected=True) # ボディ全体を痩せさせる(Y軸の幅を0.4倍に減らす) # return obj if __name__ == '__main__': # オブジェクトモードで、実行させる必要があります for obj in bpy.data.objects:# 'Camera' と 'Light' 以外を全て削除する if obj.name=='Camera' or obj.name=='Light': continue bpy.data.objects.remove( obj ) # 「リギング:Rigify」アドオン時に使える「アーマチュア」の「Human (Meta-Rig)」追加 bpy.ops.object.armature_human_metarig_add() armature = bpy.context.active_object # 直前で生成したアーマチュアオブジェクト add_object()
import math import sys import sys DRV='D' # windows system ドライブ名 libpath=f'{DRV}:\\work' # 追加モジュールパス if not (libpath in sys.path): sys.path.append(libpath) # from importlib import reload import bpy import bmesh import mathutils import beditsub # 自作モジュール #reload( beditsub ) def add_object(): # 顔の輪郭メッシュ生成------------------------------------------------------------------------------------------------ if bpy.context.mode != 'OBJECT': bpy.ops.object.mode_set(mode='OBJECT')# オブジェクトモードに切り替え # bpy.ops.mesh.primitive_circle_add(location=(0, -0.02, 1.73), scale=(1, 1, 1), vertices=32,radius=0.01)#円の追加 obj = bpy.context.active_object # 直前でアクセスしたオブジェク obj.name = "head" # 名前を付ける bpy.ops.object.mode_set(mode='EDIT')# 編集モードに切り替え bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='EDGE') # 辺選択モード bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.02)})# 押し出し処理 bpy.ops.transform.resize(value=(5, 13, 0))# サイズ変更処理 (顎の先のライン) jaw_indices=beditsub.get_selected_edges_indices(obj) # 選択状態の辺の添え字群リスト取得(顎の辺ラインの情報) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.05)})# 押し出し処理 bpy.ops.transform.resize(value=(1.7, 1.1, 0))# サイズ変更処理(口の下のライン) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.01)})# 押し出し処理 bpy.ops.transform.resize(value=(1, 1, 0))# サイズ変更処理(口のライン) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.005)})# 押し出し処理 bpy.ops.transform.resize(value=(1, 1, 0))# サイズ変更処理(口の上のライン) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.015)})# 押し出し処理 bpy.ops.transform.resize(value=(1.03, 1, 0))# サイズ変更処理(鼻下のライン) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.007)})# 押し出し処理 bpy.ops.transform.resize(value=(1, 1, 0))# サイズ変更処理(鼻の頂点ライン) # # 上記の頂点群記憶 nose_indices=beditsub.get_selected_edges_indices(obj) # 選択状態の辺の添え字群リスト取得(鼻の辺ラインの情報) bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='VERT') # 頂点選択モード beditsub.deselect_all_elements(obj) # objの内部を全て非選択にする。 beditsub.set_select_renage(obj, ymin=0.01) # 頭の後側頂点選択 beditsub.move_parallel_y(obj,param=0.6,selected=True) # 頭の下部を縮める(Y軸の幅を0.5倍に減らす) beditsub.deselect_all_elements(obj) # objの内部を全て非選択にする。 # beditsub.select_edges_by_indices(obj, jaw_indices) # 顎の頂点ラインの選択復元 bpy.ops.transform.rotate(value=math.radians(-10), orient_axis='X') # 回転 bpy.ops.transform.translate(value=(0, 0, 0.01))# 選択(ここでは頂点)の移動 # beditsub.deselect_all_elements(obj) # objの内部を全て非選択にする。 beditsub.select_edges_by_indices(obj, nose_indices) # 鼻の辺のラインの選択復元 # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.030)})# 押し出し処理 bpy.ops.transform.resize(value=(1.2, 1.2, 0))# サイズ変更処理(耳のライン) bpy.ops.transform.translate(value=(0, 0.011, 0))# 選択の移動 # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.024)})# 押し出し処理 bpy.ops.transform.resize(value=(1, 1.02, 0))# サイズ変更処理(目のライン) bpy.ops.transform.translate(value=(0, 0.005, 0))# 選択の移動 # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.026)})# 押し出し処理 bpy.ops.transform.resize(value=(1, 1, 0))# サイズ変更処理(眉毛のライン) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.03)})# 押し出し処理 bpy.ops.transform.resize(value=(0.95, 0.95, 0))# サイズ変更処理(頭下のライン) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.02)})# 押し出し処理 bpy.ops.transform.resize(value=(0.85, 0.85, 0))# サイズ変更処理(頭中下のライン) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.015)})# 押し出し処理 bpy.ops.transform.resize(value=(0.7, 0.7, 0))# サイズ変更処理(頭中のライン) # bpy.ops.mesh.extrude_context_move(TRANSFORM_OT_translate={"value": (0, 0, 0.005)})# 押し出し処理 bpy.ops.transform.resize(value=(0.5, 0.5, 0))# サイズ変更処理(頭上のライン) # bpy.ops.mesh.edge_face_add() # 頭てっぺんの面を生成 beditsub.deselect_all_elements(obj) # objの内部を全て非選択にする。 # target_location=mathutils.Vector((0.0, -0.17, 0.11)) # 目標の位置 vert_idx, _ =beditsub.get_index_closest_vert(obj, target_location ) # 目標の位置に最も近い頂点を選択 bpy.ops.transform.translate(value=(0, -0.03, 0.005))# 選択(ここでは頂点)の移動 # #bpy.context.view_layer.update() # 操作の完了を明示的に待つ return obj if __name__ == '__main__': # オブジェクトモードで、実行させる必要があります for obj in bpy.data.objects:# 'Camera' と 'Light' 以外を全て削除する if obj.name=='Camera' or obj.name=='Light': continue bpy.data.objects.remove( obj ) # 「リギング:Rigify」アドオン時に使える「アーマチュア」の「Human (Meta-Rig)」追加 bpy.ops.object.armature_human_metarig_add() armature = bpy.context.active_object # 直前で生成したアーマチュアオブジェクト import create_body create_body.add_object() add_object()
import sys DRV='D' # windows system ドライブ名 libpath=f'{DRV}:\\work' # 追加モジュールパス if not (libpath in sys.path): sys.path.append(libpath) # from importlib import reload import math import bpy import bmesh import mathutils import beditsub # 自作モジュール import create_body import create_face #reload( beditsub ) #beditsub.logfile=open(f'{DRV}:\\work\\log.txt',"w") area = next(area for area in bpy.context.screen.areas if area.type == 'VIEW_3D') region = area.spaces.active.region_3d region.view_location = mathutils.Vector((0.0, 0.0, 1.8))# 視点の位置を移動(x, y, z の座標を指定) region.view_rotation = mathutils.Euler((math.radians(90), 0.0, 0.0)).to_quaternion()# 視点の回転をリセット(例えば、正面に設定) bpy.context.scene.cursor.location = (0.0, 0.0, 0.0)#3DカーソルをBlenderで原点(0, 0, 0)に移動させる bpy.ops.object.mode_set(mode='OBJECT')# オブジェクトモードに切り替え for obj in bpy.data.objects:# 'Camera' と 'Light' 以外を全て削除する if obj.name=='Camera' or obj.name=='Light': continue bpy.data.objects.remove( obj ) # 「リギング:Rigify」アドオン時に使える「アーマチュア」の「Human (Meta-Rig)」追加 bpy.ops.object.armature_human_metarig_add() armature = bpy.context.active_object # 直前で生成したアーマチュアオブジェクト obj_body=create_body.add_object() # ボディの生成 obj_face=create_face.add_object() # 頭、顔の生成 upper_arm_L=beditsub.adding_flesh_to_bone(armature, "upper_arm.L", radius=0.05, vertices=8, ratios=[1.1, 0.9, 0.8])#腕の生成 upper_arm_R=beditsub.adding_flesh_to_bone(armature, "upper_arm.R", radius=0.05, vertices=8, ratios=[1.1, 0.9, 0.8]) forearm_L=beditsub.adding_flesh_to_bone(armature, "forearm.L", radius=0.04, vertices=8, ratios=[1.1, 0.9, 0.7])#前腕の生成 forearm_R=beditsub.adding_flesh_to_bone(armature, "forearm.R", radius=0.04, vertices=8, ratios=[1.1, 0.9, 0.7]) palm_02_L=beditsub.adding_flesh_to_bone(armature, "palm.02.L", radius=0.06, vertices=8, ratios=[1.1], scale=(0.5, 1, 1))#手のひらの生成 palm_02_R=beditsub.adding_flesh_to_bone(armature, "palm.02.R", radius=0.06, vertices=8, ratios=[1.1], scale=(0.5, 1, 1)) thigh_L=beditsub.adding_flesh_to_bone(armature, "thigh.L", radius=0.08, vertices=8, ratios=[1.1, 0.9, 0.7])#大腿の生成 thigh_R=beditsub.adding_flesh_to_bone(armature, "thigh.R", radius=0.08, vertices=8, ratios=[1.1, 0.9, 0.7]) shin_L=beditsub.adding_flesh_to_bone(armature, "shin.L", radius=0.06, vertices=8, ratios=[1.1, 0.9, 0.7])#すねの生成 shin_R=beditsub.adding_flesh_to_bone(armature, "shin.R", radius=0.06, vertices=8, ratios=[1.1, 0.9, 0.7]) foot_L=beditsub.adding_flesh_to_bone(armature, "foot.L", radius=0.06, vertices=8, ratios=[1.1], scale=(1, 0.5, 1) )#足の生成 foot_R=beditsub.adding_flesh_to_bone(armature, "foot.R", radius=0.06, vertices=8, ratios=[1.1], scale=(1, 0.5, 1) ) #beditsub.logfile.close()