主题:  MAYA expression教學

5D荣誉斑竹

职务:普通成员
等级:5
金币:10.0
发贴:1326
注册:2002/2/13 13:21:48
#12004/2/6 23:42:25
MAYA expression教學(一)-----如何使物體延一軸向來回運動?

1.讓物體以 expression的方式產生振幅

2.振幅的控制元素:振幅主體,頻率,時間變數,振幅幅度,修正振幅位置

3.設定物體名稱為P
P.translateZ= -((cos(time*頻率值))*振幅幅度) -(振幅位移值)

最前頭的負號是使物體先走正值再走負值
cos是產生振幅
time是隨著時間的增加而作為變數
頻率值愈小,頻率愈慢,反之愈快
振幅位移值能讓振幅在該軸產生偏移

MAYA expression教學(二)-----如何使expression中的參數能在面板控制?

1.先以add Attribute在P物體的面板中產生var,ho,hp
var是將要控制頻率值
ho是將要控制振幅幅度
hp是將要修正振幅偏移位置

2.在expression中,最前頭加上

$var=P.var;

$ho=P.ho;

$hp=P.hp;

這三行

3.最後就變成

$var=P.var;

$ho=P.ho;

$hp=P.hp;

P.translateZ=-((cos(time*$var))*$ho)-$hp;

4.接下來就能在面板中控制物體的運動了^_^



MAYA expression教學(三)-----如何產生自定面板控制參數

1.在script edit中,打出下列文字後執行

select P;

window -w 250 -h 200 -t "TEST01";

columnLayout;

attrFieldSliderGrp -l "var" -at P.var -min -10 -max 10;

attrFieldSliderGrp -l "ho" -at P.ho -min -10 -max 10;

attrFieldSliderGrp -l "hp" -at P.hp -min -10 -max 10;

showWindow;

好玩吧^_^

MAYA expression教學(四)-----以一個條件判斷if來控制物體

1.設定一個物體P

2.expression:

$h=-sin(time*20)+4;

P.translateY=$h;

3.Play後,我們可以看到物體P延著Y軸產生來回移動

4.將+4改成-4,物體P改成延著Y軸-4的地方產生來回移動

5.加上一個條件:if($h>=0)

$h=-sin(time*20)+4;

if($h>=0)

P.translateY=$h;

6.再試著改回+4 和-4看看結果,

當$h為正數時,P會在正向移動

當$h為負數時,P則不動

7. if 在這的作用是如果滿足條件,就會執行接下的動作,

若不符合,則不執行

當然若另有一個物體P1,並加於P.translateY=$h下方一行

如:

$h=-sin(time*20)+4;

if($h>=0)

P.translateY=$h;

P1.translateY+4=$h;

符合條件時if會同時執行下方有的控制式



MAYA expression教學(五)-----一個半月形的路徑



這路徑可拿來當腳跟的動態

1.設定一個物體P

2.這動態包含幾個控制項目:

(1)時間:也就是踩一個步伐需要多久時間
(2)腳步的踏實感
(3)腳跟抬起的高度
(4)腳步在地上時的位移量偏前或偏後
(5)步伐的大小

整個運動路徑我們假設在XY的平面上

會同時影響XY的項目是(1)

影響Y軸的項目是(2)(3)

影響X軸的項目是(4)(5)

再來就是利用if的判斷式讓物體運動在Y軸的質<0時,就靜止不動

3.因此我們可以歸納物體P的expression:

P的Y軸移動:

$rfh=P.high;

$run=P.run;

$var=P.walk;

$ty=sin(time*$var)+$run;

if($ty>=0)

P.translateY=($ty*$rfh)-1;

walk可以控制走路的快慢

run可以控制腳的踏實感

high可以控制腳起來的高度

P的X軸移動:

$var=P.walk;

$rff=P.freq;

$rf1=P.long;

$tz=cos(time*$var);

P.translateX=($tz*$rff)+$rf1;

Long可以控制腳落地偏前或偏後

Freq可以控制步伐的大小



MAYA expression教學(六)-----如何計算位移?

首先要先知道的是:

1.如何在不同的frame時,能求出物體的座標值?

2.有了座標值,如何求彼此的差?

3.範例1:在指定的frame求出物體的座標值

(1)建立任一物體P
(2)將P在frame0時,P.translateX=0
frame40時,P.translateX=任意一數值
(3)我們假設想要知道P在frame20時,X軸的值是多少,並將值在Script Edit中show出結果,

我們可以用以下的式子:

