0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

BlenderのPythonスクリプトでプロポーショナル編集したい時

Last updated at Posted at 2021-10-11

 需要があるのがないのかわからない Blender Python スクリプト講座。日本語の情報がなかったので。あと検索範囲が足りないのかもしれないけど、英語でも古い情報しかなかったような......。

image.png

 こういうグリッドを、

image.png

 こうしたいと考えます。ランダムに 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

 これは、

image.png

 このような絵面が生み出されます。プロポーショナル編集にしていないから当たり前です。

プロポーショナル 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

image.png

 プロポーショナル編集マークはアクティブになりますが変化なしです。実はこれは、オブジェクトの拡大とか回転とかをプロポーショナルに伝播させるための機能で、頂点編集とは関係ないのでした。

編集モード

 やはり編集モードで頂点を編集する必要があります。以下のようなコードに修正します。

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)

image.png

 !?

 それでもプロポーショナル編集は反映されません。マークは有効になっているのに。

結論

 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)

image.png

 これでやっとスクリプトによるプロポーショナル編集ができました。

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?