2009年8月15日 星期六

(15)實作一個結冰的動態



最近在ptt上面發現一個很溫暖的地方→內湖版!
不只家在內湖,從幼稚園到高中,我都是在內湖度過的,覺得這是個生活機能好,有美麗環境,居民又熱心的地方~

所以就想在這篇的影片上,表示一下我對這可愛的地方的喜愛~

內湖Good!!

--------------------------------拉哩拉咂分隔線-----------------------------------

在RenderMan上是可以讓一張texture動態的出現,以下就小小的實作一下囉!(其實基本上,使用RenderMan可以做出很多動態的效果)

這裡要做出的效果是....一個金屬要結冰,但不是整顆同時結,而是從邊邊角角的部位開始漸層的往內擴散~

◎先準備一張像雪的texture~
下面那張是來自這個材質的好站:
http://www.davegh.com/blade/davegh.htm
站長是一個國外專業的繪製材質藝術家(但好像很久沒更新了)























◎在ImageFile裡使用那張texture,並將其接到一個type為float的Spline上,調整一下curve,使其白色的部份變的較為突出。





















◎在Delux裡,接上一個type為color的SLBox(這裡是接在v4上)。在這裡的作用是....在這個SLBox裡寫的code所產生的效果(結冰),可以動態的將Diffuse、Specular、Reflection...等,慢慢蓋掉。






















◎這裡就是上述那個SLBox的內容:
v2: [expr $time/5]->此為一個tcl語法,即v2的值為所經過的時間的五倍慢
v3: 連接一個float noise node
v4: 連接上面那個Spline node





















◎此為寫在SL code裡的code,小小的解說一下:
/*********************************************************************************/
//宣告兩個type為color的變數,其中finalColor為最後呈現的顏色
color C = 1;
color finalColor=0;

//pp來物件座標的點的值
point pp = transform("object", P);

/*hump為控制結冰的範圍的值,3.2和1.4為測試出來的值,3.2為pp到物件中心點的距離的上界。當v2(時間)為0時,也就是還沒開始結冰。當時間過越久,也就是v2的值越大,hump的值就越小,3.2-hump的值就越大;也就是說...結冰的範圍就越大*/
float hump = 3.20-1.4*(noise(10*s,10*t))*v2;
float rp;

/*當物件表面的點,到物件中心的距離(length(pp)),大於hump的話,就將其做結冰的效果,否則就不作用,維持原本物件表面的樣子*/
if(length(pp)>hump)
{
//用smootstep這個function做出漸層的效果
rp = 1.4*smoothstep(hump, 3.2, length(pp));
finalColor = v4*C*v3*rp;
}
else
{
finalColor = 0;
}


result = finalColor;

/******************************************************************************/

上面的影片中,還有加displacement,也是從這個SLBox node接出去做出來的囉~

沒有留言:

張貼留言