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

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

Blender Game Engine 〜まとめ〜

前回は、BGEでのゲームコントロールの作成方法をやりました。
正確には、右ボタンを押下した時にオブジェクトを動かす。というものでしたが
前回やった工程を増やして、上下左右のボタンに対応した動きを設定すると以下のようになりました。
f:id:Takunoji:20180418211119p:plain

試した部分は「Physics」と「Liner〜」「Loc」「Rot」の部分を試しました。
回転したり移動したりとちょっと面白かったです。
ポイントとしては「Loc」の値を設定して移動する時にはオブジェクトの向きを基準に
移動するというところです。その部分は実際にいじってみるのが一番良いと思います。

f:id:Takunoji:20180418212110p:plain ← 右端のパネル
ロジックエディタの右端(Actuator)
f:id:Takunoji:20180418212100p:plainf:id:Takunoji:20180418212051p:plain
それぞれの値を調節してやれば、キャラクターの操作はできそうです。

大雑把にアクションの作成方法を学習しました。


 

Blender Game Engine 〜キューブを動かす〜

前回は、チュートリアル動画のはじめの部分をやってみました。
今回はその続きをやります。
参考動画はこちら

youtu.be

前回は、キューブを上に持ち上げて、重力をかけるとこまでやりました。

f:id:Takunoji:20180416211549p:plain

上記の画面で(重力をかける設定をしてます。)「P」ボタンを押下

f:id:Takunoji:20180416212322p:plain

と、ここまでが前回。

ここからキューブの向きを変えて落とします。

f:id:Takunoji:20180417202547p:plain    f:id:Takunoji:20180417202603p:plain

まぁ何も起こりませんなぁ(笑)  ※動画より引用
自然な動きを与えるには、「コリジョンバウンド」を設定するようです。

f:id:Takunoji:20180417203156p:plain f:id:Takunoji:20180417203146p:plain f:id:Takunoji:20180417203132p:plain        f:id:Takunoji:20180417203450p:plain

チェックを入れるだけですね。。。
落下した後に地面の上に止まりました。(刺さっていません)

そして、ここからが本番
画面を上下の二つに分割します。新しいビューを使用するためです。

f:id:Takunoji:20180417203846p:plain

f:id:Takunoji:20180417204015p:plain

Open The Game Logic Editor

f:id:Takunoji:20180417204115p:plain

開いたロジックエディタの一番左から、センサーを追加します。
センサーというのは、コントローラーの事と今は思っておきましょう。

f:id:Takunoji:20180417210336p:plain

そして「Controller」はすっ飛ばして、「Actuator」の変更を行います。

ついでに飛ばした「Controller」は右です。

f:id:Takunoji:20180417210929p:plain  f:id:Takunoji:20180417211021p:plain

そして、今回はキーボードでコントロールしてキューブを動かしたいので
Actuator -> Motionを選択します。

f:id:Takunoji:20180417211208p:plain

余談ですが、選択しているキューブに重力設定をしていないと2行くらいしかない
※重力設定が「Static」の状態

f:id:Takunoji:20180417211643p:plain

重力設定を「Static」から「RigidBody」に変更します。

f:id:Takunoji:20180417211901p:plain

ちょっと分かりづらいですが、プロパティが増えています。

Key: の「Right Arrow」と表示されている部分をクリックしたら「PressKey」と

f:id:Takunoji:20180417212119p:plain 表示されるので使用するキーを押下する
今回は、「右→」Right Arrowを選択しました。
そして、一番右のプロパティを以下のように変更します。

f:id:Takunoji:20180417212620p:plain Yの値を「3.0」に設定する

f:id:Takunoji:20180417212709p:plain

そして、ゲームを実行します。「P」ボタンを押下します。

f:id:Takunoji:20180417212943p:plain f:id:Takunoji:20180417213133p:plain

右にしか移動しないのでキューブがおっこちます(笑)

今日はここまでにします。

Blender Game Engine 〜他のゲームエンジンとの比較(感想)〜

紆余曲折を経て Blenderに戻ってきました。
OpenCvによる機械学習も進めたいのですが。。。
まずは「動くもの」を作るのを優先したく、ちょいと保留です。

経緯として以下のような状況です。
1. ゲームを作りたいのでどの言語(もしくはツール)を使用して開発するか検討
 「UnrealEngine」→ほぼプログラミングがいらない感じで、プラグインを作るにも
          時間がかかりそうなので却下(使用しないことにしました。)
          ※プログラミングをメインにしないなら最高だと思います。

          ただし、GPUのスペックがある程度高くないと使用できない

 「Swift」     →Xcodeを使用してiPhoneアプリの作成ができる、3Dモデルや
          各部品(イメージファイルなど)をAsetとして読み込み使用できる
          ※プログラミングの習得難度は低い、C++,Python等アクセス可

 「Unity」    →3Dモデルの作成など簡単なことはUnityのみでOK, C#を使用
           iPhoneなどの入力キーボードを使用するときは対象の言語
          (Swiftなど)での修正作業が必要になる
 「Blender」  →3Dモデルを作成するのに使用する他のゲームエンジンでも
          作成した3Dモデルを使用できる