if(frame==20) {

$X=P.translateX;

print("time="+$X+"\n";

}

以上的意思是,如果frame在20,就去執行

{

$X=P.translateX;

print("time="+$X+"\n";

}

的命令,其中print是將字串"time="顯示出,接著X軸數值的顯示其後,"\n"是換下一行

4.範例2:在指定的兩個frame20和30,各求出物體的座標值

if(frame==20) {

$X=P.translateX;

print("time="+$X+"\n";

}

if(frame==30){

$X1=P.translateX;

print("time1="+$X1+"\n";

}

5.範例3:在frame40時,計算出frame20和30的X軸的差值

float $X, $X1;//宣告$X,$X1為浮點數



if(frame==20) {

$X=P.translateX;

print("time="+$X+"\n";

}

if(frame==30){

$X1=P.translateX;

print("time1="+$X1+"\n";

}

if(frame==40){

$X2=$X1-$X;

print("time2="+$X2+"\n";

}

如此就能知道物體在不同的時間時,物體的位移



5D荣誉斑竹

职务:普通成员
等级:5
金币:10.0
发贴:1326
注册:2002/2/13 13:21:48
#22004/2/6 23:47:26
MAYA Expression教學

 


--------------------------------------------------------------------------------


好一陣子沒有更新了.....^_^,站長這一次要向大家介紹maya有趣的expression教學,這是一個運用exporession來選寫程式亂數判斷中獎機率,讓使用者不需設keyframe,全由程式操控animation的吃角子老虎機


--------------------------------------------------------------------------------



再使用expression之前,先設定好場景內每個物體之間互動的關聯,首先將地板及機台設定為Passive Rigid Body屬性


--------------------------------------------------------------------------------



接下來設定五個銅板為Active Rigid Body屬性


--------------------------------------------------------------------------------



並將五個銅板設定接受重力(Gravity)的影響


--------------------------------------------------------------------------------



完成以上的關聯設定後即可開始進入Expression選寫轉輪及銅板之間程式判斷的部分


--------------------------------------------------------------------------------


--------------------------------------------------------------------------------

//定義三個整數變數$a用來記錄第一個轉輪的中獎結果//

int $a;

//$b用來記錄第2個轉輪的中獎結果//

int $b;

//$c用來記錄第3個轉輪的中獎結果//

int $c;

//------------------------------------------------------------------------------------------------------------------------//

當play到第0格時………將五個錢幣設定成不受重力影響

if(frame==0)

{

rigidBody1.active=0;

rigidBody2.active=0;

rigidBody3.active=0;

rigidBody4.active=0;

rigidBody5.active=0;

//並由電腦亂數決定三個轉輪的中獎結果//

$a=rand(1,4);

$b=rand(1,4);

$c=rand(1,4);

}

//------------------------------------------------------------------------------------------//

//當play在29格之前,轉輪1的旋轉皆由電腦亂數旋轉//

if( frame<29)

nurbsCylinder1.rotateX=rand(0,360);

//當play到30格時,轉輪1就中獎結果定位不動//

if( frame==30)

nurbsCylinder1.rotateX=90*$a;

//當play在39格之前,轉輪2的旋轉皆由電腦亂數旋轉//

if( frame<39)

nurbsCylinder2.rotateX=rand(0,360);

//當play到40格時,轉輪2就中獎結果定位不動//

if( frame==40)

nurbsCylinder2.rotateX=90*$b;

//當play在49格之前,轉輪3的旋轉皆由電腦亂數旋轉//

if( frame<49)

nurbsCylinder3.rotateX=rand(0,360);

//當play到50格時,轉輪3就中獎結果定位不動//

if( frame==50)

nurbsCylinder3.rotateX=90*$c;

//-------------------------------------------------------------------------------------//

//當play到第60格時……//

if( frame==60)

{

//判斷三個轉輪的中獎結果,如果三個轉輪的符號皆不相同時//

if( $a!=$b&& $b!=$c && $a!=$c )

{

//設定第5個錢幣受重力影響//

rigidBody1.active=0;

rigidBody2.active=0;

rigidBody3.active=0;

rigidBody4.active=0;

rigidBody5.active=1;

}

//判斷三個轉輪的中獎結果,如果三個轉輪的符號有兩個相同時//

if( $a==$b || $a==$c || $b==$c)

{

//設定第1,3,5錢幣受重力影響//

rigidBody1.active=1;

rigidBody2.active=0;

rigidBody5.active=1;

rigidBody4.active=0;

rigidBody3.active=1;

}

//判斷三個轉輪的中獎結果,如果三個轉輪的符號通通相同時//

if( $a==$b && $b==$c && $a==$c )

{

//設定第1,2,3,4,5錢幣受重力影響//

rigidBody1.active=1;

rigidBody2.active=1;

rigidBody3.active=1;

rigidBody4.active=1;

rigidBody5.active=1;

}




5D荣誉斑竹

职务:普通成员
等级:5
金币:10.0
发贴:1326
注册:2002/2/13 13:21:48
#32004/2/6 23:49:21