bpy (Blender Python API)を用いた3Dモデリングの際に頻繁に頻繁に用いる、オブジェクトの基本的な変形操作についてまとめます。
選択したオブジェクト、もしくはインデックスを用いて選択した要素に対して変形処理を行っていきます。
動作確認環境 : Blender 4.2
▼ 要素・オブジェクト選択
オブジェクト・要素の移動
Python :
# オブジェクト・要素移動
bpy.ops.transform.translate(
value=(0.1, 0, 0) # (x, y, z)
, orient_type='GLOBAL'
)
orient_type
- LOCAL
- GLOBAL
- NORMAL
サイズ拡大・縮小
Python :
bpy.ops.transform.resize(
value=(0.5, 1, 1) # (x, y, z)
, orient_type='GLOBAL'
)
orient_type
- LOCAL
- GLOBAL
- NORMAL
押し出し・引き込み・延長
要素(面、辺、頂点)を指定し、選択した要素を法線に沿って押し出し、引き込み
Python :
# 法線方向への押し出し、引き込み
bpy.ops.mesh.extrude_region_shrink_fatten(
MESH_OT_extrude_region={}
, TRANSFORM_OT_shrink_fatten={
"value":10
}
)
要素(面、辺、頂点)を指定し、選択した要素を押し出し、引き込み
Python :
# 押し出し、引き込み
bpy.ops.mesh.extrude_region_move(
MESH_OT_extrude_region={
},
TRANSFORM_OT_translate={
"value":(1, 0, 0)
, "orient_type":'GLOBAL'
})
ベジェ曲線の延長
Python :
# ベジェ曲線 延長 [E]
bpy.ops.curve.extrude_move(
CURVE_OT_extrude={
"mode":'TRANSLATION'
}
, TRANSFORM_OT_translate={
"value":(0.5, 0, 0.5)
, "orient_type":'GLOBAL'
}
)
縁の拡大、縮小
ショートカットで操作すると"info"にはextrude_region_moveだけが表示されているが、Pythonで実装するとBUG?で2つ必要らしい
Python :
# 面の作成
bpy.ops.mesh.extrude_region_move(
MESH_OT_extrude_region={},
TRANSFORM_OT_translate={
}
)
# サイズ変更
bpy.ops.transform.resize(
value=(2, 2, 1)
, orient_type='GLOBAL'
)
テキストオブジェクト等メッシュに厚みを付けるときに用いる
Python :
# 厚みを付ける
bpy.context.object.data.extrude = 0.5
面の差し込み
選択した面を差し込む
Python :
# 面の差し込み
bpy.ops.mesh.inset(
thickness=0.1
, depth=0
)
選択した個々の面を差し込み
Python :
# 個々の面差し込み
bpy.ops.mesh.inset(
thickness=0.01
, depth=0
, use_individual=True
)
オブジェクト・要素回転
Python :
# 回転
bpy.ops.transform.rotate(
value=-0.18
, orient_axis='X'
, orient_type='GLOBAL'
)
valueの値を「math.radians(数値)」を用いて記載することで、度数で直感的に記載することも可能です。
▼参考
プロポーショナル編集
プロポーショナル編集による要素の移動
Python :
# 要素を移動(プロポーショナル編集)
bpy.ops.transform.translate(
value=(0, 0, 0.1) # 移動距離(x, y, z)
, orient_type='GLOBAL' # 移動方向を指定するオリエンテーションタイプ
# プロポーショナル編集
, use_proportional_edit=True # プロポーショナル編集(周囲の頂点に影響)
, proportional_edit_falloff='SHARP' # プロポーショナル編集の影響の強さ('SMOOTH':影響が滑らかに減少)
, proportional_size=0.5 # プロポーショナル編集の範囲指定
, use_proportional_connected=False # 接続された頂点にのみ影響(False:全体に影響)
, use_proportional_projected=False # 投影された範囲に適用(False:通常の3D空間に適用)
)
プロポーショナル編集による要素の回転
Python :
# プロポーショナル回転
bpy.ops.transform.rotate(
value=math.radians(180)
, orient_axis='Z'
, orient_type='GLOBAL'
# プロポーショナル
, use_proportional_edit=True
, proportional_edit_falloff='SMOOTH'
, proportional_size=0.1
, use_proportional_connected=False
, use_proportional_projected=False
)
面や辺の追加・削除
ベベルによる辺の複製 & 移動
Python :
# 辺の数を増やす(ベベル利用)
bpy.ops.mesh.bevel(
offset=0.1 # ベベルのオフセット処理(値が大きいほど面取り幅が大きい)
, offset_pct=0 # オフセット距離を%で指定
, segments=1 # ベベルに追加するセグメント数(値が大きいほど滑らか)
, affect='EDGES' # 辺/頂点
)
選択指定面の追加、削除
Python :
# 面追加・埋める・貼る(F)
bpy.ops.mesh.edge_face_add()
# 面削除
bpy.ops.mesh.delete(type='FACE')
オブジェクトベベル
Python :
# ベベル
bpy.context.object.data.bevel_depth = 0.5
オブジェクト・要素の複製
選択メッシュ要素の複製
Python :
# メッシュ複製
bpy.ops.mesh.duplicate_move(
MESH_OT_duplicate={
"mode":1
},
TRANSFORM_OT_translate={
"value":(0, 0, 0)
, "orient_type":'GLOBAL'
})
オブジェクトの複製
Python :
# 「Shift」+「D」:オブジェクトを複製
bpy.ops.object.duplicate_move(
OBJECT_OT_duplicate={
"linked":False # オリジナルのオブジェクトにリンクしない(編集してもオリジナルに影響しない)
, "mode":'TRANSLATION' # 複製後にオブジェクトが移動
},
TRANSFORM_OT_translate={
"value":(0, 0, 0)
, "orient_type":'GLOBAL'
})
ループカット
選択した辺に対してループカット
Python :
# ループカット
bpy.ops.mesh.loopcut_slide(
MESH_OT_loopcut={
"number_cuts":1 # 追加ループ数
, "smoothness":0 # スムージングの強さ:0~1
, "falloff":'INVERSE_SQUARE' # カット減衰 "INVERSE_SQUARE":逆2乗フォールオフ(SHARP)
, "object_index":0 # 編集するオブジェクトのインデックス(default:0)
, "edge_index":1 # ループカットを適用するエッジインデックス
}
, TRANSFORM_OT_edge_slide={
"value":0.9 # スライド位置(0:スライドしない)
, "single_side":False # 片側にスライドを適用
, "use_even":False # スライド均等(False:均等にしない)
}
)
以上