Takunojiのプログラミング・プレイグラウンド(遊び場)

「プログラミングのススメ」と学習した結果身につくもの、アイディアを実現するために何をしたら良いか?の答えが出せるようになります。

Blender Python BMesh 〜点の操作〜

前回は、イメージファイルからの座標点の取得〜画面上への描画を行う
スクリプトについて説明しました。

色々と考えたのですが、点(vertex)の操作方法を学ぶ方が先だと思い今回に至ります。

Python Consoleを使い、点を作成しプレートと併用して、オブジェクの変形まで
やれたらいいなと思います。
とりあえず、以下のコマンドを入力しました。

>> ob = bpy.context.object
>>> import bmesh
>>> bm = bmesh.from_edit_mesh(ob.data)
>>> bm.verts.new ( (0,0,0 ) )
<BMVert(0x109c4e398), index=-1>

>>> bm.verts.new ( (-1,-1,0 ) )
<BMVert(0x109c4e408), index=-1>

>>> bm.verts.new ( (1,1,0 ) )
<BMVert(0x109c4e3d0), index=-1>

# ヘルプの内容です。
>>> bmesh.update_edit_mesh(
update_edit_mesh(mesh, tessface=True, destructive=True)
.. method:: update_edit_mesh(mesh, tessface=True, destructive=True)
Update the mesh after changes to the BMesh in editmode,
optionally recalculating n-gon tessellation.
:arg mesh: The editmode mesh.
:type mesh: :class:`bpy.types.Mesh`
:arg tessface: Option to recalculate n-gon tessellation.
:type tessface: boolean
:arg destructive: Use when geometry has been added or removed.
:type destructive: boolean
>>> bmesh.update_edit_mesh(ob.data)
>>>

こんな感じで出力します。
※太文字の部分が実行コマンドになります。

f:id:Takunoji:20180326210748p:plain

前回作成したスクリプトも同様の手段を使用して点(Vertex)を作成しています。
ここで、点を操作するときに最後の行bmesh.update_edit_mesh()を実行した後だと
変数の「bm」が空になってしまうため更新前に点の処理を行います。
つまり、
>>> bm = bmesh.from_edit_mesh(ob.data)
# この間で点の追加〜編集を行います。
bm.verts.ensure_lookup_table()
>>> bmesh.update_edit_mesh()
ということです。
そして「bm.verts.ensure_lookup_table()」を実行した後でないと
点の操作はできない仕様になっていました。
bm.verts.ensure_lookup_table()の実行前

f:id:Takunoji:20180326220207p:plain

実行後

f:id:Takunoji:20180326220258p:plain

そんなこんなで、スクリプトを作成してみました。
実行結果は以下のようになりました。
※テストの残骸が残っていますが。。。。

f:id:Takunoji:20180326224837p:plain

ソースとしては、以下のような形です。
起動するソースはこちら(ダウンロードできます)

import bpy, bmesh

ob = bpy.context.object
bm = bmesh.from_edit_mesh(ob.data)

vList =
vList.append((-0.5, -0.5, 0.0))
vList.append((0.5, -0.5, 0.0))
vList.append((0.5, 0.5, 0.0))
vList.append((-0.5, 0.5, 0.0))

i = 0
list =
for v in bm.verts:
print(v.co)
if i >= 4:
print("*** IN ***")
bm.verts.new(vList[i-4])
list.append(v)
if i -3 == len(vList):
break
print(i)
i = i+1
print(i)
print(len(list))

bm.edges.new*1
次回は、点の作成時の座標について勉強します。
お疲れ様でした。

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseにCDTをインストール〜
  3. Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
 

*1:list[0], list[1]