Blender Modifier〜Boolean Modifierの使い方〜
今回は、Blenderの使い方を勉強しました。Pyhtonではありません。
Boolean Modifierは削る機能を持っているようです。
「削る」って言葉はあまり適切じゃないかもしれません。
以下に実行例を示します。
・スフィアとシリンダーを用意します。
・そして、以下のように重ねます。
・スフィアからシリンダーの領域を削ります。
1. スフィアを選択
2.スパナのようなアイコンを選択
3.「Add Modifier」をクリックして「Boolean」を選択
4.今回は「削る」ので「difference」を選択する
<英語> <日本語>
5.選択中のオブジェクトから以下に指定するオブジェクトを引き算します。
※現在は、スフィアを選択しているので「シリンダー」が対象
削った後にワイヤーフレームで見ると右のようになっています。
6.最後に「Allpy」もしくは「適用」を押下するとちゃんと穴が空いています。
以上でした。
Blender python 開発メモ〜構成〜
Blender Image クラス
BlendDataImages(bpy_struct) — Blender 2.77.1 - API documentation
Dev:Py/Scripts/Cookbook/Code snippets - BlenderWiki
マテリアル追加
bpy.ops.object.material_slot_add()
オブジェクト全選択
bpy.ops.mesh.select_all(action='TOGGLE')
スフィアのUV編集
bpy.ops.uv.sphere_project()
UV座標アクセス
me = bpy.data.meshes['MyMesh'] uv = me.uv_textures['UVMap'] for j,face in enumerate(me.faces): face_uv = uv.data[j] print(face.uv1) print(face.uv2) print(face.uv3)
ショートカット一覧
「オブジェクトモード」
Blender 3D: HotKeys/3D View/Object Mode - Wikibooks, open books for an open world
「エディットモード」
Blender 3D: HotKeys/3D View/Edit Mode - Wikibooks, open books for an open world
「変形関連」
Transform Orientations — Blender Manual
<サンプルコードの場所>
<ツールチップから参照オブジェクト>
画面コントロールのツールチップに対象のオブジェクトが表示されるので
Pythonコンソールから探し出しす。
「クラス一覧」(bpy.types)
https://docs.blender.org/api/blender_python_api_2_77_0/bpy.types.html
「アドオンの構成」
⑴ *,py: 定義しているregister(), unregisterメソッドが走る
⑵ *.zip: フォルダ構成を作って一つのアドオンとしてBlenderにインストール可能
1.基本要素
bpy.types.Operator
execute()→使用するプロパティを追加する
@classmethod def register(cls) → プロパティなどを登録する
<サンプルコード(register処理)>
bpy.types.Scene.登録するプロパティ名 = BoolProperty(# 対応するもの
name="Japanese or Engilish" →パネルに表示される
,description="Using Japanese or English"
,default=True)
register() →ファイルに定義するメソッド、全てのアドオン用pyファイルに記載可
unregister() →ファイルに定義するメソッド、全てのアドオン用pyファイルに記載可
※アノテーションがつくかつかないかで引数が変わる(有無)
bpy.types.Panel
draw()→初期、イベント時に走る
self.layout.prop(context.scene, "登録したプロパティ名")
@classmethod def register()→プロパティ登録のみでは使用しない?
@classmethod def register()→登録したプロパティの削除
例:bpy.utils.unregister_class(RootPanel)
2.起動について
register()で継承、作成したクラスを
blenderに追加する
①classmethodのregisterと
②ファイル定義のregister
メソッドがあり、①自身を登録する
②クラスで使用するオブジェクトを
使用する時で使い分ける
UV座標の取得[サンプル]
me = bpy.data.meshes['MyMesh']
uv = me.uv_textures['UVMap']
for j,face in enumerate(me.faces):
face_uv = uv.data[j]
print(face.uv1)
print(face.uv2)
print(face.uv3)
Blender Python 〜 開発メモ〜
記載している、記事と違って普通にメモ用です。
タイトル部に「開発メモ」と記載しているものに関してはメモです(笑)
Operators (bpy.ops) — Blender 2.79.0 855d2955c49 - API documentation
クラス一覧↑
マテリアル追加スクリプト: bpy.ops.object.material_slot_add()
PythonでのBoolean(Bool)の表示方法: print("this is %r" + bool(True / False)
【言語の設定処理】
# ローカライズのチェックボックスオンとオフ
bpy.context.user_preferences.system.use_international_fonts = True / False
# インターフェースを対象にするボタン
bpy.context.user_preferences.system.use_translate_interface = True / Flase
# 言語の設定
bpy.context.user_preferences.system.language = "ja_JP" / "en_US"
The example in your Blender will help you, see.
Text Editor > Templates > Python > Operator Mesh Uv
【日本語化】
下記、チェックボックスをチェックするコマンド
bpy.context.user_preferences.system.use_international_fonts = True
bpy.context.user_preferences.system.use_international_fonts = False #外す
言語部分を変更する
py.context.user_preferences.system.language = 'ja_JP' # 日本語
py.context.user_preferences.system.language = 'en_US' # 英語(アメリカ)
「インターフェース」
bpy.context.user_preferences.system.use_translate_interface = True / False
bpy.context.user_preferences.system.use_translate_tooltips = True / False
2018/03/14: Operator.unregister()起動時に
AttributeError: module 'ZstTools.RootOperator' has no attribute 'unregister'
解決
→ register, unregisterをクラス内のメソッド として定義しない
→ boy.utils.unregister_classで作成したクラスを削除する
blender 関連ページ
パネルにコンポーネント追加
https://wiki.blender.org/index.php/Dev:Py/Scripts/Cookbook/Panels_and_Operators/Ping_Pong
https://wiki.blender.org/index.php/Dev:Py/Scripts/Guidelines/Addons
https://docs.blender.org/manual/en/dev/modeling/modifiers/index.html
【アクションコマンドメモ】
「オブジェクトの角度を変更する」
import math
bpy.context.object.rotation_euler = math.radians(角度)
「イメージファイルへのアクセス」
bpy.data.images[image_index]
「モディファイヤーへのアクセス」
bpy.types.Modifier.bl_rna.properties['type'].enum_items
【アドオンの作成時につまづいたところ】
draw時に記載しないで起動したらエラーがでた。
self.layout.operator_context = "INVOKE_DEFAULT"でも「self.layout.operator」を使用しなければエラーは出ない。
Panelクラスのdraw()で入力のたびに下記のログが出力される
Blender Python Basic and Script〜基本とスクリプト〜
前回、サンプルゲームをダウンロードして中身を見て見ました。
そして、続きをやろうと思っていたのですが、一時中断します。
「ブレンダーの基本操作などやらないとゲームも作れない」事に気がつきました。
もちろん、プログラムに作成作業をさせる上でも。。。キホンっすね(笑)
そして、blenderのインストールに触れていないと思うので、簡単に触れておきます。
以下のサイトにアクセスします。
ダウンロードして、インンストーラーをクリック。
これだけでいけます。
でわでわ、まずブレンダーをひらくのですがコマンドライン、もしくはターミナルから起動します。
自分の使用しているPCはMacなのでWindowsの例を示すことができませんが、以下の通りです。
1. Windowsボタンと「r」ボタンを押下します。 →「ファイルを指定して実行」
2. 入力する部分に「cmd」と入力して「Enter」を押下→コマンドプロンプトが開く
3. エクスプローラー(フォルダ)を開きC:¥Program Files¥Blenderの起動ファイルを指定して実行(exeファイルの場所)
例:コマンドプロンプトに以下を入力してエンターキーを押す
C:¥ProgramFiles¥Blender¥blender.exe
ちなみにMacで起動する場合は、ターミナルを起動して、以下のコマンドを入力します。
「/Applications/Blender.app/Content/Mac/blender」:インストールした場所で変わりますが、多くの場合Applicationsの下にインストールされているので上記のコマンドで起動することができます。
ちなみに自分の場合は、フォルダごとインストールしたので以下のようになります。
「/Applications/blender-2.79-macOS-10.6/blender.app/Contents/MacOS/blender」
そして、画面上部より、「Default」をクリックしてメニューを開きます。
「Scripting」をクリックします。
スクリプトがやりやすくなりました。
そして、Pythonのキホン→プログラムをやるときに必ずやるものです。
"Hello Wold"をコンソールに表示する→俗に言うハローワールドってやつです。
早速書いて起動して見ましょう。
※「>」はコマンド入力を記載していることを示します。
>print("Hello World")
これだけです。
それでは、次に行きます。
画面上に、ある「Cube」を動かしてみようと思います。
ここで、注意が一つあります。細かい理由は考えずにとりあえずコマンドを入力して
スクリプトが動くことを確認してください。
>py.context.object.location = (1,0,0)
>py.context.object.location = (0,1,0)
>py.context.object.location = (0,0,1)
>py.context.object.location = (1,1,0)
>py.context.object.location = (0,0,0)
ここで、ちょっと整理します。
「bpy.context.object」は画面に表示されているオブジェクトを示します。
画面上にはオブジェクトが一つしかないので「bpy.context.object」は限定されます。
ではここで、オブジェクトを追加してみようとお思います。
>bpy.ops.mesh.primitive_circle_add()
ちょっとわかりづらいですね。
>py.ops.mesh.primitive_cone_add()
そして、現在画面上にオブジェクトが3つあります。
ちょっと移動してオブジェクトがよく見えるようにします。
初めのスクリプトを実行して見ます。
>py.context.object.location = (0,0,0)
円が移動しました。
次に円錐を選択します。
そして同じスクリプトを実行します。
同様に立方体「Cube」を選択してスクリプトを実行する
どうやら選択中のオブジェクトを移動するスクリプトのようです。
今日はここまでにします。
Blender Game Engine 〜チュートリアル1〜
前回は、Gitからサンプルをダウンロードして中身を見て見ました。
そして、2Dゲームを作る時のやり方を学びました。
そして、キャラクター、背景 etc... を作成し、それをコントロール、アニメーション
と様々なアクションをさせる。これがゲームやアニメの作成する大雑把な工程になります。
なので、今回はBlender Game Engine(略してBGE)のチュートリアルをやってみようとおみます。
でわでわ。。。
今回は、ダウンロードしたPDFにあるテキストをやります。
まずはBlenderの起動: blenderのダウンロードはこちら
そして、日本語のサイトはこちら、説明とか最新情報?もある様です。
一応、読んでいるテキストは、バージョンが古いものになります。
でも操作的に大きく変わることはないと思います。
そして、Blenderを起動します。
※2018-03-07時点で最新のバージョンです。
「Setting Up The Pysics Engine」というチャプターです。
まとめると「重力をかける方法」になります。
ブレンダーの設定を行います。
1. Render Engineの設定
デフォルト表示では「Blender Render」になっているので「Blender Game」に変更
2. Physics(物理)の設定
表示しているモデルのリアルタイムアニメーションの設定を行います。
デフォルトでは「Static」が設定されている状態です。
これを「Dynamic」「Rigid」などに設定します、他にも色々あります。
Occluder(オクルーダー): 扱いと説明が難しいのでよくわかりませんでした。
No Collision(ノーコリジョン): 衝突判定を無効にします。
Sensor(センサー): これもよくわかりませんでした。
Static(スタティック): 静的
Dynamic(ダイナミック): 有効にすると物理的な性質を持ちます。
RigitBody(リジットボディ): 回転の物理計算により生き生きとした感じが出ます。
SoftBody(ソフトボディ): 衝突した時に変形します。
チュートリアルでは「Dynamic」「Rigid」を使用しています。
そして、Staticにある説明に登場する「Actor」にチェックを入れない状態に設定してください(デフォルトでOK(チェックなし))
そして、Raduysで衝突して跳ねる大きさを設定ます。
詳細に関しては上記の「Static」リンクなどを参照してください。
とりあえず今日はPDFの「21-1」をやりました。
次は「21-2」をやります。
Blender Python Game Engine 〜まずはサンプルを見てみる〜
前回、アドオンの処理で使用する「初期設定」のための調査を行いました。
どちらかというと画面のコピー作成、エリアの追加変更といったところですが。。。
まぁ色々とコマンドを実行したりして、「サンプルのゲームを見てみるのが一番早い」
ということに気がついたので早速その様にします。
参照元はGitからダウンロードしてきます。
タイトルは「Alive for 30 seconds」... 中々渋いタイトルですね。
ダウンロードはgitが入っている人は以下のコマンド使います。
ターミナル or コマンドプロンプトを立ち上げて
ダウンロードしたいディレクトリに移動します。
> cd ダウンロードしたいディレクトリ
そしてクローンします。
>git clone https://github.com/nafergo/alive-for-30-seconds/blob/master/README.md
ダウンロード完了です。
※Macは初めからインストールされている様です。テストで以下のコマンドを実行
> git --version
バージョン名が表示されればインストール済み
Windowsはインストーラーを使用します。
こちらのサイトを参照してください -> Git - Downloading Package
とりあえずダウンロードしたらblendファイルを開き「Game」から開始してください
サンプルゲームが楽しめます。
そして、中身を見ていくと・・・
なんてこった、ファイルが壊れているのか?
と思ったらくらいだけでした。。。
下の「Game Logic Full」を「Default」に変更すると
こんな風になります。
ここからわかるのはカメラが真下を向いているなーという事ぐらい。。。
ここで、画面の表示方法を「Solid」から「Texture」に変更してみる
そして、画面を見てみると以下の様な感じです。
一番初めの真っ黒なやつがカメラの真ん前にあります。
下にゲームを起動した時の初期画面があります。
この状態で「Game Start」して見ます。
カメラの前の黒いパネルが消えて、下のタイトルがカメラから見える様になりました。
ふむふむ。。。なんかわかってきたかな?
次は、ここからさらに中身を見ていきます。
Blender Python Add-on〜画面の初期設定を行う〜
前回、アドオンをもう一度作成し直してアドオンの動きについて調べました。
今回は、Blenderの画面を新しく追加して、独自の設定を行うスクリプトを作成しようと思います。
やることは、新規画面(Window)追加
bpy.ops.screen.new() -> 画面(window)を現在のものを複製して作成します。
元々が「Default」で作成したのが「Default01」
とエリアの追加と変更です。
エリアの追加(コピー)
bpy.ops.screen.area_split(bpy.context.copy(), direction='VERTICAL', factor=0.5, mouse_x=-100,mouse_y=-100)
エリアの変更
bpy.ops.area.type = 'VIEW_3D'
基本的なコマンドを見たところで「どの様に使うのか?」を理解します。
まず、前提となる操作としては以下のものが挙げれらます。
1. デフォルトで表示する画面が何個かある。下の写真の様な感じです。
上の「Defaul」「GameLogic」... など選択することで画面の表示を変更できます。
そして、今回の実装内容は以下の通りです。
1. 今現在開いている画面を複製する
2. 複製した、画面を変更して自分の作業をしやすい状態にする
2. ファイルブラウザでサムネイルを表示する
そして、時間がかかるので、今回は「1」のみを行います。
まずは、以下のスクリプトで画面を切り替えることができました。
>bpy.context.area.type = 'CONSOLE' # Pythonコンソール画面
>bpy.context.area.type = 'INFO' #情報ウィンドウ(操作ログが出力される)
他のものは以下になります。※こちらのサイトを参照しました。
※大雑把な解釈です。
- EMPTY Empty.
- VIEW_3D 3D View, 3D viewport.->デフォルトで表示
- TIMELINE Timeline, Timeline and playback controls.
※アニメーションを作成するのに使用する、起点と終点を指定するなど
- GRAPH_EDITOR Graph Editor, Edit drivers and keyframe interpolation.
※アニメーションの緩急をつける
- DOPESHEET_EDITOR Dope Sheet, Adjust timing of keyframes.
※複数のオブジェクトに対するアニメーションのコントロールを行える
- NLA_EDITOR NLA Editor, Combine and layer Actions.
※これも複数のオブジェクトのアニメーションコントロール
- IMAGE_EDITOR UV/Image Editor, View and edit images and UV Maps.
- SEQUENCE_EDITOR Video Sequence Editor, Video editing tools.
※Blenderで作成した動画の編集 - CLIP_EDITOR Movie Clip Editor, Motion tracking tools.
※動画のクリップ操作 - TEXT_EDITOR Text Editor, Edit scripts and in-file documentation.
※Pythonスクリプトファイルを作成する - NODE_EDITOR Node Editor, Editor for node-based shading and compositing tools.
※マテリアルの作成に使う - LOGIC_EDITOR Logic Editor, Game logic editing.
- PROPERTIES Properties, Edit properties of active object and related datablocks.
- OUTLINER Outliner, Overview of scene graph and all available datablocks.
- USER_PREFERENCES User Preferences, Edit persistent configuration settings.
※ユーザー設定 - INFO Info, Main menu bar and list of error messages (drag down to expand and display).
※操作ログを出力する - FILE_BROWSER File Browser, Browse for files and assets.
※ファイル参照 - CONSOLE Python Console, Interactive programmatic console for advanced editing and script development.
※いつも使用しているPythonコンソール
次回は、サムネイル表示を行いたいと思います。
※できるかどうかわからないのでなんともいえませんが。。。
次回は、ゲームサンプルをダウンロードして中を見てみようと思います。
Blender Python Add-On〜初回アドオンの作成2〜
前回は、OpenCvのPython版をBlenderから起動してみました。
本当は、輪郭の取得とかして「写真などを3Dモデルに変形しよう」
なんて考えていましたが、甘かった。。。
必要になる技術としては、画像の読み込みとグレースケール変換(ここまでは
OpenCvのメソッドを使用して、難なくできました。)
しかし、ここから読み込んだファイルの画像データより輪郭部分の座標を取得するために色々と勉強しなければならないため、先にアドオンの作成に入ろうと考え直した次第です。
と言うわけで、アドオンに関しては、以前行いました。
そして、前回作成したものは、本当に最低限の処理のみを記載したものです。
今回は、前回のものから少しだけ内容を増やして記載いたします。
SecondAddOn.py --------------------------------
# Setting for Add-On Prooerties
bl_info = {
"name": "Working Copy Add-On",
"discription": "push Start -> create working copy script file",
"author": "Zenryoku Service",
"version": (0.1),
"blender":(2, 78, 0),
"location": "Tools>ZsTools",
"warning":"", # used for warning icon and text in addons panel
"wiki_url": "https://github.com/ZenryokuService/BlenderPython/"
"AddOnPython",
"tracker_url": "https://wiki.blender.org/index.php/Dev:Py/Scripts/Guidelines/Addons/metainfo",
"support": "COMMUNITY",
"category":"3D View"
}
import bpy
# 1. load all py file at this directory
# -> py file define some classes inherit operator class or panel class and the other
#
# 2. registor and unregistor loaded classes
def register():
print("*** Testing ***")
def unregister():
print("Goodbye World")
-------------------------------------------
とりあえずは、実行してみます。
この状態からFile -> UserPreferenceを開き「Add-ons」タブを開きます。
Install from File ... をクリックして、今回作成した。ファイルを選択します。
communityを選択して、下にある画像のAllを選択している「Category」部分で
3D Viewを選択します。
すると作成した、アドオンが存在しています。
こいつのチェックボックスにチェックを入れると
printメソッドの部分がコンソールに出力されます。
そして、ソースの赤字部分を"3D View"から"Object"に変更してみます。
そして、再度インストールしてます。
はじめの「3D View」に表示されていたものがObjectの部分にも表示されています。
今回わかったのは、"bl_info"の中で設定しているプロパティで
アドオンのインストール時に表示される場所が変わると言うことがわかりました。
そして、register()メソッドはアドオンの画面でチェックを入れた時に
unregistor()メソッドはチェックを外した時に起動することが確認できました。
次回は、作成したアドオン→Pythonファイル(*.pyファイル)があるディレクトリにある
他のファイルにあるクラスをロードする方法を学びたいと思います。
Blender Python + OpenCV〜輪郭の表示〜
前回は、画像を読み込みそれをテクスチャとしてオブジェクトに貼り付けました。
今回は、読み込んだ画像を、グレースケール(灰色)で読み込み、
輪郭を表示します。
早速コードを見てみましょう。
※下のリンクからソースをダウンロードできます。
20180212_A.py ----------------------------------
import os
import bpy
import numpy as np
import sys
sys.path.append('/usr/local/lib/python3.6/site-packages/cv2/')
import cv2
fileName = os.getcwd() + '/BlenderPython/img/images.jpeg'
im = cv2.imread(fileName,0)
thresh = cv2.Canny(im, 100, 200)
cv2.imshow('test', thresh)
#cv2.waitKey(0)
#cv2.destroyAllWindows()
-----------------------------------------------------------------------
イメージファイルを読み込むまでは、前回と同じコードです。
「Canny法」と言うアルゴリズムを使用していますが、意味がわかりませんでした(笑)
実行結果は以下になります。
【元の画像】
【出力結果】
輪郭を表示するまでには、グレースケール(灰色)で画像を読み込む必要があります。
>im = cv2.imread(fileName,0)
第二引数の「0」がグレースケールで画像を読み込むためのフラグの様です。
詳細は、下のサイトを参照してください。
画像のしきい値処理 — OpenCV-Python Tutorials 1 documentation
そして、シンプルに「Canny法」を実装した「Canny」を使用します。
>thresh = cv2.Canny(im, 100, 200)
第二、第三引数の数値は、参考サイトにあったのでそのまま設定しました。
詳細は、下のサイトを参照してください。
Canny法によるエッジ検出 — OpenCV-Python Tutorials 1 documentation
以上が輪郭を表示するまででした。
ついでなので他のファイルも少しアップいたします。
【豚さん】
before after
【イラスト】
before after
以上でした。
次回は、取得した輪郭から輪郭線の座標を取得します。
輪郭の取得とかは難しかったため、アドオンの作成を行います。
Blender Python + OpenCV〜画像読み込みとテクスチャ〜
前回、OpenCv(python)を使用して画像の読み込み、サイズの表示を行いました。
OpenCvの逆引きサイトなどを参考に3Dモデル作成。。。なんて考えましたが。。。
人間一歩ずつ歩まなければ身につくものも身につきません。(言い訳です)
と言うわけで、今回は
読み込んだ画像をテクスチャとして表示します。
参考にするサイトはこちらになります。
コードのみのサイトでした。以下のコードです。
def material_for_texture(fname): img = bpy.data.images.load(fname) tex = bpy.data.textures.new(fname, 'IMAGE') tex.image = img mat = bpy.data.materials.new(fname) mat.texture_slots.add() ts = mat.texture_slots[0] ts.texture = tex ts.texture_coords = 'UV' ts.uv_layer = 'default' return mat
結局は、
1.ファイル(フルパス)→「C:¥XXX¥XXX¥ファイル.png」などをロード
2.マテリアルを作成
3.テクスチャにセット
とやっていました。
はじめの方に余計なコードがありますが、以下のコードを実行しました。
※Gitより以下のソースをダウンロードできます。
20180211_B.py -----------------------------------------------
import os
import sys
import bpy
sys.path.append('/usr/local/lib/python3.6/site-packages/cv2/')
import cv2
fileName = os.getcwd() + '/BlenderPython/img/Dojo.png'
# this is Normal Loading
#image = cv2.imread(fileName)
# this is GrayScale Loading
image = cv2.imread(fileName, cv2.IMREAD_GRAYSCALE)
# Create Material
mat = bpy.data.materials.new('ImageMat')
# Create Texture
tex = bpy.data.textures.new(fileName, type='IMAGE')
tex.image = bpy.data.images.load(fileName)
# Add material slots
mat.texture_slots.add()
mat.texture_slots[0].texture = tex
obj = bpy.context.scene.objects.active
obj.data.materials.append(mat)
-----------------------------------------------
汚い感じになっていますがイメージファイルをテスクチャとして表示しております。
はじめの方にある「cv2.cv2.imread(fileName)」などは、今回は関係ありません。。。
次回は、画像の輪郭を読み込もうと思います。