Blender Game Engine」
Pythonを使用できる、作成したゲームをコンパイルツールでiPhone用に起動ファイルを出力できる
これを使えばBlenderのみの実装でiPhoneアプリも行けるのではないだろうか?
と思っている

www.youtube.com

というわけで、BelderGameEngineの使い方を勉強します。

参考にするのは、以下の動画です。

www.youtube.com

初めに、レンダーを切り替えるようです。

 

f:id:Takunoji:20180416210809p:plain

 

f:id:Takunoji:20180416210826p:plain

右側のパネルにある「Start」ボタンを押下するとゲームが起動します。

f:id:Takunoji:20180416210911p:plain

ゲームを起動するとマウスが見えなくなってしまうので「esc」ボタンでゲームを終了します。
とりあえず、地面(のようなもの)を作成します
Plane(板)を選択して広げます。初期表示されているキューブは上に持ち上げます。

f:id:Takunoji:20180416211320p:plain

f:id:Takunoji:20180416211429p:plain 「S」押下してマウスで広げます。

f:id:Takunoji:20180416211549p:plain

そして、キューブを選択した状態で以下のように「Physics」を選択します。f:id:Takunoji:20180416212253p:plain

f:id:Takunoji:20180416212130p:plain

そして「RgidBody」を選択

f:id:Takunoji:20180416212237p:plain

そしてゲームを再生

f:id:Takunoji:20180416212322p:plain

空中にあった、キューブが地面(?)に落下します。

今日はここまでにします。
次回は、キューブを動かしてみます。

 

Blender python UI開発メモ 〜 ユーザ入力〜

pythonからJavaを使用する

https://stackoverflow.com/questions/3652554/calling-java-from-python?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

 

 blenderでユーザー入力を行うにはダイヤログを使う事にする

https://stackoverflow.com/questions/15595124/input-dialog-box-blender?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

 

複数行テキストフィールド

https://developer.blender.org/D622

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)
 

Blender Python 開発メモ 〜パネルの仕様〜

英語のサイトですが。。。

Panel(bpy_struct) — Blender 2.79.0 855d2955c49 - API documentation
日本語にすると

クラスbpy_struct bpy.types.Panel 

UI要素を含むパネル

bl_category
タイプ: 文字列、デフォルト ""、(決してなし)
bl_context

パネルが属するコンテキスト。(TODO:可能な組み合わせの説明bl_context / bl_region_type / bl_space_type)

タイプ: 文字列、デフォルト ""、(決してなし)
bl_idname

これが設定されている場合、パネルはカスタムIDを取得します。それ以外の場合は、パネルの定義に使用されるクラスの名前が使用されます。たとえば、クラス名が "OBJECT_PT_hello"で、bl_idnameがスクリプトによって設定されていない場合、bl_idname = "OBJECT_PT_hello"

タイプ: 文字列、デフォルト ""、(決してなし)
bl_label

パネルラベルは、三角形の右側のパネルのヘッダに表示パネルを収納するために使用しました

タイプ: 文字列、デフォルト ""、(決してなし)
bl_options

このパネルタイプのオプション

  • DEFAULT_CLOSEDDefault Closed パネルの作成時にパネルを開くか折りたたむ必要があるかどうかを定義します。
  • HIDE_HEADERHide Header、Falseに設定されている場合、パネルにはヘッダーが表示されます。このヘッダーには、パネルとラベルを折りたたむためのクリック可能な矢印が含まれています(bl_labelを参照)。
タイプ: {'DEFAULT_CLOSED'、 'HIDE_HEADER'}に設定された列挙型、デフォルト{'DEFAULT_CLOSED'}
bl_region_type

地域パネルがで使用されようとしています

タイプ: ['WINDOW'、 'HEADER'、 'C​​HANNELS'、 'TEMPORARY'、 'UI'、 'TOOLS'、 'TOOL_PROPS'、 'PREVIEW']、デフォルトの 'WINDOW'
bl_space_type

