文章來源 http://www.cg-discovery.com/article.asp?id=41
可視化Ocean Shader
在MAYA中,Ocean Shader內置了Displacement、波浪等效果。即使把Ocean Shader賦予一個純平面,一樣可以表現海洋的波瀾起伏的效果。要在視圖中直接預覽Ocean Shader,MAYA提供了預覽平面(Preview Plane)。這裡的Preview Plane是使用高場節點(Height Field)生成的。但由於Height Field的局限性,這裡的Preview Plane不是一般意義上的模型,無法與NURBS模型作相交運算。
我們可以使用ColorAtPoint命令把Ocean Shader可視化,得到波瀾起伏的NURBS海洋表面。這個MEL的實用性很強,最經典的用途是NURBS海洋表面可以與海洋上漂浮、游動的NURBS 模型求交,得到相交的輪廓線。例如海洋上輪船在疾馳,輪船四周要濺出浪花。如果得到NURBS海洋表面,則可以與輪船模型(NURBS模型)求交,得到輪廓線。這樣再在輪廓線上建立離子發射器,發射離子,即可得到輪船四周浪花飛濺的效果。遠鏡頭不用這麼麻煩,但給輪船近鏡頭或者船身特寫時,要製作浪花就用上這個MEL了。當然,在MAYA裡,我們還可以把流體轉換為多變形,不過這樣的轉換對靜幀還可以,但對動畫來說用途不大。但我們的這個MEL則適用於動畫。
這個MEL的核心命令是ColorAtPoint。其原理是提取NURBS表面上點的X和Z坐標,然後使用ColorAtPoint 命令將相應點的Ocean Shader的Alpha值提取出來,傳遞給NURBS表面,作為對應點的Y坐標。這樣就使用NURBS表面表現出了海洋,如圖
該MEL代碼如下
//////////////////////////////////////////////////////////////
//Create by hmaya
//Date: 2005.10
//第一步:新建場景
//第二步:在Hypershade中創建一個Oceanshader,默認名稱為Oceanshader1,不要再改了.
//第三步:再創建一個NURBS平面,修改其名稱為model,注意修改其大小和UV段數.
//第四步:在Script Editor中輸入如下代碼執行即可。
//第五步:要得到動態的NURBS海洋,可以在Hypershade中選擇Oceanshader1,
//然後執行Window | Animation Editors | Expression Editor,
//為Oceanshader1添加下面的代碼執行即可。
//////////////////////////////////////////////////////////////
for ($i=0;$i<169;$i++)
//設NURBS平面的UV段數是10*10,則共有13*13=169個CV
{
float $pos[]=`xform -q -ws -t model.controlPoints[$i]`;
//得到NURBS平面的坐標
float $pos_ocean[]=`colorAtPoint -o A -u $pos[0] -v $pos[2] oceanShader1`;
//獲取Oceanshader的Alpha值
string $YY="modelShape.controlPoints["+$i+"].yValue"; setAttr $YY $pos_ocean[0];
// 將Oceanshader的Alpha值傳遞為NURBS平面上對應點的Y坐標
}
添加MEL表達式後的Ocean Shader節點網絡如圖
沒有留言:
張貼留言