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

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

The Blender Python API 〜Pythonを使ってみよう〜

前回はBlenderでPythonを書き始める準備をしました。
ここからBlenderPyhonの記事を書き始めればよかったなぁ、と振り返る次第です。

そして、前回作成した、スクリプトを少しいじりました。
※ここに記載している文字をコピってもインデント(Tab)が入らないため動きません。
  下のリンクからソースをダウンロードできます。
201802_A.py------------------------------------------------------------------------------------

import bpy

size = 5
for k in range(size):
for j in range(size):
for i in range(size):
print('(X: %s,Y: %s,Z: %s)' % (i, j, k))
bpy.ops.mesh.primitive_cube_add(radius=0.25, location=(i,j,k))

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

 変数の「size」を追加して「range(5)」と書いている部分を「range(size)」に
修正しました。
実行結果は変わりません。(こんな感じです↓)

f:id:Takunoji:20180202212855p:plain

このスクリプトをいじり倒して見るのが今回の試みです。
まずは「size=5」を「size=7」
実行結果はこんな感じです。↓

f:id:Takunoji:20180202213251p:plain

なんかすごい増えた感じです。これは一体どういう事でしょうか?
まずは、このスクリプトで使用している「for」に着目してみましょう。
for ... と3段重ね担っています。俗にいう3次元ループってやつですね。
あまり聞かないかもですが。。。
201802_B.py---------------------
print('*************')
for k in range(1):
for j in range(1):
for i in range(1):
print(i, j, k)
---------------------
上記スクリプトの実行結果です。

---------------------
*************

0 0 0
---------------------
同様に「2」を入れた時の処理結果です。

---------------------
*************

0 0 0

1 0 0

0 1 0

1 1 0

0 0 1

1 0 1

0 1 1

1 1 1

---------------------
こんな感じに出力結果をみて見るとどの様な値が順に入っているのか
わかります。
原点(0,0,0)に始まり、前(1,0,0)、横(0,1,0)、斜め前(1,1,0)->1段目
上(0,0,1)、そして2段目の前(1,0,1)、横(0,1,1)、斜め前(1,1,1)->2段目....
同様に「3」を入れた時の出力結果を下に示します。
---------------------

*************

0 0 0

1 0 0

2 0 0

0 1 0

1 1 0

2 1 0

0 2 0

1 2 0

2 2 0

0 0 1

1 0 1

2 0 1

0 1 1

1 1 1

2 1 1

0 2 1

1 2 1

2 2 1

0 0 2

1 0 2

2 0 2

0 1 2

---------------------
上記の値でキューブを表示させてみますと以下の様になります。
size = 1

f:id:Takunoji:20180202221035p:plain

size = 2

f:id:Takunoji:20180202221054p:plain

size = 3

f:id:Takunoji:20180202221111p:plain

x軸の1段目だけを見ると下の様になります。

size = 1 →(0,0,0)
size = 2 →(0,0,0), (1,0,0) ....
size = 3 →*1

size = 15
for ang in range(24):
rad = math.radians(ang * size);
x = (math.pi * math.cos(rad));
y = (math.pi * math.sin(rad));
point(x,y);

ーーーーーーーーーーーーーーーーーーーーーーーーーー
15度の間隔で、24個のキューブを配置する処理になります。

f:id:Takunoji:20180202233132p:plain

f:id:Takunoji:20180202233140p:plain

いやぁ、なんかスッキリした(笑)
今日はここまで!

*1:0,0,0), (1,0,0), (2,0,0) ...
今までの流れを図にして見るとわかると思います。
例:Xは前、Yは左、Zは上とマス状の絵を書いて見る

提示したスクリプトは、早い話が

『「1辺がsizeの立方体を作る」スクリプトで各キューブの配置する場所を指定する
法則を示している』という事です。

こんな感じで「〜の法則」を見つけてやるとキューブを使って何かが描けそうです。
そして、螺旋を描くのに良いサイトがあったのでそちらを参考にします。
そのままpythonコードでは使用できなかったのでちょいと頭をひねりました。
作ったコードが以下になります。
201802_C.pyーーーーーーーーーーーーーーーーーーーーーーーーーー

import bpy
import math

print('*************')

