0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Blender×Python理解への道 ~第1章 モディファイアー。それは、Blenderの原点で頂点~

Posted at

今回のテーマ (モディファイアー)

3DCGでのものづくりを効率化したいというのが本シリーズのテーマなわけですが、実はプログラミング抜きでも効率化を行うための仕組みがあるのです。

それが、モディファイアーと呼ばれた🔧(スパナ)マークのアイコンからアクセスできる機能です。

モディファイアーの設定方法 (手動)

以下のようなメニューの中にある

image.png

以下のアイコンですね。

image.png

モディファイアーにはたくさんの種類があって、

  • 物体をもとに別の物体をくりぬいたり
  • 物体を複数個ならべたり
    と色んなことができます。

試しに、前回のコードから立方体を作成して、手動で角が丸まった立方体にしましょう。

import bpy

# 立方体を追加
bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0))

作成された立方体をクリックして、
先ほどのメニューのモディファイアーから「モディファイアーを追加をクリック」
image.png

「生成」 > 「ベベル」の順に辿ってクリックする。
(マウスが離れすぎるとメニューが消えちゃうので慎重気味に操作する必要あり。)
image.png

以下のような角が削られたような立方体に変わります。

image.png

「セグメント」のオプションを変えることで、角の分割数を増やすことができます。

image.png

さらに、「量」のオプションを変えることで、どこから角をとるのかを調整できます。

image.png

ということで、色んなモディファイアーのPython実装を見てみましょう。

Pythonによるモディファイアー設定

上記の角を取った立方体をPythonで再現すると以下のようになります。

import bpy

# 立方体を追加
bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0))

# 現在選択されているオブジェクトを取得
obj = bpy.context.active_object

# オブジェクトにベベルモディファイアを追加
bevel_modifier = obj.modifiers.new(name="ベベル", type='BEVEL')

# モディファイアのプロパティを設定
bevel_modifier.offset_type = 'OFFSET'	# 幅のタイプ
bevel_modifier.width = 0.8  # 量
bevel_modifier.segments = 3  # セグメント

ちなみに、画面(日本語)で「量」を設定するのは、
ソースコード(英語)だとどんな値が該当するの?というのは、
画面で実際に設定した後にスクリプト画面の左下に表示されるログを見れば分かります。
image.png

bpy.context.object.modifiers["ベベル"].width = 0.5
の通りに、widthが画面上の「量」に当たりますね。
image.png

モディファイアの種類

obj.modifiers.newメソッドのtypeに渡す値と、その他の設定値を以下に整理してみました。
全部のモディファイアを知っているわけではないですが。

こんなに種類があったら、やりたいことが既にモディファイアとして存在する可能性もありますね。

image.png

上記のメニューをそれぞれ見てみましょう。

編集

一発目から、使ったことがない分類です……
今度詳しく見てみたいですが、今回は本筋からずれるので詳細は割愛。

名前 type クラス名 ドキュメント
データ転送 DATA_TRANSFER DataTransferModifier リンク
メッシュキャッシュ MESH_CACHE MeshCacheModifier リンク
メッシュ連番キャッシュ MESH_SEQUENCE_CACHE MeshSequenceCacheModifier リンク
UV投影 UV_PROJECT UvProjectModifier リンク
UVワープ UV_WARP UvWarpModifier リンク
頂点ウェイト編集 VERTEX_WEIGHT_EDIT VertexWeightEditModifier リンク
頂点ウェイト合成 VERTEX_WEIGHT_MIX VertexWeightMixModifier リンク
頂点ウェイト(近傍) VERTEX_WEIGHT_PROXIMITY VertexWeightProximityModifier リンク

image.png

生成

逆に一番使う種別ですね。
ミラー・サブディヴィジョンサーフェスなどに関しては、どのBlender本にも書いているのでは?と思います。

名前 type クラス名 ドキュメント
配列 ARRAY ArrayModifier リンク
ベベル BEVEL BevelModifier リンク
ブーリアン BOOLEAN BooleanModifier リンク
ビルド BUILD BuildModifier リンク
デシメート DECIMATE DecimateModifier リンク
辺分離 EDGE_SPLIT EdgeSplitModifier リンク
マスク MASK MaskModifier リンク
ミラー MIRROR MirrorModifier リンク
マルチレゾリューション MULTIRES MultiresModifier リンク
リメッシュ REMESH RemeshModifier リンク
スクリュー SCREW ScrewModifier リンク
スキン SKIN SkinModifier リンク
ソリッド化 SOLIDIFY SolidifyModifier リンク
サブディヴィジョンサーフェス SUBSURF SubsurfModifier リンク
三角面化 TRIANGULATE TriangulateModifier リンク
ボリュームのメッシュ化 VOLUME_TO_MESH VolumeToMeshModifier リンク
溶接 WELD WeldModifier リンク
ワイヤーフレーム WIREFRAME WireframeModifier リンク

