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

Javaプログラミングを基本にして、ゲーム作成に必要なことの調査結果、やったら面白そうなことなどを記載します。プログラミングのススメ的なことも記載します。プログラミングで楽しく遊ぶために色々と記載して行きます。

Blender Modifier〜Boolean Modifierの使い方〜

今回は、Blenderの使い方を勉強しました。Pyhtonではありません。

Boolean Modifierは削る機能を持っているようです。
「削る」って言葉はあまり適切じゃないかもしれません。

以下に実行例を示します。

・スフィアとシリンダーを用意します。

f:id:Takunoji:20180318094005p:plain

・そして、以下のように重ねます。

f:id:Takunoji:20180318094046p:plain

・スフィアからシリンダーの領域を削ります。
1. スフィアを選択
2.スパナのようなアイコンを選択

f:id:Takunoji:20180318094225p:plain

f:id:Takunoji:20180318094329p:plain

3.「Add Modifier」をクリックして「Boolean」を選択

f:id:Takunoji:20180318094458p:plain

4.今回は「削る」ので「difference」を選択する
   <英語>              <日本語>

f:id:Takunoji:20180318094924p:plain     f:id:Takunoji:20180318094940p:plain

5.選択中のオブジェクトから以下に指定するオブジェクトを引き算します。
※現在は、スフィアを選択しているので「シリンダー」が対象

f:id:Takunoji:20180318095245p:plain      f:id:Takunoji:20180318095557p:plain

削った後にワイヤーフレームで見ると右のようになっています。
6.最後に「Allpy」もしくは「適用」を押下するとちゃんと穴が空いています。 f:id:Takunoji:20180318095941p:plain f:id:Takunoji:20180318095932p:plain f:id:Takunoji:20180318095926p:plain

以上でした。

Blender python 開発メモ〜構成〜

Blender Image クラス

BlendDataImages(bpy_struct) — Blender 2.77.1 - API documentation


Blender Python Coock Book

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


<サンプルコードの場所>

f:id:Takunoji:20180317165358p:plain


<ツールチップから参照オブジェクト>

f:id:Takunoji:20180316224010p:plain

画面コントロールツールチップに対象のオブジェクトが表示されるので
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)

 

f:id:Takunoji:20180401163147p:plain

f:id:Takunoji:20180401163823p:plain

【言語の設定処理】
# ローカライズチェックボックスオンとオフ
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"

 

 

UV座標関連 [Blenderテキストエディタ画面より]

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

f:id:Takunoji:20180316223147p:plain


 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()で入力のたびに下記のログが出力される

f:id:Takunoji:20180313222312p:plain





Blender Python Basic and Script〜基本とスクリプト〜

前回、サンプルゲームをダウンロードして中身を見て見ました。

takunoji.hatenablog.com

そして、続きをやろうと思っていたのですが、一時中断します。
「ブレンダーの基本操作などやらないとゲームも作れない」事に気がつきました。
もちろん、プログラムに作成作業をさせる上でも。。。キホンっすね(笑)

そして、blenderのインストールに触れていないと思うので、簡単に触れておきます。
以下のサイトにアクセスします。

www.blender.org

ダウンロードして、インンストーラーをクリック。
これだけでいけます。

でわでわ、まずブレンダーをひらくのですがコマンドライン、もしくはターミナルから起動します。

自分の使用している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」をクリックしてメニューを開きます。

f:id:Takunoji:20180312203333p:plain
「Scripting」をクリックします。

f:id:Takunoji:20180312203500p:plain

スクリプトがやりやすくなりました。
そして、Pythonのキホン→プログラムをやるときに必ずやるものです。
"Hello Wold"をコンソールに表示する→俗に言うハローワールドってやつです。
早速書いて起動して見ましょう。
※「>」はコマンド入力を記載していることを示します。
>print("Hello World")
これだけです。

f:id:Takunoji:20180312203901p:plain

 

それでは、次に行きます。
画面上に、ある「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」は画面に表示されているオブジェクトを示します。

f:id:Takunoji:20180312205112p:plain

画面上にはオブジェクトが一つしかないので「bpy.context.object」は限定されます。
ではここで、オブジェクトを追加してみようとお思います。

