Maya特效教程
Maya特效教程:Maya用particle的instancer模擬帆船
編輯:Penny來源:發(fā)布時間:2010-06-28
1、1instancer 基礎(chǔ)
要使用instancer必須先要準(zhǔn)備好要替換的物體。這個物體需要朝向正確的方向,位移值,軸心點等必須歸零,縮放值為1。這樣做以后就不會發(fā)生不必要的麻煩,產(chǎn)生的結(jié)果才能和你預(yù)想的一樣。
maya的particle instancer功能是將要替換的物體固定在每個粒子上,這個物體并不是復(fù)制到每個粒子上的,而是用這個物體的外形替代了每個粒,所以稱做“instance”。instancer并不會在場景中增加幾何體。
1.2 軸心和方向
如果你在用instancer的時候出現(xiàn)問題了,首先檢查:
1 >.物體的軸心是不是處于原始的軸心上。
2 >.軸向有沒有與世界坐標(biāo)的軸向?qū)R。
3 >.物體的前進(jìn)方向是否對準(zhǔn)X軸。
4 >.物體的transform值是否歸0。
如果沒有歸零,將方向,位置調(diào)整好,然后freeze transform。
1.3 帆船的例子
這個例子是一只帆船漂動在一個被wave變形的nurbs平面上,粒子被指定了一個簡單的表達(dá)式,讓它們沿著U方向前進(jìn)。
1)打開1_1instance_sailboat_base.mb這個場景文件。在這個文件里,實際上只有一只船,這么多的船其實都是粒子,使用instancer做的。船跟著粒子而動,那么我們怎么對準(zhǔn)他們前進(jìn)的方向呢?有兩種方法:
1 >.使用maya instancer的aimDirection 或者aimPosition功能.
2 >.使用每個粒子的運行表達(dá)式,改變每個粒子的速度向量從而改變粒子的旋轉(zhuǎn)值。我來提供一個 vector2rot.mel 的腳本,用這個腳本可以幫助我們完成這項操作。讓我們用第一種方法來調(diào)整船的方向。
1.選擇這個粒子節(jié)點(boats_PTL),打開屬性編輯器。
2.增加一個per-particle的float屬性,名稱為rotationTypePP.在粒子的創(chuàng)建編輯器中輸入rotationTypePP=1。
3.在粒子屬性中找到instancer欄。點擊RotationType 旁邊的列給框,選擇rotationTypePP。
4.這個屬性將指定instancer物體的旋轉(zhuǎn)方式(有三種,可以選擇其中的一種)。
.0(rotation)。如果選擇這個表示你想直接控制instance的旋轉(zhuǎn),如果不用表達(dá)式,那么將很難控制他,但是這個選項將會提供給你更多的控制權(quán)。
.1(aimDirection)。maya將使用一個已經(jīng)提供的向量,如果你希望粒子指向他們的worldVelocity那么就選這個。
.2(aimPosition)。使用這個選項,你可以使你的粒子指向一個特定的點。這個使用起來可能會很困難,但是它有很強(qiáng)的可控性。
你可以讓不同的粒子有不同的旋轉(zhuǎn)方式,讓我們先用aimDirection這種方式來完成我們的實例。
5.單擊aimDirection旁邊的列給框,選擇worldVelocity.重新播放場景,你可以發(fā)現(xiàn),船身都是側(cè)著向前的,這是因為船頭沒有指向X軸。在outline中找到sailboat_PLY,現(xiàn)在是隱藏的,將它顯示出來,掉轉(zhuǎn)船頭向X方向,然后freeze transform.重新播放看看不同了吧。
1.4更深入的一個實例。
我們打開下一個場景,這是一個更復(fù)雜的帆船場景。
播放場景你會發(fā)現(xiàn)一部分船看起來好像不怎么正確.我們將使用pointOnSurface 這個Mel命令來得到表面法線的數(shù)據(jù),然后使用這個向量來做為船朝上的方向。
1.打開1_2instance_sailboat_base.mb這個文件。
2.將rotationTypePP值改為0.(在創(chuàng)建編輯器中改成rotationTypePP=0;).
3.在粒子屬性的instancer一欄中設(shè)置rotation為rotationPP(如果沒有這個屬性就自己填加上)。設(shè)置aimdirection為none.
4.我們現(xiàn)在需要修改粒子的rotation屬性,我們將創(chuàng)建一些表達(dá)式在運行表達(dá)式中。首先我們需要獲取粒子的velocity,這樣我們就可以得到他的方向了。我們用unit這個函數(shù)。
//capture velocity
vector $vel=unit(worldVelocity); 5.然后使用每個粒子的goalU和goalV屬性,我們將用命令查詢wave_surface_NRB's曲面的法線,它將提供給我們一個朝上的向量。
//determine normal vector
float $normalF[]=`pointOnSurface -u (goalU) -v (goalV) -normalizedNormal wave_surface_NRB`;
vector $normal= <<$normalF[0],$normalF[1],$normalF[2]>>; 6.我們可以修改表面的法線來傾斜船,用來模擬風(fēng)的效果。我們將使用expr_NUL.lean屬性(在outline里可以找到expr_NUL,好像是建的一個空組)
//lean boat depending on its speed
float $lean=smoothstep(10,40,mag(velocity))*expr_NUL.lean; 7.確保$vel值為正。
//if the boat X-position is decreasing,the boat leans the other way
if($vel.x <0)$lean*=-1; 8.修改法線的值。
//modify normal variable
$normal+= <<0,0,$lean>>; 現(xiàn)在我們使用一個mel腳本來將我們剛才得到的兩個向量轉(zhuǎn)化為粒子的旋轉(zhuǎn)值。
9.maya的instancer有一個小小的bug,那就是不能直接用一個簡單的角度值賦予它的旋轉(zhuǎn)值。必須將這個值轉(zhuǎn)化為弧度,并且得轉(zhuǎn)兩次。否則你將得到一個非常大的旋轉(zhuǎn)值。
float $rotX=deg_to_rad(deg_to_rad($rot[0]));
float $rotY=deg_to_rad(deg_to_rad($rot[1]));
float $rotZ=deg_to_rad(deg_to_rad($rot[2])); 10.將這個值指定給rotationPP。
//finally,assign rotation values
rotationPP= <<$rotX,$rotY,$rotZ>>; 本一節(jié)教程就完了。
接上一節(jié)教程。
1.5避免碰撞
1.打開1_3_instance_sailboat_base.mb
2.選擇粒子節(jié)點boats_PTL.
3.找到菜單fields.
4.創(chuàng)建一個radial場,并設(shè)置屬性值。
magnitude=1
attenuation=2
maxdistance=40
aplypervertex=on
useMaxDistance=on
radiaType=0 5.我們要讓每個粒子都成為一個radial場的發(fā)射源。先選擇radial場,再選擇boats_PTL,然后選擇菜單,fields >use selected as Source of Field.然后設(shè)置radial場的applyPverVertex值為on。因為粒子的goalPP屬性設(shè)置的是1,所以radial場的效果沒有表現(xiàn)出來。
6.選擇粒子,打開hypergraph,單擊input and output connections按鈕。
可以看到radial場有個屬性輸出給了粒子。
7.選擇boats_PTL然后添加一個float屬性,名稱為proximityPP我們將用這個屬性儲存粒子受到了多大的力量。
8.打開粒子進(jìn)行替代。
要使用instancer必須先要準(zhǔn)備好要替換的物體。這個物體需要朝向正確的方向,位移值,軸心點等必須歸零,縮放值為1。這樣做以后就不會發(fā)生不必要的麻煩,產(chǎn)生的結(jié)果才能和你預(yù)想的一樣。
maya的particle instancer功能是將要替換的物體固定在每個粒子上,這個物體并不是復(fù)制到每個粒子上的,而是用這個物體的外形替代了每個粒,所以稱做“instance”。instancer并不會在場景中增加幾何體。
1.2 軸心和方向
如果你在用instancer的時候出現(xiàn)問題了,首先檢查:
1 >.物體的軸心是不是處于原始的軸心上。
2 >.軸向有沒有與世界坐標(biāo)的軸向?qū)R。
3 >.物體的前進(jìn)方向是否對準(zhǔn)X軸。
4 >.物體的transform值是否歸0。
如果沒有歸零,將方向,位置調(diào)整好,然后freeze transform。
1.3 帆船的例子
這個例子是一只帆船漂動在一個被wave變形的nurbs平面上,粒子被指定了一個簡單的表達(dá)式,讓它們沿著U方向前進(jìn)。
1)打開1_1instance_sailboat_base.mb這個場景文件。在這個文件里,實際上只有一只船,這么多的船其實都是粒子,使用instancer做的。船跟著粒子而動,那么我們怎么對準(zhǔn)他們前進(jìn)的方向呢?有兩種方法:
1 >.使用maya instancer的aimDirection 或者aimPosition功能.
2 >.使用每個粒子的運行表達(dá)式,改變每個粒子的速度向量從而改變粒子的旋轉(zhuǎn)值。我來提供一個 vector2rot.mel 的腳本,用這個腳本可以幫助我們完成這項操作。讓我們用第一種方法來調(diào)整船的方向。
1.選擇這個粒子節(jié)點(boats_PTL),打開屬性編輯器。
2.增加一個per-particle的float屬性,名稱為rotationTypePP.在粒子的創(chuàng)建編輯器中輸入rotationTypePP=1。
3.在粒子屬性中找到instancer欄。點擊RotationType 旁邊的列給框,選擇rotationTypePP。
4.這個屬性將指定instancer物體的旋轉(zhuǎn)方式(有三種,可以選擇其中的一種)。
.0(rotation)。如果選擇這個表示你想直接控制instance的旋轉(zhuǎn),如果不用表達(dá)式,那么將很難控制他,但是這個選項將會提供給你更多的控制權(quán)。
.1(aimDirection)。maya將使用一個已經(jīng)提供的向量,如果你希望粒子指向他們的worldVelocity那么就選這個。
.2(aimPosition)。使用這個選項,你可以使你的粒子指向一個特定的點。這個使用起來可能會很困難,但是它有很強(qiáng)的可控性。
你可以讓不同的粒子有不同的旋轉(zhuǎn)方式,讓我們先用aimDirection這種方式來完成我們的實例。
5.單擊aimDirection旁邊的列給框,選擇worldVelocity.重新播放場景,你可以發(fā)現(xiàn),船身都是側(cè)著向前的,這是因為船頭沒有指向X軸。在outline中找到sailboat_PLY,現(xiàn)在是隱藏的,將它顯示出來,掉轉(zhuǎn)船頭向X方向,然后freeze transform.重新播放看看不同了吧。
1.4更深入的一個實例。
我們打開下一個場景,這是一個更復(fù)雜的帆船場景。
播放場景你會發(fā)現(xiàn)一部分船看起來好像不怎么正確.我們將使用pointOnSurface 這個Mel命令來得到表面法線的數(shù)據(jù),然后使用這個向量來做為船朝上的方向。
1.打開1_2instance_sailboat_base.mb這個文件。
2.將rotationTypePP值改為0.(在創(chuàng)建編輯器中改成rotationTypePP=0;).
3.在粒子屬性的instancer一欄中設(shè)置rotation為rotationPP(如果沒有這個屬性就自己填加上)。設(shè)置aimdirection為none.
4.我們現(xiàn)在需要修改粒子的rotation屬性,我們將創(chuàng)建一些表達(dá)式在運行表達(dá)式中。首先我們需要獲取粒子的velocity,這樣我們就可以得到他的方向了。我們用unit這個函數(shù)。
//capture velocity
vector $vel=unit(worldVelocity); 5.然后使用每個粒子的goalU和goalV屬性,我們將用命令查詢wave_surface_NRB's曲面的法線,它將提供給我們一個朝上的向量。
//determine normal vector
float $normalF[]=`pointOnSurface -u (goalU) -v (goalV) -normalizedNormal wave_surface_NRB`;
vector $normal= <<$normalF[0],$normalF[1],$normalF[2]>>; 6.我們可以修改表面的法線來傾斜船,用來模擬風(fēng)的效果。我們將使用expr_NUL.lean屬性(在outline里可以找到expr_NUL,好像是建的一個空組)
//lean boat depending on its speed
float $lean=smoothstep(10,40,mag(velocity))*expr_NUL.lean; 7.確保$vel值為正。
//if the boat X-position is decreasing,the boat leans the other way
if($vel.x <0)$lean*=-1; 8.修改法線的值。
//modify normal variable
$normal+= <<0,0,$lean>>; 現(xiàn)在我們使用一個mel腳本來將我們剛才得到的兩個向量轉(zhuǎn)化為粒子的旋轉(zhuǎn)值。
9.maya的instancer有一個小小的bug,那就是不能直接用一個簡單的角度值賦予它的旋轉(zhuǎn)值。必須將這個值轉(zhuǎn)化為弧度,并且得轉(zhuǎn)兩次。否則你將得到一個非常大的旋轉(zhuǎn)值。
float $rotX=deg_to_rad(deg_to_rad($rot[0]));
float $rotY=deg_to_rad(deg_to_rad($rot[1]));
float $rotZ=deg_to_rad(deg_to_rad($rot[2])); 10.將這個值指定給rotationPP。
//finally,assign rotation values
rotationPP= <<$rotX,$rotY,$rotZ>>; 本一節(jié)教程就完了。
接上一節(jié)教程。
1.5避免碰撞
1.打開1_3_instance_sailboat_base.mb
2.選擇粒子節(jié)點boats_PTL.
3.找到菜單fields.
4.創(chuàng)建一個radial場,并設(shè)置屬性值。
magnitude=1
attenuation=2
maxdistance=40
aplypervertex=on
useMaxDistance=on
radiaType=0 5.我們要讓每個粒子都成為一個radial場的發(fā)射源。先選擇radial場,再選擇boats_PTL,然后選擇菜單,fields >use selected as Source of Field.然后設(shè)置radial場的applyPverVertex值為on。因為粒子的goalPP屬性設(shè)置的是1,所以radial場的效果沒有表現(xiàn)出來。
6.選擇粒子,打開hypergraph,單擊input and output connections按鈕。
可以看到radial場有個屬性輸出給了粒子。
7.選擇boats_PTL然后添加一個float屬性,名稱為proximityPP我們將用這個屬性儲存粒子受到了多大的力量。
8.打開粒子進(jìn)行替代。