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