画像を外側に広げた大きさでレンダリングしたい時に便利な、オーバースキャン レンダリングについて書いてみたいと思います。
オーバースキャンとは
もともとはブラウン管テレビの外周にある黒縁のように、データは存在するけど映像が見えない目隠しされている領域を「オーバースキャン」と言います。3DCGでもカメラフレーム外側の領域をレンダリングすることを「オーバースキャン レンダリング」と呼んだりします。
CGではコンポジットで被写界深度やレンズのゆがみを追加したとき画像の端が綺麗に処理されるように、または画面揺れを追加できるように、一般的な映像フォーマット(720p、1080p)より少し大きめのサイズでレンダリングすることが多いと思います。静止画でも印刷用途だと「裁ち落とし」部分まで画像を用意すると思います。
オーバースキャン スクリプト
オーバースキャン レンダリングしたいときは「bd_overscan.py」を使うと便利です。
オーバースキャン レンダリングの計算方法
大抵は3Dソフトごとにオーバースキャン レンダリング用のスクリプトや機能があるのですが、カメラのフィルムバックを使用すると簡単に計算することができます。
元となるカメラの設定です。
レンダー解像度
- 幅 1280
- 高さ 720
フィルムバック
- フィルム幅 36 mm
- 高さ 24 mm
カメラのフレームはこんな感じです。
デフォルト設定1280×720ピクセルのレンダリング結果です。オブジェクトを左右ギリギリに配置して、球体の影はフレームにかかるよう配置してます。このデータを使ってオーバースキャンを計算してみます。
パーセント指定する方法
「フィルムバック」を使用する方法
例えば120%に拡大したい場合は、現在の「レンダー解像度」と「フィルムバック」に1.2を掛けます。フィルムバックを使用するとカメラの「焦点長」を変更せずに済むので便利です。
レンダー解像度
- 1280 * 1.2 = 1536
- 720 * 1.2 = 864
フィルムバック
- 36 mm * 1.2 = 43.2 mm
- 24 mm * 1.2 = 28.8 mm
120%したプロパティです。
120%でレンダリングした画像です。
「焦点長」を使用する方法
フィルムバックの設定がないソフトの場合は「焦点長」を1.2で割る方法が使えます。3dsMaxの「レンズ」でも同じ計算方法が使えます。
レンダー解像度
- 1280 * 1.2 = 1536
- 720 * 1.2 = 864
焦点長
- 50 mm/1.2 = 41.666 mm
120%したプロパティです。
120%でレンダリングした画像です。
ピクセル数を指定する方法
1280pixを1600pixのようにピクセル数を指定する場合は「変更したいサイズ÷現在のサイズ*フィルムバックサイズ」で計算できます。
レンダー解像度
- 1280 → 1600
- 720 → 900
フィルムバック
- 1600 / 1280 * 36 mm = 45 mm
- 900 / 720 * 24 mm = 30 mm
1280×720を1600×900に変更したプロパティです。
1280×720を1600×900でレンダリングした画像です。
ピクセル数を指定して「焦点長」を求めるにはアークタンジェントとかいう計算が必要っぽいので、今回はスルーします。どうして計算方法を書いたかというと、他のソフトでも使うことができるんじゃないかなと思いました。
modoでオーバースキャン レンダリングするときは、シーンを別名で保存/管理する方法もありますが、カメラの動きを修正した場合を考えてレンダーパス使う方法や、バッチレンダリング時にコマンドでオーバースキャンの値を設定する方法が柔軟性があって便利な気がしますね。
参考
https://www.pixelfondue.com/blog/2016/12/9/overscan-rendering