>bpy.ops.mesh.primitive_circle_add()

f:id:Takunoji:20180312205716p:plain

ちょっとわかりづらいですね。
>py.ops.mesh.primitive_cone_add()

f:id:Takunoji:20180312205905p:plain

そして、現在画面上にオブジェクトが3つあります。
ちょっと移動してオブジェクトがよく見えるようにします。

f:id:Takunoji:20180312210150p:plain
初めのスクリプトを実行して見ます。
>py.context.object.location = (0,0,0)

f:id:Takunoji:20180312210317p:plain

円が移動しました。
次に円錐を選択します。

f:id:Takunoji:20180312210448p:plain

そして同じスクリプトを実行します。

f:id:Takunoji:20180312210609p:plain

同様に立方体「Cube」を選択してスクリプトを実行する

f:id:Takunoji:20180312210654p:plain

どうやら選択中のオブジェクトを移動するスクリプトのようです。
今日はここまでにします。


Blender Game Engine 〜チュートリアル1〜

前回は、Gitからサンプルをダウンロードして中身を見て見ました。

takunoji.hatenablog.com

そして、2Dゲームを作る時のやり方を学びました。
そして、キャラクター、背景 etc... を作成し、それをコントロール、アニメーション
と様々なアクションをさせる。これがゲームやアニメの作成する大雑把な工程になります。

なので、今回はBlender Game Engine(略してBGE)のチュートリアルをやってみようとおみます。

でわでわ。。。
今回は、ダウンロードしたPDFにあるテキストをやります。

まずはBlenderの起動: blenderダウンロードはこちら
そして、日本語のサイトはこちら、説明とか最新情報?もある様です。
一応、読んでいるテキストは、バージョンが古いものになります。
でも操作的に大きく変わることはないと思います。
そして、Blenderを起動します。
※2018-03-07時点で最新のバージョンです。

f:id:Takunoji:20180307214048p:plain


「Setting Up The Pysics Engine」というチャプターです。
まとめると「重力をかける方法」になります。

ブレンダーの設定を行います。
1. Render Engineの設定
デフォルト表示では「Blender Render」になっているので「Blender Game」に変更

f:id:Takunoji:20180307214637p:plain

2. Physics(物理)の設定
表示しているモデルのリアルタイムアニメーションの設定を行います。

f:id:Takunoji:20180307214804p:plain

デフォルトでは「Static」が設定されている状態です。

f:id:Takunoji:20180307215434p:plain

これを「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 〜まずはサンプルを見てみる〜

前回、アドオンの処理で使用する「初期設定」のための調査を行いました。

takunoji.hatenablog.com


どちらかというと画面のコピー作成、エリアの追加変更といったところですが。。。

まぁ色々とコマンドを実行したりして、「サンプルのゲームを見てみるのが一番早い」
ということに気がついたので早速その様にします。

参照元は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」から開始してください
サンプルゲームが楽しめます。

そして、中身を見ていくと・・・

f:id:Takunoji:20180304212019p:plain

なんてこった、ファイルが壊れているのか?
と思ったらくらいだけでした。。。
下の「Game Logic Full」を「Default」に変更すると

f:id:Takunoji:20180304212131p:plain


こんな風になります。

f:id:Takunoji:20180304212243p:plain

ここからわかるのはカメラが真下を向いているなーという事ぐらい。。。

ここで、画面の表示方法を「Solid」から「Texture」に変更してみる

f:id:Takunoji:20180304213859p:plain

そして、画面を見てみると以下の様な感じです。

f:id:Takunoji:20180304214031p:plain

一番初めの真っ黒なやつがカメラの真ん前にあります。
下にゲームを起動した時の初期画面があります。
この状態で「Game Start」して見ます。

f:id:Takunoji:20180304214340p:plain

カメラの前の黒いパネルが消えて、下のタイトルがカメラから見える様になりました。
ふむふむ。。。なんかわかってきたかな?

次は、ここからさらに中身を見ていきます。




Blender Python Add-on〜画面の初期設定を行う〜

前回、アドオンをもう一度作成し直してアドオンの動きについて調べました

