Thursday, July 31, 2014

Blender Python Console にてオブジェクトに頂点・辺追・面を追加

2014/7/30 開催の Okinawa.rb に参加。

本来 Ruby の集いであるにも関わらず、この日は構わず Blender 方面へ突入。主に Python Console において Bpy な方面へ。

結果、オブジェクト(以降の説明では Plane)に対し、頂点、辺、面をそれぞれ追加する手法を理解したため、以下のとおりメモ。

準備

まず、本件について準備しつつ Python Console を開くまでの手順。 Blender は、現 2.71 の on OS X な版を使用。

デフォルトの Cube は使用しないため削除。(X キーをタイプ)

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-31+22.52.36.png

オブジェクト(Plane)を配置するため、 3D View の表示形式を Top Persp に切り替え。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-31+22.54.54.png

3D View にマウスカーソルをのせ、スペースキーをタイプ。 表示されたメニューから Add Plane を選択。 なお、以下な矢印の付け根部分をドラッグすることで画面分割が可能。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2014-07-31_22_56_01.png

Editor Type のメニューから Python Console を選択。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-31+22.56.37.png

これで Python Console が開きます。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-31+22.56.42.png

頂点の追加

Python Console に以下を入力し、 3D View にマウスカーソルを移動させタブキーをタイプして Edit Mode に切り替えると

d = bpy.data.objects['Plane'].data
d.vertices.add(1)
d.vertices[4].co.x = 3

以下のアカマルな位置に頂点が追加されている。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2014-07-31_21_56_57.png

ちなみに、 bpy.data.objects['Plane'].data の戻りは bpy.data.meshes['Plane'] であり Blender 2.71.0 5c2d7f7 - API documentation では bpy.types.Mesh に示される。 vertices については bpy.types.MeshVertex

辺の追加

3D View にマウスカーソルを移動させ、タブキーをタイプして Object Mode に切り替えた後、 Python Console にて以下な入力。

d.edges.add(2)
d.edges[4].vertices = [3, 4]
d.edges[5].vertices = [1, 4]

Edit Mode に切り替えると辺が 2 つ追加されている。なお、頂点のインデックスについては、どうやら図中番号のように Blender では管理される模様。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2014-07-31_22_27_56.png

面の追加

Object Mode に切り替え、 Python Console にて以下な入力。

d.loops.add(3)
d.loops[4].vertex_index = 1
d.loops[5].vertex_index = 4
d.loops[6].vertex_index = 3

d.polygons.add(1)
d.polygons[1].loop_start = 4
d.polygons[1].loop_total = 3

d.loops のデフォルトを確認すると vertex_index にそれぞれ 0, 1, 3, 2 が設定されている。これに追加し 0, 1, 3, 2, 1, 4, 3 とする。 また d.polygons にひとつ追加し、 d.loops の要素中、 4 番目から 3 つ目までを追加面として設定している。

Edit Mode に切り替た後、確認すると以下なとおり。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-31+22.48.37.png

これらの手法で、プログラム的モデリングについていろいろ妄想中。

あと、 いい加減、そろそろ Unity 方面をおさえないとな件。