ステンドグラスの設計図を作る前に、ステンドグラスの頂点情報をPythonで作っておいた方が融通が効きそう。
綺麗に化粧直しして、ガラスっぽくレンダリングするのを Blenderでやってみたいと思う。
作った設計図の概要
- 頂点と面情報をもった、ガラス板の集合
- 高さと半径をパラメータにして、全体のサイズとアスペクト比を自動計算する
- 円周方向の部品数をパラメータ化
今予め用意したのは、小物入れのポリゴンデータ
Blenderに期待している機能
- pythonで別途自作した頂点情報と面情報の読み込み
- 部品の嵌め合いと、半田(ステンドグラスの固定に使っている)の再現
- 透明なガラス素材で、色の具合を確認したい
- (今の図面は小物入れだけど)中に光源を入れて、ランプとしての出来上がりを見たい
- 出来れば、まだらなガラスも試したい
- 箱と蓋の嵌め合いを確認したい
まずはスケール合わせ
設計図の寸法はミリ単位で扱っているのだけれど、 Blenderの単位 BU(Blender Unit)とは標準的な数字の大きさが合わず、 そのままポリゴン表示すると画面に収まり切らない。
スケールを合わせる方法は、
- 単純にオブジェクトを縮小する
- 座標系をミリ単位にして、表示幅を設定する
1の方法は、 object.scale = (0.1, 0.1, 0.1) とすれば1/10になる。 こうしてBUに数字の大きさを合わせれば、表示のパラメータを調整する必要がない。 ただ、実際の寸法が変わってしまうと何かと不便。
2の方法をGUIで設定するには、 右側の「Scene」ウインドウの「Scene」タブの「単位」でメートル法を選んで、 拡大縮小を””1.0″”から””0.001″”にする。これでmm単位になる。
これをスクリプトで設定する方法は以下の通り。
bpy.context.scene.unit_settings.system='METRIC' bpy.context.scene.unit_settings.scale_length = 0.001
これだけだと画面からはみ出してしまうので、 視点位置なども調整する必要がある。
3DViewのグリッドの調整
スケールをミリ単位にすると、グリッドが大き過ぎて目安にならない。 グリッドの方は、1cm単位にしよう。
for a in bpy.context.screen.areas: if a.type == 'VIEW_3D': bpy.types.SpaceView3D(a.spaces[0]).grid_lines = 30 bpy.types.SpaceView3D(a.spaces[0]).grid_scale = 0.01
カメラと照明の位置が近すぎる
カメラと照明が、部品の内側に入ってしまったので、 位置を少し遠めに変更する。
こんな感じ。ついでに背景にも色をつけておくと見易い。
# Lamp lamp = bpy.data.objects['Lamp'] lamp.location = (250, 250, 100) lamp.rotation_euler = (0, 0, 0) lamp.data.falloff_type = 'INVERSE_LINEAR' lamp.data.shadow_method = 'NOSHADOW' # Camera camera = bpy.data.objects['Camera'] camera.location = (200, 0, 100) # 100 = 10cm camera.rotation_euler = (1.221, 0, 1.57) # 70, 0, 90 camera.data.type = 'PERSP' camera.data.angle = 0.7 camera.data.clip_start = 0 camera.data.clip_end = 1000 # Background world = bpy.data.worlds['World'] world.horizon_color = (0.8, 0.8, 0.8) world.zenith_color = (0.1, 0.1, 0.1) world.use_sky_blend = True
全体がレンダリングされない
ミリスケールにすると、大きめの部品を作った場合にレンダリングされない部分が出てくる。
レンダリングする範囲をクリップしている設定を合わせてあげると良い。
# Camera camera.data.clip_start = 0 camera.data.clip_end = 1000
作業中の 3DViewの視点が近すぎる (未解決)
GUIではマウスで簡単に操作出来るのだけれど、 スクリプトで変更する方法が見付からない。
スクリプトでレンダリングした結果を見る分には困らないので、 おいおい考えることにする。
とりあえず以下の様にすれば、オブジェクトが全部見える位置に移動できる。
# 3D View の視点操作 for area in bpy.context.screen.areas: if area.type == 'VIEW_3D': for region in area.regions: if region.type == 'WINDOW': override = {'area': area, 'region': region, 'edit_object': bpy.context.edit_object} bpy.ops.view3d.view_all(override)
あと、毎回出てくる画面、スプラッシュウィンドウを消す
毎回起動直後に出てくるBlenderの紹介?画面。 スクリプトで動かしている時には、邪魔でしかない。
あのウインドウの名前が分からなかったので、消すのに時間がかかった。(汗)
ファイル>ユーザー設定>インターフェース タブ の右下にある 「スプラッシュを表示」のチェックを外すと、今後表示されない。
これで幾分快適になった。
これまでの設定の後、さくっとレンダリングした結果はこんな感じ。
matplotlibで表示したのと、微妙に位置がずれていたり。 あんまりステンドグラスっぽく見えないのを、この後直していきたい。