パネルが使用される空間

  • EMPTY 空の。
  • VIEW_3D 3Dビュー、3Dビューポート。
  • TIMELINE タイムライン、タイムライン、再生コントロール
  • GRAPH_EDITOR グラフエディタ、ドライバの編集、キーフレーム補間
  • DOPESHEET_EDITOR ドープシート、キーフレームのタイミングを調整します。
  • NLA_EDITOR NLAエディタ、アクションの結合とレイヤー。
  • IMAGE_EDITOR UV /イメージエディタ、画像とUVマップの表示と編集を行います。
  • CLIP_EDITOR ムービークリップエディタ、モーショントラッキングツール。
  • SEQUENCE_EDITOR ビデオシーケンスエディタ、ビデオ編集ツール。
  • NODE_EDITOR ノードエディタ、ノードベースシェーディングおよび合成ツールのエディタ
  • TEXT_EDITOR テキストエディタスクリプトの編集、およびファイル内のドキュメント。
  • LOGIC_EDITOR ロジックエディタ、ゲームロジック編集。
  • PROPERTIES プロパティ、アクティブオブジェクトおよび関連するデータブロックのプロパティを編集します。
  • OUTLINER Outliner、シーングラフの概要、利用可能なすべてのデータブロック。
  • USER_PREFERENCES ユーザー設定、永続的な設定を編集します。
  • INFO 情報、メインメニューバー、エラーメッセージのリスト(ドラッグ&ドロップで下にドラッグ)
  • FILE_BROWSER ファイルブラウザ、ファイルとアセットを参照します。
  • CONSOLE Python Console、高度な編集とスクリプト開発用のインタラクティブなプログラムコンソール。
タイプ: ''、 ''、 ''、 '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' 、 'PROPERTIES'、 'OUTLINER'、 'USER_PREFERENCES'、 'INFO'、 'FILE_BROWSER'、 'C​​ONSOLE']、デフォルト 'EMPTY'
bl_translation_context
タイプ: 文字列、デフォルト "*"、(決してなし)
layout

UIのパネルの構造を定義します。

タイプ: UILayout、(読取り専用)
text

XXX todo

タイプ: 文字列、デフォルト ""、(決してなし)
use_pin
タイプ: ブール値、デフォルトFalse
classmethod pollコンテキスト

このメソッドがnull以外の出力を返す場合は、パネルを描画できます

戻り値の型: ブール値
drawコンテキスト

パネル UIレイアウトにUI要素を描画する

draw_headerコンテキスト

UIエレメントをパネルのヘッダUIレイアウトに描画する

 

 

Blender Python Addon 〜チュートリアル2-3〜

前回は、カーソルの位置までコピーを作成するスクリプトを作成しました。
今回は、アドオンの部分を写経、ちょっといじります。
赤色になっている部分はちょいといじって名前を変えてみました

Addon Tutorial — Blender 2.78.0 e8299c8 - API documentation 

bl_info = {
"name": "Cursor Array Practice",
"category": "Object",
}

import bpy


class ObjectCursorArray(bpy.types.Operator):
"""Object Cursor Array"""
bl_idname = "object.cursor_array"
bl_label = "Cursor Array Practice"
bl_options = {'REGISTER', 'UNDO'}

def execute(self, context):
scene = context.scene
cursor = scene.cursor_location
obj = scene.objects.active

total = 10

for i in range(total):
obj_new = obj.copy()
scene.objects.link(obj_new)

factor = i / total
obj_new.location = (obj.location * factor) + (cursor * (1.0 - factor))

return {'FINISHED'}

def register():
bpy.utils.register_class(ObjectCursorArray)


def unregister():
bpy.utils.unregister_class(ObjectCursorArray)


if __name__ == "__main__":
register()
アドオンスクリプトを作成して実行すると以下のように動きます。

起動後に、3D画面上でスペースを押下します。
そして「Cursor Ar」まで入力すると作成したアドオンの名前が見つかります。

f:id:Takunoji:20180407180301p:plain

実行結果はこんな感じ

f:id:Takunoji:20180407180453p:plain

今までの勉強で
一つのスクリプトファイル上で作成するにはどうすれば良いか?
が理解できました。

ただ、作成したスクリプトがどの部分に表示されるのか?がわかりません。
全て、スペースで検索した時に表示されるものなのでしょうか?
前に作成したものはタブで選択することができました。。。
うーむ、この部分がわからない。。。

今回はここまでにします。

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)
 

Blender Python Add-on 〜チュートリアル2-2〜

前回は、アドオンのチュートリアルを始めました。(Your Second Add-on)
今回は、Your Second Add-onの2回目をやります。
→次のスクリプトの写経です。

Addon Tutorial — Blender 2.78.0 e8299c8 - API documentation

今回のスクリプトは、選択したオブジェクトをカーソルの位置までに
オブジェクトを作成して並べるスクリプトでした。

f:id:Takunoji:20180407173736p:plain

f:id:Takunoji:20180407173747p:plain

そして、スクリプト ダウンロードはこちら

import bpy
from bpy import context

# よく使うものを変数に取り出します。
# this scene => in this 3dview
scene = context.scene
# cursor position of circle which red and white stripe
cursor = scene.cursor_location
# object of selected
obj = scene.objects.active

# 選択しているオブジェクトからカーソルの位置まで5個作成
total = 5