def point(x,y) :
bpy.ops.mesh.primitive_cube_add(radius=0.25, location=(x,y,0

The Blender Python API 〜プログラムにやらせよう〜

今まで、Blender Pythonを勉強してきました。参考にしたサイトを読み進めてみると
記事の内容がやりたいことと違ってきているので、別の資料を参照してみようと思います。
以前、ダウンロードしたPDFファイルを参考にしようと思います。
タイトルは表題の「The Blenderr Python API」です。

ダウンロードして、プリントアウトしたので電子媒体でないため紹介ができません。。
なので読んでやった内容を記載しようと思います。

「Chapert1」The Blender Interface: 割愛します。詳細は以下のサイトなどを。。。

www.youtube.com

そして、スクリプトなど使用する時には、以下の様にやると便利です。
1.Blenderを起動する(Windows版)
自分のマシンがMacなのでこちらのサイトを参照してください。
まとめると、
コマンドプロンプトを立ち上げる→Windowsキー(Winodwsマーク)+R
・「cmd」と入力してエンターキー
blender.exeのある場所へ移動 →「> cd C:\Program Files\Blender」など
 ※インストーラーでインストールした場合は上記のフォルダにあるはずです。
そして、「>blender.exe」で起動します。

(Mac版): こちらは今現状動かしているので、、、
ターミナルを起動します。f:id:Takunoji:20180201205700p:plain←をクリック

「/Applications/Blender.app/Contents/MacOS/blender」と入力して起動します。
※入力途中で「tab」キーを押すと残りを補完してくれます。

f:id:Takunoji:20180201210203p:plain
画面の右上にf:id:Takunoji:20180201210313p:plain←こんな部分があるのでそいつをドラッグして下に引っ張ります。
同じやり方で横に引っ張り下の様な形で画面を表示します。

f:id:Takunoji:20180201210449p:plain

ここまできたら、f:id:Takunoji:20180201212211p:plain←の四角の絵をクリック
すると下の様な画面が表示されますので、「Python Console」の文言があります。
そいつをクリックします。同様に「TextEditor」とやります。f:id:Takunoji:20180201212906p:plainf:id:Takunoji:20180201212325p:plain

↑こんな感じに表示されると思います。これは左上からテキストエディタ
右上がビューポート、下の部分がPythonConsoleになります。

今までは、Pythonコンソールになれる、描画の概要を理解するという事に注力したと思います。→やってみてそう思いました。(笑)

ここまでで、コーディングの準備が整った感じになります。

[First Script]
左上のテキストエディタに以下の様なスクリプトを写経してみてください。
ただしTABがサイト上には表示されないので参考ファイルもどうぞ

※ここに記載している文字をコピってもインデント(Tab)が入らないため動きません。
  下のリンクからソースをダウンロードできます。インデントを入れると動きます。

20180201.py ---------------------------------------------

import bpy

for k in range(5):
for j in range(5):
for i in range(5):
print('(X: %s,Y: %s,Z: %s)' % (i, j, k))
bpy.ops.mesh.primitive_cube_add(radius=0.25, location=(i,j,k))

 

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

を実行すると以下の様な感じです。

f:id:Takunoji:20180201215425p:plain

ついでに、コンソールに各キューブの座標が表示される様になっています。
処理の内容に関しては、%sに%以降の()ないの値を代入して表示します。

f:id:Takunoji:20180201221208p:plain

こんな感じです。

「FirstScript」はとりあえずキューブでキューブを作っているスクリプトになります。
for文の内容に関しては、このページの真ん中らへんに出力結果を表示しています。

キューブの他にも色々と作成できそうだ。
Pythonコンソールにて「py.ops.mesh.primitive_」と入力した後に
コンソールの下にあるf:id:Takunoji:20180201221825p:plainをクリックしてやると以下の様に補完できる文字が表示されます。

f:id:Takunoji:20180201222014p:plain

cubeの他にも、まぁ色々とある様です。このオブジェクトを使いこなせば
何かしらの作品が作れそうだ。今日はここまでにします。

次回は、上記スクリプトで遊んでみようと思います。

 

Blender Python 本番4〜内包表記と面作成〜

前回は、rage関数の紹介をして参考サイトのコード(ちょいと修正してます)を写経しました。
今回は、そのrange関数を実際に使ってみる次第です。
そして、今までに作成したであろう「pythonファイル」を参照できる様にしました。
余談ですが
以前自分が自営業でやっていた時の屋号(宣言するだけ)をユーザー名にしています。
こちらから作成したファイルをダウンロードできます。
※ちなみにこのサイトだとインデントが無くなっていますので注意
 もしかすると動かないかも?
[Script_20180131.py] ----------------------------------------------

import bpy

name = 'TestPanel'
size = 1
rows = 2
columns = 4

def vert(column, row): return (column * size, row * size, 0)

def face(column, row):
return (column * row + row
, (column + 1 ) * rows + row
, (column + 1 ) * rows + 1 + row
, column * rows + 1 + row)

verts = [vert(x, y) for x in range(columns) for y in range(rows)]
faces = [face(x, y) for x in range(columns -1) for y in range(rows - 1)]

mesh = bpy.data.meshes.new(name)
mesh.from_pydata(verts, [], faces)

obj = bpy.data.objects.new(name, mesh)
bpy.context.scene.objects.link(obj)
----------------------------------------------

上記スクリプトを実行すると下の様なパネルが表示されます。

f:id:Takunoji:20180131081624p:plain

rowsとcolumnsの値を変更して実行するとパネルの数が変わることを前回確認しています。ここまでが、range関数の勉強でした。

今回は、内包表記から行きます。
内包表記→「[vert(x, y) for x in range(columns) for y in range(rows)]」の部分です。
前回実行したスクリプトもこの処理を使用しています。
今度は、内包表記に着眼してソースコードを以下の様に書き換えます。
ダウンロードできるファイルでは「#### test #####」以下の部分になります。

###### for test ############
v = [x for x in range(3)]
print(v)

上記のコード(スクリプト)「[0, 1, 2]」と表示されます。
毎度のことですがエラーメッセージは気にしないでください

f:id:Takunoji:20180131213537p:plain

xの値をfor x in range(3)で代入してから配列にしています。
これを内包表記という様です。
こいつを応用すると始めのコードにある様な形でも使用できます。
###### for test2 ############
w = [(x,y) for x in range(3) for y in range(2)]
print(w)

f:id:Takunoji:20180131213855p:plain

xには、0->2, yには0->1が入るので、0,0 0,1 / 1,0 1,1 / 2,0 2,1と6個の
データができます。
これを踏まえて改めて始めのコードを改造してみます。
columns = 3
rows = 2
で起動するときと同じ処理になります。

###### for test3 ############
verts_num = [vert(x, y) for x in range(3) for y in range(2)]
faces_num = [face(x, y) for x in range(3 -1) for y in range(2 - 1)]

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

f:id:Takunoji:20180131214841p:plain

verts_numが頂点を示し、faces_numが面を示します。
面を示す番号に関しては、face関数(上記で定義)をよく見れば点をとる法則がわかりそうです。

今日はここまで、お疲れ様でした。
次回は、考え中。

Blender Python 本番3〜Pythonのrange関数〜

前回は、頂点〜面を作成について勉強しました。
前回のお残し部分は、以下の部分です。
ちょっとみづらいので前回のソースを修正しました。→緑色になってます。
--------------------------------------------------
# Utility functions
def vert(column, row):
print('""" Create a single vert """')
print (  (column * size, row * size, 0)  )
return (column * size, row * size, 0)


def face(column, row):
print('""" Create a single face """')
print(
(column* rows + row, (column + 1) * rows + row, (column + 1) * rows + 1 + row, column * rows + 1 +row)
)
return (
column* rows + row, (column + 1) * rows + row, (column + 1) * rows + 1 + row, column * rows + 1 +row
)

# Looping to create the grid
verts = [(-1,-1,0), (1,-1,0), (1,1,0), (-1,1,0)]
faces = [(0,1,2,3)]

# Create Mesh Datablock
mesh = bpy.data.meshes.new(name)
mesh.from_pydata(verts, , faces)

# Create Object and link to scene
obj = bpy.data.objects.new(name, mesh)
bpy.context.scene.objects.link(obj)
--------------------------------------------------
参考にしたサイトでは、上記の青い部分に緑色の関数が入っていました。
それをわかりづらいので削除したのでした(笑)
なので今回は、ちゃんとやります。
定義してある関数は2あります。
・vert 
・face

その前に、「range関数」を実行してみましょう。
コードと結果を以下に示します。range(開始, 終了, 間隔)で数字までの数を順に返す。

f:id:Takunoji:20180130215453p:plain


そして、写経します。
※写経は最も簡単な、コーディング力 アップ法だと思います。

import bpy

name = 'Gridtastic'
rows = 5
columns = 10
size = 1

# デバックモード 唵
bpy.app.debug = True

def vert(column, row):
return (column * size, row * size, 0)

def face(column, row):
return (column * row + row
, (column + 1 ) * rows + row
, (column + 1 ) * rows + 1 + row
, column * rows + 1 + row)

verts = [vert(x, y) for x in range(columns) for y in range(rows)]
faces = [face(x, y) for x in range(columns -1) for y in range(rows - 1)]

mesh = bpy.data.meshes.new(name)
mesh.from_pydata(verts, [], faces)

obj = bpy.data.objects.new(name, mesh)
bpy.context.scene.objects.link(obj)

実行結果が以下です。

f:id:Takunoji:20180130211937p:plain

でも、変なゴミの様な三角な様なものがあります。なんなのでしょうか?
それはさておきにして、先ほどの「お残し」を退治しようと思います。
※インデント(tab)が表示されないので、コピペした時にtabが入っていないとエラります
  なので1行に書きました。
【お残し_その1】
def vert(column, row): return (column * size, row * size, 0)
この関数を単純に起動します。
コードは以下になります。
--------------------------------------------------

size = 1
rows = 5
columns = 10

def vert(column, row): return (column * size, row * size, 0)

print(vert(columns, rows))

--------------------------------------------------
そして、実行結果が以下になります。エラーはスペルミスなど上記のコードを作成するのに手間取ったものなので気にしないでください。
1.Blenderの初期画面から左下(Viewの左となり)をクリックしてTextEditorを開きます。

f:id:Takunoji:20180130213038p:plain

2.下にあるText -> Run Scriptをクリックして実行します。

f:id:Takunoji:20180130213329p:plain

キャプチャの下部にある「(10〜」とある部分が関数から出力されたものです。
(10, 5,0)のタプルです。 pythonではリスト、タプル、配列、集合と変数の種類がある様です。変数については、良い記事があったのでそちらを参照ください。

ここのポイントは、内包表記になるのですがそれは次回

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


Blender Python 本番2〜頂点と面の作り〜

前回は、メッシュオブジェクト(2Dの面)を作ってみました。
ただし、参考にしたサイトの内容に関しては中途半端になっておりましたので続きをやります。

A grid of vertices

の部分から始めます。(Z軸は3Dの時、XとY軸のみの場合は2D)
まぁ一言でvertex(頂点)は(X軸, Y軸, (Z軸))の値で構成されます。実際のコードは以下です。
例①: Vector ( (0, -1 / math.sqrt(9), 0) ) # X: 0, Y: 1/3, Z:0
例②: verts = [(-1,-1,0), (1,-1,0), (1,1,0), (-1,1,0)]

上記の様なコードで表現します。
※サイトに出てくる「range()」は後日
 ちなみに、「bpy.app.debug = True」を1行いれるとデバック情報がコンソールに出力されます。こんな感じです。

f:id:Takunoji:20180129213620p:plain

Understanding faces

 今度は「面」です。「mesh(メッシュ)のことじゃね?なんでfaces?」と思う方も多いと思います。自分も思いました(笑)
メッシュ(mesh) = バーテックス「vertex(2D)」 + フェイシズ(faces)なのです。
下のコードをみてください

# Looping to create the grid
verts = [(-1,-1,0), (1,-1,0), (1,1,0), (-1,1,0)]
faces = [(0,1,2,3)]

# Create Mesh Datablock
mesh = bpy.data.meshes.new(name)
mesh.from_pydata(verts, , faces)

4つの「頂点」(vertes)を設定してから、一つの「面」(faces)を設定しています、
「[」「]」で囲まれた部分に()が「,」でくぎられて設定されています。
参考にしたサイトは頂点を左下の点から時計回りに点の順番を指定するルール」と記載していますが、いまいち理解できませんでした。

とりあえず、理解したのは→「頂点」と「面」を用意してあげればオブジェクトは作成できるということでした。
結局のところは、自分でコーディングしてみないとわからないと思います。
サンプルコードです。参考サイトのものをちょっといじったものです。

import bpy

# Settings
name = 'Gridtastic'
rows = 5
columns = 10
size = 1

# Utility functions
def vert(column, row):
print('""" Create a single vert """')
print((column * size, row * size, 0))
return (column * size, row * size, 0)


def face(column, row):
print('""" Create a single face """')
print((column* rows + row,
(column + 1) * rows + row,
(column + 1) * rows + 1 + row,
column * rows + 1 + row))

return (column* rows + row,
(column + 1) * rows + row,
(column + 1) * rows + 1 + row,
column * rows + 1 + row)

# Looping to create the grid
verts = [(-1,-1,0), (1,-1,0), (1,1,0), (-1,1,0)]
faces = [(0,1,2,3)]

# Create Mesh Datablock
mesh = bpy.data.meshes.new(name)
mesh.from_pydata(verts, , faces)

# Create Object and link to scene
obj = bpy.data.objects.new(name, mesh)
bpy.context.scene.objects.link(obj)

# Select the object
bpy.context.scene.objects.active = obj
obj.select = True

次回は、繰り返しを使用して面などを作成しようと思います。
参考サイトのfor文の部分です。

そんなわけで、次回はpythonの文法的な事をやります

 

Blender Python 本番1〜2D、メッシュオブジェクト〜

前回、BlenderPythonでの3Dオブジェクトを作成してみました。
前回参考にしたサイトはこちらです。

前回まで、3Dの画面描画についてやっていましたが、はっきり言ってムズイので
2D描画の方から着手しようと思います。(2D描画を基本にして3D描画の仕組みが出来上がっているらしいです。)

今回の参考にするサイトは以下になります。

sinestesia.co

最近気がついたのですが、翻訳機能もレベルがどんどん上がっている様ですね。
とりあえず英語サイトでも翻訳すれば問題なく読めそうです。

参考サイトのチュートリアルを進めていくことにします。
主に書いてあるコードの自分流解釈と実践になります。

上記のサイトに記載されているコードをコピペで実行した結果が下のイメージです。

f:id:Takunoji:20180128193715p:plain

結局は上記の様な「面」が写経するコードにより作成されます。
作成したものの情報を一覧してみました。以下の様なコードです。
>> list(bpy.data.objects)
>> bpy.data.objects['Gridtastic']

f:id:Takunoji:20180128194458p:plain

作成したコンポーネントは「Gridtastic」という名前がついている様です。

それでは、コードの解析に入ろうと思います。

(1.最初の黒塗り部分のコード) 変数宣言から入る様です。
#まずは使用する変数の宣言
 ---------------------------------------------------------
 import bpy #ライブラリのインポートを行う

 #設定
 name = 'Gridtastic' # mesh(メッシュ)とobject(オブジェクト)の名前
 row = 5                   # 行(row)とカラム(column)は表示するgrid(グリッド)が
 columns = 10         # 何個頂点を持っているのかを判定するのに使用します。
 ---------------------------------------------------------
(2.次の黒塗り部分のコード)
上のコードに引き続きmesh(メッシュ)とオブジェクト(object)の設定を行います。
 ---------------------------------------------------------
 vertices = # vertices(vertexの複数形=>頂点の意味
 face =
       # フェイス=>面の意味
 # Create Mesh Datablock => メッシュのデータを作成する部分
 mesh = bpy.data.meshes.new(name) #メッシュ(mesh)をGridtasticの名前で作成
 mesh.from_pydata(vertices, , face)

 # APIレファレンス参照
 #@docs: from_pydata(vertices, edges, faces)
 ## vertices = 頂点のリスト=>X軸、Y軸、Z軸の座標を示す。(0,1,2)
 ## edges    = 辺のリスト(2点を示す座標を表示) => (0, 1)
 ## faces     = 面のリスト(0,1,2,3)

 # Create Object and link to scene => オブジェクトを作成、シーンにリンクさせる
 obectj = bpy.data.objects.new(name, mesh)
 bpy.context.scene.objects.link(object)

 # Select the object => オブジェクトを選択
 bpy.context.scene.objects.active = object # 作成したオブジェクトをアクティブに
 object.select = True # オブジェクトをクリックして選択するのと同じ

ちなみに、上記の頂点、辺、面の値について検証してみました。
新たに下記の様なスクリプトを作成して実行します。下のキャプチャは実行結果です。

f:id:Takunoji:20180128212853p:plain

実行するスクリプトは下のものです。
---------------------------------------------------------
# Looping to create the grid
verts = [(-1,-1,0), (1,-1,0), (1,1,0), (-1,1,0)]
faces = [(0,1,2,3)]

# Create Mesh Datablock
mesh = bpy.data.meshes.new(name)
mesh.from_pydata(verts, , faces)

# Create Object and link to scene
obj = bpy.data.objects.new(name, mesh)
bpy.context.scene.objects.link(obj)

# Select the object
bpy.context.scene.objects.active = obj
obj.select = True
---------------------------------------------------------
vertsはvertex(頂点)のことです。Z軸の値は全て0ですので平面の点を示しています。
facesは4点を面にしますよという意味 ※後ほど細かい説明をいたします。
ちょっと長くなってしまったので今回はここまでにします。
次回は参考サイトの「A grid of vertices」の部分を記載いたします。



Blender Python 7〜オブジェクトをイジる〜

前回は、Blenderでの基本的なスクリプトを実行しました。
ターミナルでテキストエディタで作成した、スクリプトのコンソール出力を確認、
3Dオブジェクトを作成し、シーン(ワールド)への表示を行いました。

今回は、前回作成したスクリプトの内容についてやります。
前回、写経したスクリプトだと以下の様に表示されました。

f:id:Takunoji:20180121085932p:plain

ちなみに左下の部分、はテキストエディタで写経したスクリプトです。
コードは以下になります。
[写経]コメントを追加します。Blenderに日本語の入力設定をしていないため
   ブログの方にコメントを記載いたします。
-----------------------------------------------------------------------
# 各種ライブラリのインポート 
import bpy
import math
from mathutils import Vector
# 三角錐を描画するための点を指定します。
vertices = [
Vector*1,
Vector*2, 0)),
Vector*3, 0)),
Vector*4
  引数は可変です(2〜4です→上記サイト参照)
 