今回は、Blenderの画面を新しく追加して、独自の設定を行うスクリプトを作成しようと思います。

やることは、新規画面(Window)追加
bpy.ops.screen.new() -> 画面(window)を現在のものを複製して作成します。
元々が「Default」で作成したのが「Default01」

f:id:Takunoji:20180304205905p:plain


とエリアの追加と変更です。

エリアの追加(コピー)
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. デフォルトで表示する画面が何個かある。下の写真の様な感じです。

f:id:Takunoji:20180304104548p:plain

上の「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.
    ※アニメーションを作成するのに使用する、起点と終点を指定するなど

    f:id:Takunoji:20180304122506p:plain

  • GRAPH_EDITOR Graph Editor, Edit drivers and keyframe interpolation.
    ※アニメーションの緩急をつける

    f:id:Takunoji:20180304122600p:plain

  • DOPESHEET_EDITOR Dope Sheet, Adjust timing of keyframes.
    ※複数のオブジェクトに対するアニメーションのコントロールを行える

    f:id:Takunoji:20180304121201p:plain

  • NLA_EDITOR NLA Editor, Combine and layer Actions.
    ※これも複数のオブジェクトのアニメーションコントロール

    https://wiki.blender.org/uploads/0/06/NLA_track.png

  • IMAGE_EDITOR UV/Image Editor, View and edit images and UV Maps.

    f:id:Takunoji:20180304122716p:plain

  • 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.

    f:id:Takunoji:20180304122321p:plain

  • 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〜

前回は、OpenCvPython版をBlenderから起動してみました。
本当は、輪郭の取得とかして「写真などを3Dモデルに変形しよう」
なんて考えていましたが、甘かった。。。

必要になる技術としては、画像の読み込みとグレースケール変換(ここまでは
OpenCvのメソッドを使用して、難なくできました。)

しかし、ここから読み込んだファイルの画像データより輪郭部分の座標を取得するために色々と勉強しなければならないため、先にアドオンの作成に入ろうと考え直した次第です。

と言うわけで、アドオンに関しては、以前行いました。

takunoji.hatenablog.com

そして、前回作成したものは、本当に最低限の処理のみを記載したものです。
今回は、前回のものから少しだけ内容を増やして記載いたします。
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")

-------------------------------------------

とりあえずは、実行してみます。

f:id:Takunoji:20180224222450p:plain

この状態からFile -> UserPreferenceを開き「Add-ons」タブを開きます。

f:id:Takunoji:20180224223008p:plain

Install from File ... をクリックして、今回作成した。ファイルを選択します。
communityを選択して、下にある画像のAllを選択している「Category」部分で
3D Viewを選択します。

f:id:Takunoji:20180224222745p:plain

すると作成した、アドオンが存在しています。

f:id:Takunoji:20180224222923p:plain

こいつのチェックボックスにチェックを入れると

f:id:Takunoji:20180224223437p:plain

printメソッドの部分がコンソールに出力されます。

そして、ソースの赤字部分を"3D View"から"Object"に変更してみます。
そして、再度インストールしてます。

f:id:Takunoji:20180224223859p:plain

はじめの「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法」と言うアルゴリズムを使用していますが、意味がわかりませんでした(笑)

実行結果は以下になります。

【元の画像】

f:id:Takunoji:20180212154147p:plain

【出力結果】

f:id:Takunoji:20180212154218p:plain

輪郭を表示するまでには、グレースケール(灰色)で画像を読み込む必要があります。
>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

f:id:Takunoji:20180212160040p:plain                 f:id:Takunoji:20180212160104p:plain

 

【イラスト】

before                                                       after

f:id:Takunoji:20180212160148p:plain                               f:id:Takunoji:20180212160220p:plain

以上でした。

次回は、取得した輪郭から輪郭線の座標を取得します。

輪郭の取得とかは難しかったため、アドオンの作成を行います。

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)

-----------------------------------------------

 

f:id:Takunoji:20180211163148p:plain

汚い感じになっていますがイメージファイルをテスクチャとして表示しております。
はじめの方にある「cv2.cv2.imread(fileName)」などは、今回は関係ありません。。。

次回は、画像の輪郭を読み込もうと思います。