for i in range(total):
obj_new = obj.copy()
scene.objects.link(obj_new)
# Now place the objection between the cursor
# and the active object based on "i"
factor = i / total
obj_new.location = (obj.location * factor) + (cursor * (1.0 - factor))

以上、ちょっと計算が入るスクリプトでした。
次回は、アドオンとして作成します。

 

Blender Python Add-on 〜チュートリアル2-1〜

前回は、ハローワールドのアドオン→パネルに「Hello Wold」を表示する
を作成しました。
今回は、前回の続きをやります。Blenderチュートリアルサイトの写経を始めます。

Add-on Tutorial — Blender Manual Your Second Add-on

こんな感じです。ダウンロードはこちら

import bpy
from bpy import context

# Get Current Scene
scene = context.scene

# Get 3D Cursol
cursor = scene.cursor_location

# Get active object (assume we have one)
obj = scene.objects.active

# Now make a new copy object
obj_new = obj.copy()

# The object won't automatically get into a new scene
scene.objects.link(obj_new)

# Now we place the object
obj_new.location = cursor

f:id:Takunoji:20180407151154p:plain f:id:Takunoji:20180407151359p:plain

このスクリプトは以前行っていたようなオブジェクトコントロールでした。
合わせてこちらの記事も参考にしてくだ

takunoji.hatenablog.com

 

今回はここまでにします。

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)
 

Blender Python アドオン作成〜ハローワールド〜

前回までは、家紋の作成用スクリプトを作成しようとしておりました。
そして、色々と考えた結果「機械学習」が必要だというところに行き着き

takunoji.hatenablog.com

上記をやりました。機械学習を始めるのにちょっとBlenderを離れなくてはなりません。
Blenderを離れる前に、キリのいいところまで仕上げてしまおうというわけです。
というわけで、毎度おなじみの写経をいたします。
捨てる神あれば拾う神あり(笑)

いいサイトを見つけました。

Blender Reference Manual — Blender Manual

そして、今回の写経もとは以下になります。

Quickstart Introduction — Blender 2.79b f4dc9f9d68b - API documentation

そして、写経の結果 ダウンロードはこちら

※タブが入っていないのでコピペでは動きません。
# 必要なインポートを行います。
import bpy
from bpy.types import Operator, Panel
# bpy.contextを引数に受けてobjectsを一覧表示します。
def main(context):
for obj in context.scene.objects:
print(obj)
# クラスの定義開始

class SimpleOperator(Operator):
# この名前がbpy.ops.objectに登録されます。
bl_idname = "object.simple_operator"
#ラベルはよくワカりませんでした。
bl_label = "Simple Object Operator"
# 不適切な操作時にエラーを投げる
@classmethod
def poll(cls, context):
return context.active_object is not None
# オペレータ起動時に呼ばれる
def execute(self, context):
main(context)
return {'FINISHED'}

# パネルクラスの作成
class HelloWorldPanel(Panel):
"""Creates a Panel in the Object properties window"""

#パネルの名前が表示される
bl_label = "Hello World Panel"
bl_idname = "OBJECT_PT_hello"
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "object"

def draw(self, context):
layout = self.layout

obj = context.object

row = layout.row()
row.label(text="Hello world!", icon='WORLD_DATA')

row = layout.row()
row.label(text="Active object is: " + obj.name)
row = layout.row()

#上記のobj.nameを登録(表示)
row.prop(obj, "name")

row = layout.row()

#bpy.ops.mesh.primitive_cube_add()を呼び出す
row.operator("mesh.primitive_cube_add")

def register():
bpy.utils.register_class(SimpleOperator)
bpy.utils.register_class(HelloWorldPanel)

def unregister():
bpy.utils.unregister_class(SimpleOperator)
bpy.utils.unregister_class(HelloWorldPanel)

#よく使うコードのようだ
if __name__== "__main__":
register()
# 実際に呼び出す
bpy.ops.object.simple_operator()

 

大まかな流れとしては、 
1. SimpleOperator、HelloWorldクラスを作成
2. 「よく使うコード〜」の部分「__name__」の値が「__main__」の時に
 register()を実行する処理
3. 続いて、作成した「SimpleOperator」を実行する
コマンドよりBlenderを起動した状態でソースをダウンロードしたファイルを
テキストエディタより起動します。
コマンドには以下のような感じでオブジェクトの値が出力されました。

f:id:Takunoji:20180406230745p:plain
画面上では、こんな感じです。

f:id:Takunoji:20180406230841p:plain

右下の部分に作成したパネルが表示されています。

f:id:Takunoji:20180406230921p:plain

コマンドで起動するなどに関しては以下を参照してください。
コマンドプロンプト(大雑把ですが。。。)、ターミナルでの起動方法を記載しました。

 

takunoji.hatenablog.com

今日はここまでにします。

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)