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