Blender Python 開発メモ〜パネル表示〜
アドオン写経2
https://docs.blender.org/manual/en/dev/advanced/scripting/addon_tutorial.html#your-second-add-on
単発アドオンを作成してGITにアップ
1.写経してアドオンの作成パターンを理解する
2.ファイル分割、パッケージ化は二の次
3.アドオンの構成を理解する
・単発ファイルでオペレータとパネルの関連を理解
・コンポーネント作成とアクション
メートル法設定
https://wiki.blender.org/index.php/User:Rayek/Doc:2.6/Manual/Interface/Units
実寸設定
https://dskjal.com/blender/set-units.html
https://docs.blender.org/api/blender_python_api_2_63_release/bpy.app.handlers.html
import bpy
#パネルの左にチェックボックス
def my_handler(scene):
print("Frame Change", scene.frame_current)
bpy.app.handlers.frame_change_pre.append(my_handler)
初めに設計をちゃんとやらないとわけがわからなくなるので以下に注意
1.作成する入力コンポーネントを何個使うのか?
2. どのように使うのか?
3.Operatorで各コンポーネントを定義するのでここを工夫して(Codeで)
なんとかする
4.Panel側は、使用するコンポーネントの登録で終わらせる(そういう仕様だと思う)
Operatorクラスで bl_idnameで指定したIDをパネルで表示できることを確認
< in Panel#draw()>
print("Drawing")
layout = self.layout
layout.label(text="Hello World")
col = layout.column(align=True)
row = col.row(align = True)
row.operator("object.root_operator", text = "RootOperator")
< in Operatorフィールド>
bl_idname = "object.root_operator"
<Git>パターン1
https://gist.github.com/p2or/a00bdde9f2751940717a404cf977dd01
パネルに表示するものはオペレーターで定義する
オペレーターで定義したIDを読み込む
https://docs.blender.org/api/blender_python_api_current/bpy.types.Operator.html
bl_idnameがこの部分に対応し
「bpy.ops.この部分」の様に使用すると思われる
import bpy
class HelloWorldOperator(bpy.types.Operator):
bl_idname = "wm.hello_world"
bl_label = "Minimal Operator"
def execute(self, context):
print("Hello World")
return {'FINISHED'}
bpy.utils.register_class(HelloWorldOperator)
# test call to the newly defined operator
bpy.ops.wm.hello_world()
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
Python OpenCv 機械学習1 〜機械学習処理の事始め〜
前回まで、Blenderで家紋を作成しようといていました。
イメージファイルを読み込み、イメージの輪郭から座標点を取得して、
Blender上にVertexとして表示するところまで来ました。
そこから色々と試したのですが、まずは画像の解析が必要だと思い
今回に至る次第です。
とりあえずは、コードです。
ここのサイトから失敬して来ました。
翻訳機能を使用しながら読んでます。(笑)
そして、イメージファイルを変換するための処理はこちらをどうぞ
Reading and Writing Images — OpenCV 3.0.0-dev documentation
※赤文字の部分は起動しなかったので修正しました。
上記のコードから「Now Training」の部分を実行したいのですが。。。
以下のようなエラーが出力されました。
Traceback (most recent call last):
File "/20180330_MchineLearning1.py", line 17, in <module>
AttributeError: module 'cv2.cv2' has no attribute 'SVM_LINEAR'
Error: Python script fail, look in the console for now...
これのでバックに手間取り今日のところは終了です。
ちなみに、原因は「opencv-contribをインストールする必要があります」
ということのようです。
OpenCvのインストールディレクトリに移動して、以下のコマンドを叩きます。
pip install opencv-contrib-gp = bpy.context.scene.grease_pencil
これで、動くと思ったのですが…
動きませんでした(笑)
いや、上記の問題は解決したのですが
Now Trainingの部分にある
train()が動かなかったのです…
なので、次回はpythonから横っ飛びしてc++でのOpenCvを見てみようと思います。
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
Blender Python プログラミング 〜倍率の取り方〜
前回は、点(Vertex)から面(face)を作成する方法をやりました。
今回は、簡単に倍率の取り方をやります。
「倍率の取り方」という言葉だけだと「意味わからん」となってしまいますので
今回は、以前作成した家紋のを描画するスクリプトで家紋が画面の外に行ってしまったのでそれを適当なサイズにします。
そのために「倍率」を使用します。
色々と実験したので残骸がありますが。。。
とりあえずコードです。
# 緑色の部分がOpenCv(Python)のインポート処理です。
<ソースファイルはこちら>
import os, sys, numpy as np
import bpy, bmesh
sys.path.append("/usr/local/lib/python3.6/site-packages/")
import cv2
# 読み込むイメージファイルのパス
imgPath = "/yourFolder/BlenderPython/img/kamon/mouri-motonari-kamon.png"
im = cv2.imread(imgPath,0)
thresh = cv2.Canny(im, 100, 200)
x = 0
y = 0
list = []
pickupFlg = False
addListFlg = True
tmp = 0
# 作成モードを切り替え(OBJECT or EDIT)
bpy.ops.object.editmode_toggle()
#ハンドル用メソッド
def judge(col, tmp):
pickupFlg = (not col == tmp)
tmp = col
return pickupFlg
# 対象の座標をリストに追加する
def isAddList(addListFlg, pickUpFlg, row, index):
# pickUpFlg = judge(row[index],tmp)
if pickUpFlg and addListFlg:
addListFlg = judge(row[index + 1], tmp)
return pickUpFlg
# 表示する領域のサイズ
print_size = 2
# イメージの倍率(X座標, Y座標)
x_mag = print_size / len(thresh)
y_mag = print_size / len(thresh[0])
first_x = 0
first_y = 0
for row in thresh:
for col in row:
# 座標をリストに登録するかのフラグ
pickupFlg = judge(col,tmp)
# リストに追加するかのフラグ
addListFlg = isAddList(addListFlg, pickupFlg, row, x)
if pickupFlg:
if addListFlg:
first_x = x * x_mag
first_y = -(y * y_mag)
list.append*1
addListFlg = not addListFlg
x += 1
x = 0
y += 1
#print(list)
ob = bpy.context.object
# エディットモードに設定
bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(ob.data)
print(len(list))
print(list[0])
for co in list:
# 点の作成処理
bm.verts.new(co)
# 編集を終了する(確定する)
bmesh.update_edit_mesh(ob.data)
#bpy.ops.object.mode_set(mode='OBJECT')
上記のコードで赤字の部分が倍率を指定している部分になります。
イメージファイルのサイズ(縦と横)に対して、それぞれ倍率
→指定する大きさ / 縦 or 横の最大サイズ
例: 600 x 1200 pix の画像サイズならば縦=600 横=1200で
取得したX座標 * ( 1 / 600) ならば表示する領域のX座標の最大(一番右)が1
同様にY座標 * (1 / 1200) なので表示する領域を変数にしてやると。。。
結局表示領域の大きさをいじってやれば表示する大きさも変更できます。
→表示領域を指定する変数が倍率をコントロールします。
今日はここまで
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
*1:first_x
,first_y, 0
Blender Python Basic and Script 〜基本とスクリプト〜
前回は、ブレンダーのインストールからPythonでのハローワールド
オブジェクトの移動までやりました。
今回は、オブジェクトのプロパティを変更してみようと思います。
プロパティとはオブジェクトの持っている情報のことです。
前回の「移動」に関しては位置情報のプロパティを変更して移動しました。
プロパティ一覧はこちら
Context Access (bpy.context) — Blender 2.73.0 b4d8fb5 - API documentation
英語が苦手な人はこのまま進んでください。
ちなみに自分も見たけどプロパティの操作方法がわかりませんでした。
とりあえず、前回の「location」の操作
>bpy.context.object.location = (2,0,0)
これでCubeが移動します。
次は、角度を変更します。
>bpy.context.object.ratation_euler = (1,0,0)
>bpy.context.object.rotation_euluer = (0,1,0)
>bpy.context.object.rotation_euler = (0,0,1)
回転する向きが変わるようです。
>bpy.context.object.rotation_euler = (2,0,0)
そして、変形するために「オブジェクトモード」(デフォルト)から「エディットモード」に変更します。
>bpy.ops.mode_set(mode='EDIT', toggle=False)
ちょっと長いですが点の移動を行います。
>bpy.ops.transform.translate(value=(-0.383242, -0.874999, -0.00590833), constraint_axis=(False, False, False), constraint_orientation='GLOBAL', mirror=False, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1)
ちなみにこれも選択している点を操作するスクリプトになります。
そして、点の選択方法は1行でやっているスクリプトが見つかりませんでした。
https://blender.stackexchange.com/questions/23113/select-vertices-of-mesh-in-python
mport bpy,bmesh
ob = bpy.data.objects['Cube']
mesh=bmesh.from_edit_mesh(bpy.context.object.data)
for v in mesh.verts:
v.select = True
# trigger viewport update
bpy.context.scene.objects.active = bpy.context.scene.objects.active
今日はここまでにします。
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
Blender Python BMesh 〜点から面へ〜
前回は、点(Vertex)を作成し線を作成して座標の確認を行いました。
今回は、面を作成します。
前回のポイントは、既存のオブジェクトにおける座標を設定するのが
以下のようなスクリプト(BMeshでの処理?)です。
ob = bpy.context.object
bm = bmesh.from_edit_mesh(ob.data)
v1 = bm.verts.new*1
v2 = bm.verts.new*2
v3 = bm.verts.new*3
bm.edges.new*4
bm.edges.new*5
bm.edges.new*6
※Z軸の座標は0→1に変更しています。
この状態(スクリプト)だと線を描くだけです。
ここまで来たので、サクッと面を作成したいと思うのが人情(自分だけ?)
なので上記のスクリプトをちょいといじります。
import bpy, bmesh
ob = bpy.context.object
bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(ob.data)
bpy.ops.mesh.select_all(action='DESELECT')
v1 = bm.verts.new*7
v1.select = True
v2 = bm.verts.new*8
v2.select = True
v3 = bm.verts.new*9
v3.select = True
bpy.ops.mesh.edge_face_add()
#bm.edges.new*10
#bm.edges.new*11
#bm.edges.new*12
こんな感じで描画されました。
板(Plane)の上にある三角形はスクリプトで作成したものなので
Planeに依存しています。なので隣の画像のように回転します。
次回は、
現状のままでは2Dモデルです。なので、3Dモデルとして形を作りたいと思います。
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
Blender Python BMesh 〜点の座標について学ぶ〜
前回、スクリプトで点を作成し、線を作りました。※イマイチな感じでしたが。。。
今回は、復習がてらに線を作成してから始めます。
一回作成したものは、元のソースから持って来れば良いので
速攻でできます。
>> ob = bpy.context.object
>>> bm = bmesh.from_edit_mesh(ob.data)
>>> bm.verts
<BMVertSeq object at 0x114fb5900>
>>> v1 = bm.verts.new( (0,0,0) )
>>> v2 = bm.verts.new( (1,1,0) )
>>> v3 = bm.verts.new( (-1,-1,0) )
>> bm.edges.new( (v1, v2) )
<BMEdge(0x115000150), index=-1, verts=(0x10bba2af0/-1, 0x10bba2b28/-1)>
>>> bm.edges.new( (v2, v3) )
<BMEdge(0x1150001a0), index=-1, verts=(0x10bba2b28/-1, 0x10bba2b60/-1)>
>>> bm.edges.new( (v3, v1) )
<実行結果>
左のものは、作成した点が平面状にあり、隠れていたので動かしました。
右のものは、移動した、板の上に点を作成したものです。
くどいようですが、座標が確認できるように下記のスクリプトを実行しました。
import bpy, bmesh
ob = bpy.context.object
bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(ob.data)
v1 = bm.verts.new( (0,0,0) )
v2 = bm.verts.new( (1,0,0) )
v3 = bm.verts.new( (0,1,0) )
bm.edges.new( (v1, v2) )
bm.edges.new( (v2, v3) )
bm.edges.new*1
次に板を180度回転させて、以下のようにして同じスクリプトを実行します。
ちょっとわかりづらいのですが、回転後も同じ場所に点が作成されました。
作成する点を以下のように変更し再度スクリプトを実行します。
v1 = bm.verts.new*2
v2 = bm.verts.new*3
v3 = bm.verts.new*4
どうやらBMeshで点を作成するときは、オブジェクト(Plane)の座標に依存するようです。
つまり、元々の位置の中心=(0,0,0)で回転させてもオブジェクト上の座標は変わらないということがわかりました。
なるほど!!
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
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)
>>>
こんな感じで出力します。
※太文字の部分が実行コマンドになります。
前回作成したスクリプトも同様の手段を使用して点(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()の実行前
実行後
そんなこんなで、スクリプトを作成してみました。
実行結果は以下のようになりました。
※テストの残骸が残っていますが。。。。
ソースとしては、以下のような形です。
起動するソースはこちら(ダウンロードできます)
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 セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
*1:list[0], list[1]
Blender Python 開発 〜イメージからオブジェクトを作る(説明)〜
前回、イメージから点を表示するところまでやりました。
前回は家紋を表示したのですが、今回は別のものを表示します。
ちなみに、上記の画像は表示するパスを変更して実行しています。
元のソースはこちらです。(Gitからダウンロードできます)
一応処理内容を説明いたします。
# 必要なライブラリをインポートします。
import os, sys, numpy as np
import bpy, bmesh
# OpenCvのインストール先をパスに追加する
sys.path.append("/usr/local/lib/python3.6/site-packages/")
# OpenCvをインポート
import cv2
# 家紋のパス
#imgPath = "/Users/takk/BlenderPython/img/kamon/mouri-motonari-kamon.png"
imgPath = "/Users/takk/BlenderPython/img/human_what_is.png"
# イメージの読み込み
im = cv2.imread(imgPath,0)
# イメージを白黒のイメージに変換
thresh = cv2.Canny(im, 100, 200)
x = 0
y = 0
# 画面に出力するための点を設定する配列
list = []
# 取得するか否かの判定フラグ
pickupFlg = False
# 出力するリストへの追加をするしないの判定フラグ
addListFlg = True
# ピクセル格納用変数
tmp = 0
# エディットモードへ変更
bpy.ops.object.editmode_toggle()
# 対象のピクセルをリストへ追加するか判定するメソッド
def judge(col, tmp):
pickupFlg = (not col == tmp)
tmp = col
return pickupFlg
# リストへの追加処理メソッド
def isAddList(addListFlg, pickUpFlg, row, index):
# pickUpFlg = judge(row[index],tmp)
if pickUpFlg and addListFlg:
addListFlg = judge(row[index + 1], tmp)
return pickUpFlg
# 2次元配列の1次元目の配列長
xMax = len(thresh)
# 同様に2次元目の配列長
yMax = len(thresh[0])
# 確認用コンソール出力
print("X: %s Y: %s" % (str(xMax), str(yMax)))
# 配列の中身を取得する処理
for row in thresh:
for col in row:
pickupFlg = judge(col,tmp)
addListFlg = isAddList(addListFlg, pickupFlg, row, x)
if pickupFlg:
# 確認用処理
# print("pick: %s / add: %s" % (str(pickupFlg), str(addListFlg)))
if addListFlg:
# 確認用処理
# print("*** Add List ***")
# 出力用の配列へ追加する
list.append*1
# フラグを反転
addListFlg = not addListFlg
# 取得した配列の位置を示す変数
x += 1
x = 0
y += 1
# 3D_VIEWに出力する準備
ob = bpy.context.object
# エディットモードへ変更
bpy.ops.object.mode_set(mode='EDIT')
# BMeshを使用する(bpy.context.objectより作成)
bm = bmesh.from_edit_mesh(ob.data)
# 確認用
#print(len(list))
#print(list[0])
# 出力配列から点(vertex)を作成
for co in list:
bm.verts.new(co)
# 追加した点を反映
bmesh.update_edit_mesh(ob.data)
# オブジェクトモードへ変更(コメントアウト)
#bpy.ops.object.mode_set(mode='OBJECT')
そして、この次にはmeshへの変換を行いたいのですが。。。
皆目見当もつかない状況です。
今回、はここまでにします。
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
*1:y/(yMax-1) ,x/(xMax-1), 0
Blender Python 開発 〜imgファイルの輪郭を取得〜
ここ最近は、開発メモやらBlenderの操作方法など横道にそれていましたが。。。
できました!!
「イメージファイルの中身をBlender上に表示する」
作成した、pyファイルはこちらからダウンロードできます。
ちなみに、元々のイメージファイルは以下です。
今回のやったことは、以下の通りです。
0. OpenCvを読み込みBlender上で使用できるようにする
1. イメージファイルを読み込む
2. イメージを黒と白のみにする(グレースケール化)
3. グレースケールにしてから輪郭部分を取得
4. 輪郭を取得したイメージより輪郭部分の座標(1px=(x,y))
※横をX座標、縦をY座標として取得
5. 新たにvertex(点)を作成
スクリプトを起動した結果です。本当は、作成したPlaneの上に表示させる予定でしたが、Planeの座標は0->1の範囲なのに対して、配列の位置で座標取得を行ったため
以下のようになりました。(笑)
ポイントは3つ
・OpenCvを使用して輪郭を取得する
・取得した輪郭から点(Vertex)を作成する
・bmeshはエディットモードでないと動かない
現状の実装では、無駄な処理が多分に含まれているので
今後は、効率の良い方法を探そうと思います。
ソースの一部です。
ob = bpy.context.object
bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(ob.data)
print(len(list)) # 取得した点のはいれつ数を確認
print(list[0]) # リストの中身を確認
for co in list:
# 点の作成処理
bm.verts.new(co)
# 作成した点を画面に反映
bmesh.update_edit_mesh(ob.data)
# オブジェクトモードに戻す(コメントアウトしてます)
#bpy.ops.object.mode_set(mode='OBJECT')
Blender Python Basic 〜 テクスチャサンプルコード 〜
グレースペンシル
gp = bpy.context.scene.grease_pencil
点の追加2
mport bpy, bmesh
obj = bpy.context.object
me = obj.data
bm = bmesh.from_edit_mesh(me)
v1 = bm.verts.new*1
v2 = bm.verts.new*2
v3 = bm.verts.new*3
bm.faces.new*4
bmesh.update_edit_mesh(obj.data)
点の追加
First of all you have to create a object and a mesh, after that you can add the vertex to it:
# name: string for new object name
# verts: array of position coords - [(-1.0, 1.0, 0.0), (-1.0, -1.0, 0.0)]
def create_Vertices (name, verts):
# Create mesh and object
me = bpy.data.meshes.new(name+'Mesh')
ob = bpy.data.objects.new(name, me)
ob.show_name = True
# Link object to scene
bpy.context.scene.objects.link(ob)
me.from_pydata(verts, , )
# Update mesh with new data
me.update()
テクスチャ関連
Materials/Textures – mapping — PyMove3D
# new texture, テクスチャ取得→イメージ取得と読み込み→テクスチャに貼り付け texUV = bpy.data.textures.new(texname, type="IMAGE") image_path = os.path.expanduser("//wuerfelbilder/blume.jpg") image = bpy.data.images.load(image_path) texUV.image = image # connect textur with material
マテリアル作成、テクスチャを設定、プロパティの設定(要調査) bpy.data.materials[matname].texture_slots.add() bpy.data.materials[matname].active_texture = texUV bpy.data.materials[matname].texture_slots[0].texture_coords = "GLOBAL" bpy.data.materials[matname].texture_slots[0].mapping = "CUBE"
# escape edit mode if bpy.ops.object.mode_set.poll(): bpy.ops.object.mode_set(mode='OBJECT') # delete all mesh objects bpy.ops.object.select_by_type(type='MESH') bpy.ops.object.delete() # delete all materials for i in bpy.data.materials.values(): bpy.data.materials.remove(i) # delete all textures for i in bpy.data.textures.values(): bpy.data.textures.remove(i)
# new texture texUV = bpy.data.textures.new(namen[i][1], type="IMAGE") image_path = os.path.expanduser("//wuerfelbilder/{}".format(i)) image = bpy.data.images.load(image_path) texUV.image = image # connect texture with material bpy.data.materials[matname].texture_slots.add() bpy.data.materials[matname].active_texture = texUV bpy.data.materials[matname].texture_slots[0].texture_coords = "ORCO" bpy.data.materials[matname].texture_slots[0].mapping = "CUBE"