Blender

Blenderのカメラを操作しよう

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')

実行した結果、私の環境では以下の画像が生成されました。

render
render.png (掲載にあたってjpgに変換・圧縮しています)

カメラの移動

次はカメラを移動させてみましょう。とは言っても非常に簡単です。カメラオブジェクトが持つ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.pycamera_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で自由にカメラを操作するにはもう少し勉強する必要がありそうですね。

次回は、移したい方向を移すためのカメラの回転方法を説明し、その後に注視点の位置ベクトルから回転角を計算して設定する方法を説明します。おまけでレンダリングの解像度の設定についても説明します。