BlenderをPythonで操作するシリーズ第3回です。
前回はこちら → bpyモジュールを使ってみよう
今回は、カメラオブジェクトを操作してシーンのレンダリングをします。
※ 2019/08/17 追記
記事の内容をBlender 2.80に対応させました。
レンダリング
それではまず、レンダリングをしてみましょう。レンダリングをするにはbpy.ops.render.render()
を実行すれば良いということを、前々回に説明したのを覚えていますか?このレンダリングによって、bpy.data.images
にレンダリング結果のイメージオブジェクトが、'Render Result'
という名前で生成されます。
次に、生成したイメージオブジェクトを、save_render()
を使ってファイルに保存します。この時、引数には保存するファイル名まで含めたパスを与える必要があります。パスは絶対パスでも相対パスでも大丈夫です。画像の形式は指定したファイル名の拡張子から自動的に判別されます。
ここまでをまとめると、以下のコードでレンダリングから画像の生成までできそうですね。
import bpy
bpy.ops.render.render()
bpy.data.images['Render Result'].save_render('img/render.png')
実行した結果、私の環境では以下の画像が生成されました。

カメラの移動
次はカメラを移動させてみましょう。とは言っても非常に簡単です。カメラオブジェクトが持つlocation
プロパティの値を変更してあげれば位置を変えることができます。(しかし、2.80からはプロパティの値を直接使うことができなくなり、SetterやGetterを通じて行う必要が出てくるようです。リリースされたら確認の後、記事を修正します。)
import bpy
camera = bpy.data.objects['Camera']
print(camera.location)
camera.location += camera.location * 8
print(camera.location)
3行目でカメラオブジェクトを取得し、5行目でカメラを最初の位置から9倍遠い位置に移動させています。
カメラのクリッピング面
先程見せたchange_location.py
にcamera_render.py
を結合してレンダリングしてみると、形が変な立方体がレンダリングされたと思います。
その原因は、カメラオブジェクトに設定されているclip_end
プロパティの値にあります。この値は、カメラが持つ設定の一つであるクリッピング面の、遠クリッピング面 (Far Clipping Plane) の設定値を表しています。
クリッピング面には近クリッピング面 (Near Clipping Plane) と遠クリッピング面の2つがあり、近クリッピング面は、その設定値よりも近い部分はレンダリングしないことを表し、遠クリッピング面は、その設定値よりも遠い部分はレンダリングしないことを表しています。より良い説明が知りたい方は、以下のサイトが参考になると思います。
MAYA クリッピングプレーン
つまり形が変になってしまっていたのは、立方体の一部がカメラの遠クリッピング面よりも外側になっていたからです。本当に外側になっていたのか、以下のコードで確認してみると良いと思います。
import bpy
import numpy.linalg as LA
camera_objects = bpy.data.objects['Camera']
camera_objects.location += camera_objects.location * 8
print(f'Distance : {LA.norm(camera_objects.location)}')
camera = bpy.data.cameras['Camera']
print(f'Far clip : {camera.clip_end}')
print(f'[FYI] Near clip : {camera.clip_start}')
location
プロパティ等を設定するためのオブジェクトと、カメラ固有の設定を行うためのオブジェクトが異なっていることに注意して下さい。(7行目)
近クリッピング面を設定するためのプロパティclip_start
もおまけで付けておきました。
本記事はここまでにしたいと思います。まだカメラの回転の説明をしていないので、Pythonで自由にカメラを操作するにはもう少し勉強する必要がありそうですね。
次回は、移したい方向を移すためのカメラの回転方法を説明し、その後に注視点の位置ベクトルから回転角を計算して設定する方法を説明します。おまけでレンダリングの解像度の設定についても説明します。