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

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

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関数(上記で定義)をよく見れば点をとる法則がわかりそうです。

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