1
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.

Blender2.9のPythonスクリプトで頂点(vertices)の変更が反映されない人向けへの記事

Last updated at Posted at 2021-07-08

 Blenderのバージョンを指定したのは、2.79以前を使っていたり、未来の人(もちろんBlenderのAPIも変わっている)が参照して困らないように、おおまかな時期の指標として書いただけで、特に2.8や2.9x間でシビアなバージョン指定があるという訳ではありません。

基本

image.png

 キューブの頂点を変形させます。

msh = bpy.data.meshes['Cube']
vts = msh.vertices
vts[0].co = (5,5,5)

image.png

 こうなります。

 しかしそうならない時もあります。

contextでアクセスしている

 Blenderスクリプトにおいて、データにアクセスする手段は主に2つあります。

  • bpy.data
  • bpy.context

 です。前者は一覧リスト(正確には辞書)から選ぶ方式。後者は現在選択している要素から選ぶ方式です。基本は都合に応じて使い分ければいいと思いますが、contextは読み取り専用というトラップがあります。という訳で、以下のようなスクリプトを走らせた場合、操作としては全く同じことをしているのに値が変更されない※ということになります。エラーを出してくれないかな?

obj = bpy.context.object
msh = obj.to_mesh()
vts = msh.vertices
vts[0].co = (5,5,5)

 対策は、メッシュの名前を取得してからdataでアクセスし直すことです。

obj = bpy.context.object
msh_name = obj.to_mesh().name
msh = bpy.data.meshes[msh_name]
vts = msh.vertices
vts[0].co = (5,5,5)

※正確には、頂点の座標のデータは変わっているのにそれがシーンに反映されないようです。

シェイプキーが設定されている

 オブジェクトにあるシェイプキーを追加した時点で、Basisというシェイプキーが追加されます。これは基本(変形元)となる特別なシェイプキーで、値を設定できません。それ以降に追加されるシェイプキーは、値が設定できるいわゆる普通のシェイプキー(変形先)になります。そして、一旦シェイプキーが設定されると、メッシュデータの頂点座標をいじっても反映されなくなります。なぜなら、メッシュが持っている頂点座標とBasisは別物だからです。

 結論的には、Basisのデータをいじる必要があります。

msh = bpy.data.meshes['Cube']
spk = msh.shape_keys
kbc = spk.key_blocks

 key_blocksというのがシェイプキー群を司るデータになります。

console
>>> kbc[0]
bpy.data.shape_keys['Key'].key_blocks["Basis"]

 複数のシェイプキーを登録していた場合、kbc[1]kbc[2]でアクセスできます。頂点座標は、その中のdataという属性が持っています。

msh = bpy.data.meshes['Cube']
spk = msh.shape_keys
kbc = spk.key_blocks
vts = kbc['Basis'].data
vts[0].co = (5,5,5)

 こうすれば変形できるはずです。

参考記事:Blender PythonのMeshデータアクセスのチートシート

1
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
1
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?