2016年9月24日土曜日

Nuke的 その7

今更ながら、ちょっとUnpremult・Premultについて書いてみます。
いろんな人が既に書いてるんですけど。。
カラコレの前・後にとりあえず入れとけ、みたいな感じの説明をよく聞くんですが、つまりこれ、どういうことで、何の為に使うノードなのかを解説できれば、と思います。

Unpremult・Premultについて

その1 multiply

日本語では<Unpremult=Alpha徐算済み>、<Premult=Alpha乗算済み>、といいます。

ここでまず、算数の用語として、

加算(たし算) : plus
減算(ひき算) : minus
乗算(かけ算) : multiply
徐算(わり算) : divide

ですね。(以下、全てplus、minus、multiply、divideで統一します。)

今回、重要になるのはmultiplyです。
PremultはPre-multiply、UnpremultはUn-pre-multiply。


その2 rgba

コンポジットでは、rgbaという4つの値を扱います。
rgbというカラー情報とaというアルファ情報です。


画像はrgbという値の組み合わせでカラーを表示し、0-1のアルファ情報をrgbにmultiplyすることで不透明度を表現します。

左:rgbaの値がそれぞれ、r=0.5、g=0.5、b=0.5、a=1の平面。
右:rgbaの値がそれぞれ、r=1、g=1、b=1、a=0.5の平面をPremult。


見た目は、全く同じに見えます。

左はシンプルなグレー平面です。rgbカラーが0.5、不透明度100%の平面。
右は半透明なホワイト平面です。rgbカラーが1、不透明度50%の平面。


右はPremultノードがなければホワイト平面にみえますが、Premultノードを入れることで、rgbのそれぞれにaがmultiplyされた結果が表示され、不透明なものだと定義されます。これを日本語だとAlpha乗算済みと呼びます。Alphaの乗算が済みました、ということで。

[ r = r*a、g = g*a、b = b*a ]


その3 カラーコレクション

カラーコレクションは映像の色彩を補正する作業です。

重要なのは、「カラーコレクションはrgbに対して行うもので、aを含めて行うものではない」ということ。

上の左右の画像にカラーコレクションを行う場合、

左の画像は、特に問題なくカラーコレクションを行うことができます。
rgbの値にgainしようが、gammaしようが、offsetしようが問題ありません。


右の画像は、見た目はグレーの平面に見えますが、グレー平面だと思ってカラコレしてはダメです、なぜならば本来の色はホワイトです。

カラーコレクションはrgbに対して行うもので、aを含めて行うものではない為、
一旦、アルファ情報をキャンセル、aをdivide(Unpremult)して、
本来のrgb値にしてからカラーコレクションして、
再びアルファ情報を与える、aをmultipy(Premult)する必要があります。

今回の場合は、
rgbそれぞれの値を[ r = r/0.5、g = g/0.5、b = b/0.5 ](Unpremult)して、
1(本来のrgb値)にしてからカラーコレクションして、
再び[ r = r*0.5、g = g*0.5、b = b*0.5 ](Premult)する必要があります。



煙とかイメージするとわかりやすいと思うんですが、
カラーコレクション前に、aを含めない本来のrgb値にする、というのがポイントです。

2015年3月16日月曜日

SphericalTransform


 SphericalTransform nodeで

・[Lat Long map]、
・[Mirror Ball]
・[cube]
・[Angular map 180]
・[Angular map 360]
・[Sphere]
・[180°fisheye lens]

の変換が可能です。

以下のLat Long mapを展開してみます。

http://www.hdrlabs.com/sibl/archive/index_files/collage_over_image_page0_22_1.png
[Lat Long map] > [Cube]
[Lat Long map] > [Mirror Ball]
[cube] > [Lat Long map]
[cube] > [Mirror Ball]





[Lat Long map]から[cube]展開して6台のカメラで6面カメラマップする360°マウントも可能です。


cubicProjection v1.0
Project latlong or other maps as six 2K cubic tiles onto your scene geometry with this quick setup.

http://www.nukepedia.com/python/3d/cubicprojection/


以下のリンクでcubicProjectionとMariとの連携してますね。
http://alijafargholi.com/2013/04/nissan-commercial/ 



2014年11月27日木曜日

Nuke Terminal

Terminal、メモです。
-----------------------------------------
mac
/Applications/Nuke8.0v6/Nuke8.0v6.app/Contents/MacOS/Nuke8.0v6 -h
win
"C:\Program Files\Nuke8.0v6\Nuke8.0.exe" -h
-----------------------------------------


Usage: Nuke <switches> <script> <argv>

  -a

formats default to anamorphic
 

  --nukeassist
run in Nuke Assist mode
 

  -b
start in background (fork)
 

  -c size
limit cache memory usage. Size is in bytes, or append k, M, G or T
 

 --cont
attempt to render subsequent frames in the range after an error;
if not specified, the application will stop on the first error.
 

  -d
set X display name
 

 -f
render at full size (turns off proxy; use -p to force render at proxy)
 

  -F range
Frame numbers to execute the script at.
      A range can be one of:
      'A'        single frame number A
      'A-B'      all frames from A through B
      'A-BxC'    every C'th frame from A to last one less or equal to B
 

  --gpu ARG
