【Blender】をPythonで試してみた3

はじめに

こんにちは、がんがんです。
今回はBlenderの出力をcsvに出力したりと、少しだけいじってみました。
なので、Blender × Pythonに関するメモとしてまとめておきます。
Blender × Pythonに関する前回記事は以下になります。
gangannikki.hatenadiary.jp

参考記事

参考記事はその都度載せていきますが、すぐに見れるようにまとめておきます。

プリミティブ方式に関するはなし
PythonによるBlender3DCGモデリング(1)

BlenderのプリミティブオブジェクトをPythonで操作する -- PythonによるBlender 3DCGモデリング(2) --

csv出力に関するはなし
python - 頂点の座標をCSVにエクスポート

プリミティブ方式のおさらい

Blenderはオブジェクトの作成方法として、様々な方式があるようです。
今まで実験していたものはすべてプリミティブ方式と呼ばれるものになります。

今回は以下を参考に改めておさらいします。
www.rinkak.com

www.rinkak.com

三角コーンを作成

とりあえず、参考記事に倣って三角コーンを作成します。コードは以下の通りです。

import bpy

def delete_all():
	for item in bpy.context.scene.objects:
		bpy.context.scene.objects.unlink(item)

	for item in bpy.data.objects:
		bpy.data.objects.remove(item)

	for item in bpy.data.meshes:
		bpy.data.meshes.remove(item)

	for item in bpy.data.materials:
		bpy.data.materials.remove(item)

def add_cone():
	bpy.ops.mesh.primitive_cone_add()

if __name__ == '__main__':
	delete_all()
	add_cone()

実験の結果はこんな感じです。ちゃんとコーンが表示されています。
f:id:gangannikki:20190115015153j:plain

三角コーンを増やしてたり、変形させたりしてみる

次は三角コーンの数を増やしたり、形を変形させたりしてみます。

以下のコードは3つに増やした場合です。

def add_sankon():
	for x in range(3):
		bpy.ops.mesh.primitive_cone_add(
			location=(x, x, 0)
		)

見事に増えてます。
f:id:gangannikki:20190115015604j:plain

次に、別のパラメータもいじって形を変形させます。
コードは以下の通りです。

def add_cone():
	bpy.ops.mesh.primitive_cone_add(
		vertices=6,
		radius1=6,
		radius2=3,
		location=(3, 0, 0),
		rotation=(0.5, 0, 0)
	)

原型であるコーンの形はなくなってますね。
f:id:gangannikki:20190115015749j:plain

csvファイルに出力

今回のメインはこちらです。同様の質問をみつけ、そちらを参考にしていきました。
blender.stackovernet.com

コードは以下の通りです。基本はほぼ同じですが、Pathlibでファイル処理をしています。

def output_csv():
	verts = [ bpy.context.object.matrix_world * v.co \
	  for v in bpy.context.object.data.vertices ]

	csvLines = [ ";".join([ str(v) for v in co ]) + "\n" for co in verts ]

	outputFile = Path(".") / "mesh.csv"
	with outputFile.open(mode="w") as f:
		f.writelines( csvLines )

まとめ

今回はBlenderでの出力結果をcsv形式に落としてみました。
BlenderPythonが使えるため、今までのPython知識を使えるのでありがたいです。
Pythonモジュールについても今よりもっと使いこなせるように頑張ります。