Takunojiの日記

自分が勉強したプログラム技術メモ

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