浜村拓夫(・∀・)作品集

頭の中にあるイメージを表現できるデザイン力が欲しいです(><)

BlenderをPythonで操作して図を描く方法

CG制作ソフトの「Blender」はPythonで操作することができます。

 

Blender - Wikipedia

Blender(ブレンダー)とはオープンソース3次元コンピュータグラフィックスソフトウェアの一つで3Dモデルの作成、レンダリングのほかアニメーション、コンポジット機能も備える。

ゲームエンジン機能も内蔵しており、Pythonスクリプトなどを利用することでインタラクティブなコンテンツを制作することができる。

 

BlenderPythonを使う方法を調べてみました。(メモ)

 

Pythonコンソールを表示させる

まずPythonを使うための画面を出します。

 

(参考)

Blender で Python スクリプトを実行してみる

Blender Python コンソール (Blender Python console) を使ってみる

Blender の画面レイアウトを「スクリプティング(Scripting)」に変える操作

画面レイアウトとして「Scripting」を選ぶ.

 

f:id:hamamuratakuo:20181004190053p:plain

 

Blenderの画面レイアウトで「Scripting」を選びます。

 

f:id:hamamuratakuo:20181004190146p:plain

 

Blenderの画面下部にPythonコンソールが表示されました。

これで、Pythonによる操作の準備ができました。

 

Pythonの動作テスト

PythonBlenderを操作するテストを行ってみます。

Pythonプログラムのサンプルコードを紹介してくれている記事があったので、参考にしてみます。

 

(参考)

blog.engineer.adways.net

 

まず、デフォルトで描画されている立体をPythonで消去してみます。

Pythonコンソールに以下のコードをコピペしてエンターキーを押して実行します。

#選択
bpy.ops.object.select_all(action='SELECT')
#全て選択された状態になったら削除
bpy.ops.object.delete(True)

この操作で、最初にあった立体が消えました。

 

次に、図形を描いてみます。

Pythonコンソールに以下のコードをコピペしてエンターキーを押して実行します。

import bpy
import math

#reset objects
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(True)

#world
bpy.context.scene.world.horizon_color=(0.0,0.0,0.0)

#plane_add
for i in range(0,100):
    bpy.ops.mesh.primitive_plane_add(radius = (i*1.1/100),location=(0,0,0),rotation=(math.pi*1/2,math.pi*i*8.2/360,math.pi*i*10/360))

for item in bpy.context.scene.objects:
    if item.type == 'MESH':
        bpy.context.scene.objects.active = bpy.data.objects[item.name]
        bpy.ops.object.modifier_add(type='WIREFRAME')
        bpy.context.object.modifiers['Wireframe'].thickness = 0.0025
        bpy.context.object.modifiers['Wireframe'].use_boundary = True

#lamp add
bpy.ops.object.lamp_add(type='HEMI',location=(0.0,0.0,2.0))

#camera add
bpy.ops.object.camera_add(location=(5.0,0.0,0.0))
bpy.data.objects['Camera'].rotation_euler = (math.pi*1/2, 0, math.pi*1/2)

#render
bpy.context.scene.render.resolution_x = 1000
bpy.context.scene.render.resolution_y = 1000
bpy.context.scene.render.resolution_percentage = 100
bpy.context.scene.camera = bpy.context.object
bpy.context.scene.render.image_settings.file_format = 'PNG'
bpy.data.scenes["Scene"].render.filepath = "tmp/plane.png"
bpy.ops.render.render(write_still=True)

 

実行後、Blenderの画面は以下のようになってます。

(画面のレイアウトをちょっと変更)

f:id:hamamuratakuo:20181004193044p:plain

 

Windowsパソコンなら、Cドライブ直下の「tmp」フォルダ内に「plane.png」という画像ファイルが作られています。

こんな画像でした。

f:id:hamamuratakuo:20181004193219p:plain

 

Pythonで計算させて描けば、複雑な図形も作れました。

 

BlenderAPIの使い方を学べば、いろいろな図形が描けるようになれると思います。

https://docs.blender.org/api/master/

 

イデア

最近、AIで描いたイラストが、人間のプロレベルに近付いているようです。

togetter.com

 

  1. 人間がラフスケッチで下書きを描く。
  2. AIでパースして清書する。
  3. BlenderなどのCGソフトでレンダリングする。

 

Blenderにデータを流し込んで描画するときに、Pythonで操作できれば作業を自動化できるかな?と思いました。

Blenderの他にも、UnityやUnrealEngineなど、APIで操作できるCGソフトがあるので、使い方を調べてみたいと思います。