image.png

変形

実は未開拓ゾーンです。

名前 type クラス名 ドキュメント
アーマチュア ARMATURE ArmatureModifier リンク
キャスト CAST CastModifier リンク
カーブ CURVE CurveModifier リンク
ディスプレイス DISPLACE DisplaceModifier リンク
フック HOOK HookModifier リンク
ラブラシアン変形 LAPLACIANDEFORM LaplacianDeformModifier リンク
ラティス LATTICE LatticeModifier リンク
メッシュ変形 MESH_DEFORM MeshDeformModifier リンク
シュリンクラップ SHRINKWRAP ShrinkwrapModifier リンク
シンプル変形 SIMPLE_DEFORM SimpleDeformModifier リンク
スムーズ SMOOTH SmoothModifier リンク
スムーズ(変形) CORRECTIVE_SMOOTH CorrectiveSmoothModifier リンク
スムーズ(ラプラシアン) LAPLACIANSMOOTH LaplacianSmoothModifier リンク
サーフェス変形 SURFACE_DEFORM SurfaceDeformModifier リンク
ワープ WARP WarpModifier リンク
WAVE WaveModifier リンク

image.png

ノーマル

同じく未開拓ゾーンです。

名前 type クラス名 ドキュメント
法線編集 NORMAL_EDIT NormalEditModifier リンク
重み付き法線 WEIGHTED_NORMAL WeightedNormalModifier リンク
角度でスムーズ (未対応?) (未対応?) (未対応?)

image.png

物理演算

流体シミュレーションとかに使うモディファイアーですかね。
高性能なPCに買い換えたら試したい。

名前 type クラス名 ドキュメント
クロス CLOTH ClothModifier リンク
コリジョン COLLISION CollisionModifier リンク
ダイナミックペイント DYNAMIC_PAINT DynamicPaintModifier リンク
爆発 EXPLODE ExplodeModifier リンク
流体 FLUID FluidModifier リンク
海洋 OCEAN OceanModifier リンク
パーティクルインスタンス PARTICLE_INSTANCE ParticleInstanceModifier リンク
パーティクルシステム PARTICLE_SYSTEM ParticleSystemModifier リンク
ソフトボディ SOFT_BODY SoftBodyModifier リンク

image.png

具体例

①物体を格子状に並べてみる

配列(Array)モディファイアーを使って、モンキー(スザンヌ)を並べる例です。

import bpy

# モンキー(スザンヌ)
bpy.ops.mesh.primitive_monkey_add(
    location=(0, 0, 0), 
    scale=(1, 1, 1), 
)

# 現在選択されているオブジェクトを取得
obj = bpy.context.active_object

# オブジェクトに配列(Array)モディファイアを追加
row_array_modifier = obj.modifiers.new(
    name='', 
    type='ARRAY', 
)

## 配列の数を3にする
row_array_modifier.count = 3

# オブジェクトに配列(Array)モディファイアを追加
column_array_modifier = obj.modifiers.new(
    name='', 
    type='ARRAY', 
)

## オフセット(倍率) 係数Xを0にする
column_array_modifier.relative_offset_displace[0] = 0
## オフセット(倍率) 係数Yを2にする
column_array_modifier.relative_offset_displace[1] = 2
## 配列の数を2にする
column_array_modifier.count = 2

image.png

②物体を他の物体でくり抜く

2つの立方体を用意して、メイン立方体をサブ立方体でくり抜く例です。

import bpy

# 立方体を追加
bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0))
cube_main = bpy.context.object
bpy.ops.mesh.primitive_cube_add(location=(0.5, 0.5, 0.5))
cube_sub = bpy.context.object

# オブジェクトにブーリアン(Boolean)モディファイアを追加
modifier = cube_main.modifiers.new(
    name='ブーリアン', 
    type='BOOLEAN', 
)

modifier.operation = 'DIFFERENCE'	# 差分
modifier.operand_type = 'OBJECT'	# 演算対象: オブジェクト
modifier.object = cube_sub	# オブジェクト
modifier.solver = 'EXACT'	# 正確

# メインオブジェクトを変更
bpy.context.view_layer.objects.active = cube_main

image.png

ちなみに、修正を反映するには∨マークから「適用」を選択するか、
image.png

モディファイアーの変数に関して以下のようにmodifier_applyを実行することで、
モディファイアーをオブジェクトに永続的に反映できます。

bpy.ops.object.modifier_apply(modifier=modifier.name)

一度モディファイアーを適応してしまうと、後から元の状態に戻せないので注意が必要です。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?