需要があるのがないのかわからない Blender Python スクリプト講座。日本語の情報がなかったので。あと検索範囲が足りないのかもしれないけど、英語でも古い情報しかなかったような......。
こういうグリッドを、
こうしたいと考えます。ランダムに 10 個頂点を選択して、上に持ち上げて波打った地面のようにするという作業です。
頂点の編集(基本)
基本的には、bpy.data
から頂点を編集するのが王道です。以下のようなスクリプトを考えてみます。
import bpy
import random
obj = bpy.context.object
msh_name = obj.to_mesh().name
msh = bpy.data.meshes[msh_name]
vts = msh.vertices
size = len(vts)
for i in range(10):
idx = random.randint(0,size-1)
vts[idx].co.z += 1
これは、
このような絵面が生み出されます。プロポーショナル編集にしていないから当たり前です。
プロポーショナル in オブジェクトモード
次に、オブジェクトモードでプロポーショナル編集を有効にしてみます。
obj = bpy.context.object
msh_name = obj.to_mesh().name
msh = bpy.data.meshes[msh_name]
vts = msh.vertices
vts_size = len(vts)
bpy.context.tool_settings.use_proportional_edit_objects = True #追加
for i in range(10):
idx = random.randint(0,vts_size-1)
vts[idx].co.z += 1
プロポーショナル編集マークはアクティブになりますが変化なしです。実はこれは、オブジェクトの拡大とか回転とかをプロポーショナルに伝播させるための機能で、頂点編集とは関係ないのでした。
編集モード
やはり編集モードで頂点を編集する必要があります。以下のようなコードに修正します。
import bpy
import bmesh
import random
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
obj = bpy.context.object
meshdata = bmesh.from_edit_mesh(obj.data)
verts = meshdata.verts
size = len(verts)
bpy.context.tool_settings.use_proportional_edit = True
for i in range(10):
idx = random.randint(0,vts_size-1)
verts[idx].select_set(True)
bpy.ops.transform.translate(value=(0,0,.5))
verts[idx].select_set(False)
!?
それでもプロポーショナル編集は反映されません。マークは有効になっているのに。
結論
tool_settings
の設定は全く関係なく、translate
の引数の中にプロポーショナル編集を使うことを明示する必要があります。公式ドキュメントはこちら。
import bpy
import random
import bmesh
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
obj = bpy.context.object
meshdata = bmesh.from_edit_mesh(obj.data)
verts = meshdata.verts
size = len(verts)
# bpy.context.tool_settings.use_proportional_edit = True #全くの無意味
for i in range(10):
idx = random.randint(0,vts_size-1)
verts[idx].select_set(True)
bpy.ops.transform.translate(value=(0,0,.5),use_proportional_edit=True,proportional_size=0.5)
verts[idx].select_set(False)
これでやっとスクリプトによるプロポーショナル編集ができました。