Pages

2009年5月23日土曜日

AfterEffectsでの色空間

コーディング中にちょっと躓いたのでメモ。[※修正版@090527]

AEではスクリプトによって平面を作る際に"addSolid"というメソッドを使いますが、ここで色を指定するやり方が良く分かっていませんでした。

スクリプトガイドによると、
”app.project.item( index).layers.addSolid(color, name, width, height, pixelAspect, duration)”
となっており、”color”に関しては、
”The color of the solid, an array of four floating-point values, [R, G, B, A], in the range [0.0..1.0].”
とされています。
つまり、RGBを各0~1で設定してやらんといけない訳ですね。

見慣れた0~255でないのは、プロジェクトの色深度が16bit,32bitの場合もあるから、というのは理解できます(実際、アニメ撮影業界はそろそろ16bitが標準となっているのではないでしょうか)。

が、通常のGUIで平面を作成する際のパラメータは、相変わらずHSBと各色深度分のRGB(8bitなら256階調)のままです。
ん~~、何か分かりにくい。

という訳で、色深度が幾つだろうがパラメータが変わらないHSBをベースに、0~1のRGBへコンバートする関数をチャラっと組んでみました。(参考:http://en.wikipedia.org/wiki/HSL_and_HSV)

//-----------------------------------
function convHsvToRgb(h,s,v){
s=s/100;
v=v/100;
var Hi=Math.floor((h/60))%6;
var f=(h/60)-Math.floor(h/60);
var p=v*(1-s);
var q=v*(1-f*s);
var t=v*(1-(1-f)*s);
var r;
var g;
var b;

if(s!=0){
switch(Hi){
case 0:r=v, g=t, b=p; break;
case 1:r=q, g=v, b=p; break;
case 2:r=p, g=v, b=t; break;
case 3:r=p, g=q, b=v; break;
case 4:r=t, g=p, b=v; break;
case 5:r=v, g=p, b=q; break;
default:r=v, g=v, b=v;
}
}else{r=v;g=v;b=v;
}
var result = [r, g, b];
return result;
}
//-----------------------------------
AEのGUIでの表示がSVとも0-100%なので、頭で除算してあります。
それ以外はほとんどWEB上の参考文献のまま・・・

この関数に平面設定時のHSB情報を渡してやると、そのままの色のRGB(0-1)値に変換できるはずです。
後は、
”app.project.item( index).layers.addSolid(convHsvToRgb(h,s,v), name, width, height, pixelAspect, duration)”
とでもしてやれば一件落着?

何でこんなことをやっているかというと、アニメ撮影時、シーン毎に設定された色平面を自動処理的に作成したいからです。
これが出来ないと、夏の決戦を生き残れない予感・・・

付け焼刃の対応ですのであちこち綻びがあるかと思います。
上記の関数に関しても、何かお気づきの点あればご指摘下さい。

0 件のコメント:

コメントを投稿