enables GPU usage when in terminal mode with an optional gpu index argument, defaults to 0 if none given. Will override preferences when in interactive mode
 

  --gpulist
print the selectable gpus and their index
 

  -h
print this help and exit
 

  --hiero
license against a Hiero license instead of a Nuke one
 

  -i
with -x or -t use interactive, not render, license
 

  -l
apply linear transfer to the file read in
 

 -m n
set threads to n
 

  -n
don't run postagestamps; don't open windows
 

 --nukex
run as NukeX instead of standard Nuke
 

  -p
turn on proxy mode (use -f to force full size)
 

  -P
measure performance metrics and show in DAG
 

 --pause
initial viewers in script specified on command line should be paused
 

  --safe
stops any scripts or plugins in ~/.nuke, $NUKE_PATH being executed as well as stopping any Ofx plugins being loaded (including FurnaceCore)
 

  --ple
run in Personal Learning Edition mode (see user guide)
 

  --priority p
run the application with a different priority, choose from:
      high (only available to super user on Linux/OS X)
      medium
      low
 

  -q
quiet (don't print stuff)
 

 -s n
sets the minimum stack size for each thread in bytes; this defaults
to 16777216 (16MB) the smallest allowed value is 1048576 (1MB)
 

  --sro
force the application to obey the render order of Write nodes such that Reads can use files created by earlier Write nodes
 

  -t
terminal only (no gui); if <script> is a .py file it will be executed
 

  --tg
terminal mode, but starting a QApplication so PySide/PyQt can be used. Needs an X session
 

  -V level
Print more stuff, choose level from:
       0 (not verbose)
       1 (output nuke script load and save)
       2 (output loading plugins, python, tcl, nuke scripts, progress and buffer report)
 

  -v
nukev (rest of command line is image files to view)
 

  --view v
only execute these views (comma-separated list: e.g. 'left,right')
 

  --version
print version information and exit
 

  -x
execute the script (rather than edit it)
 

  -X nodes
only execute these nodes (comma-seperated list)
 

  --remap r
For terminal mode, sets path remappings from a comma separated list. The remappings will be read as pairs, where the first path in each pair will map to the second path in each pair
    e.g. -remap "X:/path,B:/,Y:/,Z:/foo"
    The path X:/path/file.nk will be mapped to B:/file.nk
    The path Y:/bar/something.nk will be mapped to Z:/fo/bar/something.nk

This option will cause an error if there are not an equal number of 'map froms' and 'map to' entries in the list
 

  --crashhandling enabled
Specify 1 or 0 for whether the crash handler should be started or not. By default it only starts in GUI mode.This can also be controlled by using the environment variable NUKE_CRASH_HANDLING
 

  --nocrashprompt
Disable the crash prompt, so crashes are automatically submitted in GUI mode. This is the standard behavior in terminal mode.This can also be controlled by using the NUKE_NO_CRASH_PROMPT environment variable.
 

  --
end switches, allowing script to start with a dash or be just - to read from stdin
 

<script>:
  name of a .nk script to create, edit, or execute
 

  "-" means stdin
 

<argv>:
  [argv n] expressions to provide changing arguments to the script.

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
について。。

2014年8月28日木曜日

Nuke Expression 3D Camera Time Remapping

[Retime]、[Kronos]、[TimeWarp]でのタイムリマップを3Dカメラに適用するエクスプレッションを紹介します。


タイムリマップ
再生速度の特定部分の時間伸縮や逆再生などの時間操作を行う事

  よくある事例として、ハイスピードで撮影されたライブプレートを、特定の部分だけノーマルスピードや倍速にタイムリマップする事があります。(オフライン時にある程度タイミングが決められている場合も多いです。)
そのタイムリマップに合わせた3DCG用カメラの生成方法について紹介します。




事例

行程としては、以下の通りです。
今回、紹介するのは③で使用するExpressionになります。

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

①ライブプレートを[Retime]、[Kronos]、[TimeWarp]などのノードで、2D的にタイムリマップし、タイミングを決定する。

②ライブプレートのマッチムーブをノーマルスピードで行い、3Dカメラを生成する。

③マッチムーブで生成された3Dカメラをライブプレートと同様にタイムリマップする。

④タイムリマップした3DカメラをFBXで3DCGソフトにエクスポートする。

⑤タイムリマップした3Dカメラでレンダリングされた素材とタイムリマップされたライブプレートを合成

--------------------------------------------
※タイミングの決定には、カット制作に応じていくつかの方法があると思います。
※マッチムーブの精度を優先するため、ライブプレートのマッチムーブをノーマルスピードで行います。この行程には、3Dスタビライズを行う場合の行程を含みます。
※今回のタイムリマップはFilterによるフレーム補完を考えません。フレーム補完はライブプレートとレンダリング画像の合成後の処理として扱います。
--------------------------------------------

[TimeWarp]でタイムリマップ




※Matchmove_Camera : 元カメラ
※Retime_Camera : タイムリマップ適用カメラ

Retime_Cameraにエクスプレッションを適用。
parent.Matchmove_Camera.translate(TimeWarp1.lookup(frame))
parent.Matchmove_Camera.rotate(TimeWarp1.lookup(frame))