①: Vector*5,                # x=0, y=-ルート3, z=0
②: Vector*6, 0)),       # x=0.5, y=1 / (2 * ルート3), z=0
③: Vector*7, 0)),     # x=-0.5, y=1 / (2 * ルート3), z=0
④: Vector*8, # y軸の値をマイナス方面に増やしスクリプトを起動

f:id:Takunoji:20180121204536p:plain

おおっ!想定通り!!
じゃ同様に。。。下の三枚のキャプチャはどの頂点をいじった時でしょうか?

f:id:Takunoji:20180121204815p:plain

f:id:Takunoji:20180121204836p:plain

f:id:Takunoji:20180121205042p:plain

答えは次回(笑)
と行きたかったのですが、
上の①〜③までの値を見るとそれぞれX〜Yまでの
値を設定していてZ軸が0のものです。→平面の三角形の頂点を示します。
④に関しては、Z軸以外が全て0なので立体的になっている三角錐の頂点部分になります。

そして、イントロダクションは終わりにして。
次回は、基本を一からやり始めようと思います。

*1:0, -1 / math.sqrt(9), 0

*2:0.5, 1 / (2 * math.sqrt(3

*3:-0.5, 1 / (2 * math.sqrt(3

*4:0, 0, math.sqrt(3))),
]
print(vertices)
#点と点の間「面」を定義する様です。
※この部分はまだ理解できていません。。。
mesh = bpy.data.meshes.new('MyMesh')
mesh.from_pydata(vertices, [], [[0,1,2], [0,1,3], [1,2,3], [2,0,3]])
mesh.update()
# 3dオブジェクトを作成します。
obj = bpy.data.objects.new('MyObject',mesh)
# シーンにオブジェクトを登録(表示)します。
bpy.context.scene.objects.link(obj)
-----------------------------------------------------------------------
Vectorは描画するコンポーネントの各頂点を示しているはず。。。
※日本語サイトありました!
  Vector(1次元座標(x), 2次元座標,(y), 3次元座標(z), 4次元座標(t=時間軸

*5:0, -1 / math.sqrt(3), 0

*6:0.5, 1 / (2 * math.sqrt(3

*7:-0.5, 1 / (2 * math.sqrt(3

*8:0, 0, math.sqrt(3))),                      # x=0, y=0, z=ルート3
早い話が、ベクトル座標を表している様です。
ベクトル。。。昔、数Ⅱでやった様なやらない様な。。。
学校で深くやってないから。。。そんな言い訳は意味がありません。
プログラムを元に理解すべし(笑)

上記スクリプト、vertices で定義しているVectorの値をいじって理解に臨みます。
【仮説】
コードを参照して
・vertices => 頂点という変数名から4点が指定されているであろう
・同様にベクトルということで原点(0, 0, 0)座標より座標が上記の①〜④に伸びている
そして、スクリプトの実行結果より

f:id:Takunoji:20180121202517p:plain

①〜④は頂点で間違いなさそうだ。。。
確認、どこがどの頂点に対応しているのか?
テストその1 → z軸の値が0のものは一番下の三角形部分の頂点であろうか?
確認テスト=z軸の値が0のものに関して値を変更してみる
画面を三角形が見える様にずらす→Shiftキーを押しながらマウスホイールをドラッグして動かす。。

f:id:Takunoji:20180121204058p:plain

【テストケース1】
・x軸が0, yがルート3となる点は緑色の線の上にある点→①の点であろう
テストを実行
Vector((0, -2 / math.sqrt(3), 0

Blender Python 6〜プログラムで三角錐〜

前回は、下記のサイトを参考に基本的なスクリプトを叩きました(実行しました)。

Blender 3D: Noob to Pro/Advanced Tutorials/Python Scripting/Introduction - Wikibooks, open books for an open world

 

今回は、次のページ?を参考にします。

Blender 3D: Noob to Pro/Advanced Tutorials/Blender Scripting/Anatomy Of An Addon - Wikibooks, open books for an open world

まずは、自分がどのディレクトリにいるのか確認します。
※カレントディレクトリ→Macであれば、ターミナル、Windowsであれば
 コマンドプロンプトを立ち上げた時にMac: pwd, Windows: カーソルの左側に
 表示されている、ディレクトリ(フォルダ)のことです。
引き続き、パイソンコンソールで以下のように入力します。
>import os
>os.path.abspath(os.path.dirname("."))

これで表示されるディレクトリがカレントディレクトリになるハズ。。。
そして、参考サイトにあるコード
>diri(bpy.ops)

f:id:Takunoji:20180120214714p:plain


下のデータを渡す時に使用する値(Vectorなど)をPythonで表現すると以下のようになります。
 
, , and

Python」※ 自分は「import math」をやる必要がありました。

Vertices = \
          [
            mathutils.Vector((0, -1 / math.sqrt(3),0)),
            mathutils.Vector((0.5, 1 / (2 * math.sqrt(3)), 0)),
            mathutils.Vector((-0.5, 1 / (2 * math.sqrt(3)), 0)),
            mathutils.Vector((0, 0, math.sqrt(2 / 3))),
          ]

使用している関数の実行結果です。math.sqrt(3)はルート3に成る様です。
>>> import math
>>> math.sqrt(3)

f:id:Takunoji:20180120215459p:plain

そして、写経。。。。テキストエディタより起動します。

コンソール画面の下「Text」をクリック後に「Run Text」をクリックで実行

import bpy
import math
from mathutils import Vector
vertices = [
Vector*1,
Vector*2, 0)),
Vector*3, 0)),
Vector((0, 0, math.sqrt(3))),
]
print(vertices)
mesh = bpy.data.meshes.new('MyMesh')
mesh.from_pydata(vertices, [], [[0,1,2], [0,1,3], [1,2,3], [2,0,3]])
mesh.update()
obj = bpy.data.objects.new('MyObject',mesh)
bpy.context.scene.objects.link(obj)

そして、実行結果

f:id:Takunoji:20180120225428p:plain

pythonコードに慣れないせいか色々と手こずりましたが、なんとか表示することができました。

今日はここまででお腹いっぱいです。。。
次回は、作成した四角錐をいじってみようと思います。

*1:0, -1 / math.sqrt(9), 0

*2:0.5, 1 / (2 * math.sqrt(3

*3:-0.5, 1 / (2 * math.sqrt(3

Blender Python 5〜テキストエディタを使う〜

前回 Pythonコードを実行して見ましたが、うまく動きませんでした。
結局何も解らずじまいだったのでリベンジします。

まずは基本、BlenderPythonを扱うのに基本部分を理解します。

参考にするサイトは、Blender 3D: Noob to Pro/Advanced Tutorials/Python Scripting/Introduction - Wikibooks, open books for an open worldです。
色々と探したのですが、結局英語サイトになってしまいました。

そして、中途半端になっていたターミナル、コマンドプロンプトについて
Macであれば、Blenderをターミナルから起動します。

>/Applications/Blender.app/Contents/MacOS/blender

そして、テキストエディタで作成した。First.py(例)を起動します。
するとテキストで起動した、時のコンソール出力したものが
ターミナルに出力されます。デバックに使用できます。

f:id:Takunoji:20180121083839p:plain

 あとでスクリプトでオブジェクトを作成するためにキューブを削除しておきます。
記載してあるのでとりあえず、スクリプトを実行します。
※「コンソール」→「Pythonスクリプトのコンソール」のこととします。

1. >bpy.の後にコンソール画面の下らへんにある「AutoComplete」ボタンを押下
 →bpyオブジェクトの中にあるもの(プロパティ)が表示されます。
2. >bpy.data.objectsと入力してエンターキーを押下します。
 →オブジェクトの内容がコンソールに出力されます。でも意味がわかりません。。
3. > list(bpy.data.objects)
[bpy.data.objects['Camera'], bpy.data.objects['Lamp']]
画面上にあるオブジェクトの一覧が出力されています。(キューブは削除しました)

f:id:Takunoji:20180120203230p:plain
ちょっと悔しいので、キューブを作成してもう一度

f:id:Takunoji:20180120203343p:plain

f:id:Takunoji:20180120203352p:plain

そして、キューブの参照を変数に代入します → 操作するためです。
4. >cube = bpy.data.objects['Cube']
ついでにコンソール出力して見ます。そして、オートコンプリートもして見ました。
が、量が多いのでここにはアップしません。

f:id:Takunoji:20180120204106p:plain

Vectorが出てきました。。。以前テンソルフローでコテンパンにやられた奴です。。。
こいつは、「mathutils」パッケージに入っているようです。
インポートするには以下のように記述します。
> import mathutils
このままだと「mathutils.Vector」とコーディングします。
これが面倒臭いというときは「from mathutils import Vector」と書きます。

f:id:Takunoji:20180120205059p:plain

今度は、キューブを移動します。下は実行前の画像

f:id:Takunoji:20180120205450p:plain

入力するコマンドは

Cube.delta_location += mathutils.Vector((1, 1, 1))

です。

f:id:Takunoji:20180120205712p:plain

キャプチャだと微妙ですが。。。実際にコードを書いてみると動きます。
環境により動かないときはbpyなどのインポートができていないなど原因があるので
そいつを解決する必要があります。

今回は、ここまでにします。
次回は、今回の続きを行います(参考サイトの次ページ)



Blender Python 4〜オブジェクトを作る(失敗)〜

前回は、Pythonスクリプトで、バージジョン情報を出力したり、キューブを移動したりました。
今回は、BlenderPyhtonでのオブジェクト作成を見ながら勉強したいと思います。
実は、今日は何をしようかと考えてながらネットサーフィンしてたら上記のサイトを発見しました。日本語版は諦めてたので、まぁ嬉しいものがあります(笑)
早速コードを書いて実行したいと思います。
>>> mesh = bpy.data.meshes.new('CubeMeshNo1')
>>> object = bpy.data.objects.new('CubeObject', mesh)
>>> bpy.context.scene.objects.link(object)

上記のように実装しました。

1.データオブジェクトをシーンに追加

f:id:Takunoji:20180117213029p:plain

わかりづらいけど、真ん中にちっちゃい点ができただけです。
まぁ、サイズとか何も指定していないのでしょうがないかと思います。

2.データオブジェクトにデータをアタッチ
色々とやって見ました。がなんでかエラーが出力されます。

f:id:Takunoji:20180117214918p:plain

ちょっと、ここで失礼して調査します。では次回...

調査するほどでもありませんでした。。。。
入力ミスかなんかですね。。。参考にしたサイトでも、上記までのコードでも
ちゃんとしたキューブは作成されていませんでした。

だがしかし。。。

やっぱり原因がわからないので一時保留(流れてしまったらごめんなさい)

やっぱり、基本をちゃんとやろうと思います。というわけで次回へ続く