2011年1月11日 星期二

[Dynamic] Maya 精靈貼圖 之 小黃快跑 (誤)

這裡的序列圖檔,是用吳崇瑋老師的小黃人跑步,用sideview直接設定好,batch render出來的圖,當然要帶alpha,是Tif檔案。
序列圖下載:小黃快跑序列圖下載-freakshare空間
密碼:吳老師的新書請多捧場

偷偷幫老師打書,但還沒出版啦XD還在寫 哈!
為啥要用老師的檔案,因為我懶得調整...大家有序列圖檔可以自行使用。

[Step01]首先,建立一個Nurbs平面,增加分段數。

[Step02]接著用Sculpt工具來修改一下這個平面;或是使用Sculpt的Attribute map工具,import一張貼圖來形成地形。下方import value顧名思義,就是取這匯入圖片的某個通道來作為地形參考。


[Step03]修改好之後,建立Emitter。修改總格數與粒子類型,類型改為Sprite,並給予粒子一個新的Lambert材質。

[Step04]Lambert2材質的color通道給予一個file檔案貼圖,選到第一張序列圖檔,下方勾選使用序列圖Use Image Sequence。這時候按6出現小黃人跑步了。

[Step05]每個小黃人跑步動作都一樣,因為序列圖只有17張,跑一跑就停了。把Use Image Sequence下方的Interactive Sequence Caching Option打開,勾選Use Interactive Sequence Caching,輸入Sequence Start與End的Frame格數,本例中是0與16(我也是照著教學做的啦...)。播放後,發現全都是第一張,這是因為粒子Sprite屬性中,SpriteNum統一是1(第一格)的關係。

[Step06]打開particle屬性欄,增加SpriteNum。在PPAttribute中,SpriteNumPP後方,右鍵Create Expression。在Selected Object and Attribute欄位中(此時應該是顯示SpriteNumPP完整名稱)反白,用滑鼠中鍵拖曳到下方的Expression。如果嫌Expression欄位太小,如同使用Chrome瀏覽器一樣,按住Ctrl再滾動滾輪,就可以對內容大小進行縮放。下方輸入:
particleShape1.spriteNumPP = rand (0,16);
如此一來,每個粒子的SpriteNum在粒子生成的時候便會亂數決定,而形成起始影格不同的效果。按下Create建立。

[Step07]此時圖片還不會動,因此要再進入Expression Editor中,將Particle選為Runtime before dynamics。下方輸入:
particleShape1.spriteNumPP += 1;
particleShape1.spriteNumPP=particleShape1.spriteNumPP%17;

A+=B,意思就是A=A+B的意思,簡寫為A+=B。而第二行%17則是指spriteNumPP除以17之後取餘數。因此SpriteNumPP除以17於下來的數字就會是0~16。

我想這裡第一行particleShape1.spriteNumPP += 1;表示第1格的時候,spriteNumPP數字如果是5,在往下一格的時候,會+1,此值就存放到spriteNumPP裡面,也就是說,第2格spriteNumPP變成6;然後,這個值除以17的餘數,還是6,所以這時候SpriteNumPP就是6,就顯示第6張序列圖。

[Step08]此時播放,就會每個小人相同動作但是不同的時間點在跑步。選到粒子,Shift加選地面,執行Goal。將粒子的Channel Box中的Goal Weight改為1,讓粒子直接吸附。

[Step09]PPAttribute中加入Goal U與Goal V。下方輸入:
particleShape1.goalU=rand(0,1);
讓粒子出現的時候在U方向隨機產生。仔細看,這貼圖在地面中間,因此還需要添加Goal offset這個屬性。

[Step10]在Goal V上create ramp,編輯Ramp,將中間灰色去掉。這時候撥放發現小人會跑了。但這時跑得非常快,這是因為粒子的生命值要做調整。將Life壽命設定為lifespanPP only,然後在PPAttribute下,lifespanPP建立一個表達式如下:
particleShape1.lifespanPP = rand (6,8);
如此粒子產生時,壽命便會亂數決定是6 7或8,就可以控制粒子跑的速度快慢。

[Step11]添加ScaleXPP與ScaleYPP,修改每個粒子的大小。建立表達式:
particleShape1.spriteScaleXPP = rand(0.8,1.2);
particleShape1.spriteScaleYPP = rand(0.8,1.2);
這樣每個粒子的高矮胖瘦就會出現。

[Step12]調整粒子的位置,在goalOffset上建立表達式。由於位置是向量,因此輸入
particleShape1.goalOffset=<<0,1,0>>;
但這樣+Y方向偏移1個單位,會發現離開平面了。因此要把spriteScaleYPP這個變數帶入1的位置,修改為:
particleShape1.goalOffset=<<0,spriteScaleYPP*0.5,0>>;
乘以高度的一半,如此粒子就會在地面上跑動了。

[Step13]增加顏色,選擇PP類型。在rgbPP上建立ramp,進入ramp option。可以看到裡面有三個下拉功能表,InputU是None,InputV是Particle's Age,只有在V方向起作用,將Input V改成rgbVPP,建立。

[Step14]此時小黃人全變成紅色。在PPAttr下的rgbVPP,建立表達式:
particleShape1.rgbVPP = rand(0,1);
這時候播放,會發現基本色就在R G B三個顏色上跑。這是因為rgbPP建立的Ramp主要三個顏色就是這三個顏色。

[Step15]除了修改ramp顏色之外,另一個方法:把rgbPP上的ramp break掉,建立表達式:
particleShape1.rgbPP=rand(<<0,0,0>>,<<1,1,1>>);
這個意思是,亂數在<<0,0,0>>(黑色)與<<1,1,1>>(白色)之間取色,所以顏色會變成五顏六色。



Creation類別的表達式:

Runtime before Dynamics類別的表達式:


最後這兩張是取某個角度算圖(要用硬體算圖或是mentalray算圖。)
有Alpha的喔!

[Step16]地形起伏,圖片應該要跟著地形有所傾斜,因此在運行表達式中
float $angle = angle(<<0,1,0>>,worldVelocity);  //找出粒子與平面之間的夾角,<<>>中是粒子起伏高低的變化,所以只有Y有值;與worldVelocity找出弧度值。
particleShape1.spriteTwistPP = rad_to_deg($angle)-90;//將弧度rad轉成角度deg。


這樣就看到有配合高低起伏囉!

沒有留言:

張貼留言