3DCGソフト【Blender】をPythonで試してみた1

はじめに

こんにちは、がんがんです。
今回は研究にて3DCGソフト【Blender】を使用したのでその備忘録です。


以下はBlenderの公式サイトです。
www.blender.org

また、日本用の非公式ページもあるようです。
blender.jp

参考記事

今回は以下を参考にしてセットアップをやっていきます。Blenderは参考記事を参照してバージョン2.79bをインストールします。
www.cgradproject.com

また、実験のメインは以下の記事です。Pythonファイルから作成してみます。
nnamm.com

1. インストールして日本語化

まずは無事にインストールできました。設定はすべてデフォルトです。
その後、以下を参考にとりあえず日本語化しておきます。

Blender入門#3:Blenderの日本語化 - CGrad Project

2. コマンドプロンプトからの実行

pythonファイルを作成し、コマンドプロンプトから実行していきます。

実行方法は以下を参考にしました。
Blender起動時オプション — blendstudy 0.01 documentation

コマンドはこんな感じです。

blender -b --python test.py

コマンドの説明をしていきます。
blender
まずblenderコマンドは、blender.exeがあるフォルダでしか実行できません。
普段仮想環境にてPythonを分けているため、これでは非常に使い勝手が悪いです。そこで、環境変数blender.exeのパスをぶちこんで解決しました。

-b
これはバックグラウンドでの実行を意味しています。-b(または--background)を入れることにより、GUIを起動せずともblenderの実行が可能になります。

3. pythonによる実行

まずはこちらを参考に動かしてみたいと思います。
nnamm.com

コードはこんな感じです。

#------------------------------------------------------------
#
#	pythonでBlender
#		test.py
#
#------------------------------------------------------------
import bpy
import os
import math

"""
  初期化
"""
def delete_all():
	#  デフォルトで存在しているCubeを削除
	bpy.ops.object.delete()

"""
	シーン作成
"""
def create_scene():
	#  Cube作成
	cube_count = 10
	for axis_x in range(0, cube_count):
		for axis_y in range(0, cube_count):
			for axis_z in range(0, cube_count):
				#  pattern1
				#bpy.ops.mesh.primitive_cube_add(location=(axis_x*2, axis_y*2, axis_z*2))
				#bpy.ops.rigidbody.object_add()

				#  pattern2
				#bpy.ops.mesh.primitive_cube_add(location=(axis_x*2, axis_y*2, axis_z*2),
				#								rotation=(15, 15, 0))
				#bpy.ops.rigidbody.object_add()

				#  pattern3
				bpy.ops.mesh.primitive_cube_add(location=(axis_x*2, axis_y*2, axis_z*2))
				bpy.ops.rigidbody.object_add()
				bpy.ops.object.modifier_add(type='SOFT_BODY')

	#  平面作成
	bpy.ops.mesh.primitive_plane_add(location=(cube_count-1, cube_count-1, -10))
	bpy.ops.rigidbody.object_add(type='PASSIVE')
	bpy.data.objects["Plane"].scale = (cube_count+10, cube_count+10, 1)

	#  カメラ
	bpy.data.objects["Camera"].location = (cube_count+20, cube_count+20, cube_count+20)
	bpy.data.objects["Camera"].rotation_euler = (math.pi/6, 0, math.pi*3/4)
	bpy.data.cameras["Camera"].lens = 10

	#  照明
	bpy.data.objects["Lamp"].location = (0, 0, cube_count+10)
	bpy.data.lamps["Lamp"].type = 'SUN'

"""
	物理シミュレーション
"""
def start_simulation():
	bpy.ops.ptcache.bake_all()

	#  動画作成
	bpy.context.scene.render.resolution_x = 400
	bpy.context.scene.render.resolution_y = 300
	bpy.context.scene.render.resolution_percentage = 100
	bpy.context.scene.render.image_settings.file_format = 'AVI_JPEG'
	bpy.data.scenes["Scene"].render.filepath = "Physical.avi"
	bpy.context.scene.frame_start = 0
	bpy.context.scene.frame_end = 250
	bpy.ops.render.render(animation=True)

	#  保存
	save_path = os.path.abspath(os.path.dirname(__file__))
	bpy.path.relpath(save_path)
	bpy.ops.wm.save_as_mainfile(filepath="Physical.blend", relative_remap=True)

"""
	メイン処理
"""
if __name__ == '__main__':
	delete_all()
	create_scene()
	start_simulation()

patternを3種類用意して実験されていたようです。

実行してみると、以下のようなエラーが出ました。

KeyError: 'bpy_prop_collection[key]: key "Plane" not found'

どうやらPlaneというKeyが存在しないようです。

まとめ

研究で使用するためにはじめてBlenderを使用しました。
普段使用しているPythonを用いていろいろやれることも分かったので、これからもいじってみます。

次回は今回起きたエラーを改善していきます。