2011年9月11日日曜日

camera_distortion.pyなるものが。

ある日ツイッターで目に止まったこちらのブログのポスト、
記事のタイトルを見てみると


という非常に期待せざるを得ない感じだったのでさっそく訳してみました。
いつものように抄訳かつ適当に意訳だったりメモがわりの補足も含んでいるので
正確な内容を知りたい方はオリジナルの記事を参照してください。

で、以下から訳。



今回の記事は不均等な透視投影によりメッシュを変形させるエフェクトを実装した
BlenderのPythonスクリプトのコンセプトプルーフに関してです。

いわゆるセルアニメではキャラクターがシーンに存在するカメラや視聴者の視点に
近づいた際に、現実にはありえないような極端な変形を伴った絵として描かれることが
あります。例えば、キャラクターが腕を前につきだした時などです。そのときの腕の
大きさは画面に向かって手が伸びてくるような印象を与え、迫力を出すため、写実的な
表現として適切なサイズよりも大きく誇張して描かれることがあります。

今回のスクリプトの目的はこのような誇張のための変形をblenderで実現することです。
このスクリプトの基本的な考え方はカメラとオブジェクトの頂点間の距離に対して、
カメラの焦点距離を変化させてしまうという方法です。

焦点距離はblenderのカメラがもつパラメータの一つです。これは透視投影の際に画像の
アスペクト比を定義するのに用いられています。カメラとオブジェクトの距離を変えずに
焦点距離だけを大きくしたとすると、レンダ結果の画像に写るオブジェクトのサイズは
大きくなります。

今回のスクリプトはシーンに存在するメッシュオブジェクトに対して不均一な透視投影
処理を行うことでオブジェクトを変形させています。この不均一な透視投影のための
変換行列はカメラとメッシュオブジェクトの頂点間の距離から焦点距離を算出する関数と
して定義されています。カメラからオブジェクトの頂点までの距離はそれぞれの頂点ごとに
異なるため、算出される焦点距離も各頂点ごとに異なったものになります。

わかりやすく説明するため、焦点距離が50mmと80mmという二種類の値になったとします。
シーンの遠いエリアを焦点距離50mmのカメラで、その他の近いエリアを焦点距離80mmの
カメラでレンダリングして一枚の画像として出力すると、シーンは均一なパースにならず、
結果としてシーンに存在するオブジェクトは変形して描画されます。

実際にシーンをレンダリングする際には、先ほどの例のように焦点距離の値があまりに違い
すぎると焦点距離が切り替わる部分で出力される画像が滑らかにつながらず、ツギハギの
ような状態になってしまうことが予想されます。

そのためカメラと頂点間の距離から焦点距離を算出する際には下図のように滑らかで
連続した値が得られるように非線形補完を行っています。

[図1. カメラ-頂点間の距離と焦点距離の対応]

グラフの横軸はカメラと頂点間の距離、縦軸は焦点距離です。それぞれの最大値、最小値、
途中の区間で指定している値はデフォーマのパラメータとしてユーザーが定義できます。


以下の画像は不均等透視投影による変形の効果を示すサンプルです。
左端と右端の画像は同じオブジェクトを焦点距離50mmと80mmに設定したカメラで
それぞれレンダリングしたものです。
中央の画像は今回のスクリプトを適用して変形した状態のものです。モデル足元など
カメラから遠い部分は焦点距離50mmでのレンダリング、頭などのカメラに近い部分は
焦点距離80mmでのレンダリングに似た結果になっています。

[図2. 変形のサンプル(左から焦点距離50mm、変形を適用、焦点距離80mm)]

最後に上のサンプルで使用したスクリプトのリストを示します。

使用にあたっての制限事項としては

a. このスクリプトで変形を適用できるのはメッシュオブジェクトに対してのみ
b. シーンにあるメッシュオブジェクトそのものを変形します
 (オリジナルのバックアップのためのコピーなどは作りません)。
 また、オブジェクトを実際に変形させているためアニメーションのレンダリングには
 向きません。
c. ミラーモディファイアを使用している場合は事前に適用してモディファイアスタックから
 削除しておく必要があります。

また透視投影の仕組みを利用しているため、カメラはパースペクティブカメラでないと
適切な結果が得られません。



と、こんなところでしょうか。
まさに前回ふれたPencil+のパース変形モディファイヤ的なスクリプトのようです。
訳の最後にあるように制限がいくつかあるものの非常によさげです。
なんというか、ありがたいというか申し訳ないというか。
ありがたく頂戴しつつ作成中のモデルでテストしてみる感じで。

---------------------------------------------------------------
コメントなどありましたらこちらへ->web拍手