2014年9月22日月曜日

Nuke Camera Mapping その3 焦点距離と画角とめまい

基本的な部分なんですけど、整理も兼ねて、、焦点距離と画角の関係おさらい。
カメラマップする際の投影サイズと焦点距離との関係です。



ω:画角
f:焦点距離
h:画面対角長

ω = 2 × atan(h/(2*f)) [rad] = 180°/π × 2 × atan(h/(2*f)) [deg]


例えば、HD(1920x1080)の画像を画面対角長2倍のサイズ(3840x2160)にエクステンションしてカメラマップする場合、
[画角:ω]が同じだとして、[画面対角長:h]が元カメラの2倍になるので、[焦点距離:f]は元カメラの1/2倍になります。

オリジナルHD画像(今回、ディストーション考慮せず。。)
エクステンションした画面対角長2倍サイズ画像(チェッカー部分を書き足し)


エクステンションサイズの倍率は、オリジナルサイズの何倍に相当するかを検証し、適正サイズを割り出します。

uvでのwindow scale


今のところ、↑が単純なエクステンションの場合、効率の良い方法のような気がしていますが、もし他に効率のいい方法があればご教授下さいw。


[ScanlineRender]ノードは(root.format)サイズに依存します。出力サイズを変更する場合は(bg)インプットに変更出力サイズの画像を接続するか、(overscan)パラメーターでbboxを拡張します。


例えば、焦点距離と画面サイズから画角を割り出して、、↓のような事も出来ます。実用性があるかどうかは別として。。

rotate.y
 = 180/3.14*2 *atan(Camera2.haperture/(2*Camera2.focal))
 = degrees(2 *atan(Camera2.haperture/(2*Camera2.focal)))




 
参考
Nuke Camera Mapping その1 Camera frustumと3D Card



応用として、ドリーズーム / DollyZoom(別称:カウンターズーム・コントラズーム・トロンボーンショット・ゾリー)のエクスプレッションを書いてみます。

ターゲットのオブジェクトの位置にCard1を置き、Camera1でドリーズームする場合、開始フレームを1として、オブジェクトの位置におけるfrustumのheightを固定します。
オブジェクトの位置におけるfrustumのheightを固定したまま、カメラの移動距離に伴って、focal lengthをリンクさせるエクスプレッションを記述します。

オブジェクトの位置におけるfrustumのheightを固定

オブジェクトの位置におけるfrustumのheight [開始フレームを1とした場合]
= Camera1.haperture(1)/(2*Camera1.focal(1))*(2*Card1.z(1))


カメラの移動距離 [開始フレームを1とした場合]
pow((Camera1.translate.x(1)-Camera1.translate.x)* (Camera1.translate.x(1)-Camera1.translate.x) + (Camera1.translate.y(1)-Camera1.translate.y)* (Camera1.translate.y(1)-Camera1.translate.y) + (Camera1.translate.z(1)-Camera1.translate.z)*(Camera1.translate.z(1)-Camera1.translate.z), 0.5)


focal length
= (Card1.z(1) ± カメラの移動距離 ) / オブジェクトの位置におけるfrustumのheight[開始フレームを1とした場合]*Camera1.haperture

※2014/09/25修正しました






ちなみに、センサーサイズ比較表、wikiより。

SensorSizes.svg
"SensorSizes" by Hotshot977. Subsequently reworked extensively by User:Moxfyre for correct, exact sensor size dimensions and accurate captions. - Image:SensorSizes.png. Licensed under Public domain via ウィキメディア・コモンズ.


Super 35mm
24.89 × 18.66 mm
crop factor : 1.39


2014年9月4日木曜日

Nuke Camera Mapping その2 水平線

カメラマップについて、雑多な感じで、、

カメラマップの際、3Dオブジェクトで水平線を設定する場合の、カメラから水平線までの距離のざっくりした割り出し方です。あくまでもざっくり、参考までに。。

Nihonkai Suiheisen.jpg
カメラの高さをx、水平線までの距離をL、地球の半径をRとすると、、
 
(R+x)2 =L2+R2

地球は長年の自転活動によって回転楕円体になっているため、赤道半径(6378km)と極半径(6357km)とが異なるようで、大体の平均をとって地球の半径R=6366kmに設定します。※蜃気楼などによる光の屈折は考えません。

更に、地球の半径と比較したカメラの高さを、R>>xとみなした場合、(省略)

L(m)=3570×√x(m)

で算出できます。

------------------------------------------------------

カメラの高さx=1.5mの場合、
水平線までの距離L=4.3km


カメラの高さx=450mの場合、(スカイツリー第二展望台くらい)
水平線までの距離L=75km

カメラの高さx=3700mの場合、(富士山くらい)
水平線までの距離L=217km

------------------------------------------------------


地球
http://ja.wikipedia.org/wiki/%E5%9C%B0%E7%90%83

蜃気楼
http://ja.wikipedia.org/wiki/%E8%9C%83%E6%B0%97%E6%A5%BC

2014年9月1日月曜日

Nuke Camera Mapping その1 Camera frustumと3D Card

画像をカメラマップする場合、投影する画像の解像度を出来るだけ保持しつつ、最小限の範囲でカメラマップする事が、マットペインターとのやり取りが発生した場合など、特に必要になってきます。

カメラマップをはじめ、2.5Dで出来る事はいろいろあるので、今回のトピックは雑多な感じで投稿しますw。諸々、応用して頂ければと思います。

まず、Cameraと3D Cardの関係です。

[Card]には(z)、(lens-in focal)、(lens-in haperture)というパラメーターがあります。

 
このパラメーターと[Camera]の(focal length)、(horiz aperture)をリンクさせる事で[Card]のスケールがカメラのfrustumに自動的にフィットします。[Card]にインプットされるイメージの縦横比とカメラのaperture比は同じにします。

[Input image] width/height =  [Camera] haperture/vaperture


さらに[Card]に[TransformGeo]を接続して、axisに[Camera]を使用すると、常にカメラのトランスフォームと[Card]がリンクするので、常に[Card]が[Camera]方向についてきてくれます。



余談ですが、[CameraTracker]にはFilm Back Presetという項目があり、さまざまなカメラのFilm Back Sizeが登録されています。


今回はNukepediaの日本語紹介ページになってしまいましたw
とりあえず、その1ということで、、

http://www.nukepedia.com/written-tutorials/creating-a-3d-image-plane
http://www.nukepedia.com/written-tutorials/camera-trigonometry/

ちなみにNukeでの円周率の記述はpiで処理できますが、ものすごく重くなるので個人的には3.14159ぐらいにしています。。
π = 3.14159 26535 89793 23846 26433 83279 50288 …



次回は、
Nuke Camera Mapping その2 format size と focal length
について。。