Blenderのカメラを操作しよう

Blenderのカメラを操作しよう

Python で始める Blender3

Published: 6/15/2019

Updated: 8/17/2019

6

更新履歴
  • 2019/08/17: 記事の内容を Blender 2.80 に対応させました。
BlenderをPythonで操作するシリーズ第3回です。
今回は、カメラオブジェクトを操作してシーンのレンダリングをします。

レンダリング

それではまず、レンダリングをしてみましょう。 レンダリングをするには 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.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.pycamera_render.py を結合してレンダリングしてみると、 形が変な立方体がレンダリングされたと思います。
その原因は、 カメラオブジェクトに設定されている clip_end プロパティの値にあります。 この値は、カメラが持つ設定の一つであるクリッピング面の、 遠クリッピング面 (Far Clipping Plane) の設定値を表しています。
クリッピング面には 近クリッピング面 (Near Clipping Plane) と遠クリッピング面の2つがあり、 近クリッピング面は、その設定値よりも近い部分はレンダリングしないことを表し、 遠クリッピング面は、その設定値よりも遠い部分はレンダリングしないことを表しています。
Info
より良い説明が知りたい方は、以下のサイトが参考になると思います。
つまり形が変になってしまっていたのは、 立方体の一部がカメラの遠クリッピング面よりも外側になっていたからです。 本当に外側になっていたのか、以下のコードで確認してみると良いと思います。
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 で自由にカメラを操作するにはもう少し勉強する必要がありそうですね。
次回は、移したい方向を移すためのカメラの回転方法を説明し、 その後に注視点の位置ベクトルから回転角を計算して設定する方法を説明します。 おまけで、レンダリングの解像度の設定についても説明します。

Rafka
Rafka

Software Engineer

最近はドラクエ 1 & 2 をプレイしてます。楽しい!

関連記事