先說一點常識:
人體的重心和雙腿的數學關係,比如我們邁腿走100個單位,中心走多少?----50!
假設腿一為 pos1腿二pos2,中心的位置公式知道了嗎?----(pos1+pos2)/2
pos1和pos2是表明位置和方向的,所以我們稱之為“向量”。
表明重量、長度、或者任何沒有方向的量叫“標量”。比如半徑。
不管向量和標量,都可以在3ds max中隨便起名子,我們可以自由的定義他們,比如我可以叫他們pos1,可以叫foot1,但是不能用中文,即便是中文版也不行。
在max表達式中,加法和減法用“+ ”和“ - ”表示,乘法和除法分別用“ * ”和“ / ”表示
下邊開始我們的實例:
實例一,沿正弦曲線運動。
在頂視圖中建一個半徑為20的球。選擇球體,在“運動”麵板內的“指定控製器”展卷欄內選擇 位置:位置 XYZ行,並點擊“指定控製器”按鈕,在選擇控製器對話框中選擇“位置表達式”控製器,然後點擊“確定”按鈕。
這時會彈出位置“表達式控製器”的相應菜單。在此對話框的右上方有一個很大的對話窗口,在這個窗口中輸入如下的公式:[50*S,20*sin(720*S),0]然後按下對話框下方的“計算”按鈕進行計算。
播放一下看看是什麼效果?是一個正弦曲線!!在頂視圖打開運動軌跡,如下圖:
下麵我來解釋這個公式
方括號:方括號代表物體運動的三維矢量,在3ds max中凡是方括號裏麵都擁有3組數字,這三組數字可以敘述物體的空間位置,每組數字之間都用逗號隔開。
第一組數字:50*S,這組數字表明物體在X軸向上的運動,S(一定要注意“大寫”)是一個時間變量,它的數值變化與時間幀數成正比,每秒中包含的幀=1S。有了這樣的基本概念50*S這樣的一組數就說明隨著我們播放動畫S的數值就會越來越大,因此50*S的計算結果也會越來越大,物體在X軸上的運動距離也會越來越遠。其中50是比例數值,此數值越大距離越遠。
第一組代表x軸的數值,第二組是y ,第三組是z。
第二組數字:20*sin(720*S),這組數字表明物體在Y軸向上的運動。S的含義與剛才的解釋是一樣的。Sin是正弦函數,它可以繪製曲線和波浪線。720決定了“波”的數量,如果你將此數值變小就會看到運動中“波”的數量少了。20決定了“波”震蕩的範圍,增加或減少此數值可以使“波”的幅度變大或變小。
第三組數字:0,這組數字表明物體在Z軸向上的運動。0表明在Z軸的空間坐標為0。
如果你改了一下數值,要計算一下才能得到新的結果。徹底明白了嗎?
嗬嗬,對,也許你已經想到圓的參數方程,x=r* cosθ,y=r*sinθ。好,第二個例子。
第二個例子 圓形和橢圓運動
在公式對話框中輸入如下的公式:[50*cos(360*S),50*sin(360*S),0]然後按下對話框下方的 按鈕進行計算,如下圖所示:
這組公式中,50代表運動的半徑,改變此數值的大小會改變圓的大小。360表明一秒中內完成一次圓周運動,如果你把此數值改為720則表示一秒中內完成兩次圓周運動。如果你將其中的一組半徑值改為100,我們將得到橢圓運動。如下圖所示:
[50*cos(360*S)/S,50*sin(360*S)/S,0]然後按下對話框下方的“計算”按鈕進行計算。這樣我們將得到螺旋動畫。
公式比較長,我們可以在逗號後邊用回車換行
在這組公式中“/S”表明圓周運動的半徑將隨時間推移而縮小,因此我們得到的是螺旋動畫。由於初始時間S為0,除以一個接近0的數所得的結果很大,所以如果你覺得螺旋的起始位置需要調整的近一些可以修改公式為[50*cos(360*S)/(S+0.4),50*sin(360*S)/(S+0.4),0],這樣在開始時除數的數值就不是0而是0+0.4=0.4了。結果見下圖:
[page]
實例三 下麵我們要把曲線運動改為小球彈跳
1、在公式對話框中將原公式修改為[50*S,0,20*sin(720*S)]並計算,播放動畫,這是一個標準的sin曲線,我們覺得球運動的沒有彈性,軟綿綿的。
2、我們要修改它,在公式對話框中將原公式修改為[50*S,0,abs(20*sin(720*S))]並計算,播放動畫,這時我們發現小球的波形運動已經變為了彈跳運動。abs為“絕對值”函數,這種類型的函數可以將計算結果的負值變為正值,比如abs(-5)=5。
3、如果你想模擬彈跳越來越低的動畫可以將原公式修改為[50*S,0,abs(20*sin(720*S))/(S+0.3)]然後按下對話框下方的“計算”按鈕進行計算。播放動畫看看。怎麼樣?“咚。。。。咚。。。咚。。咚咚咚咚。。。。”。
實例四 把小球在兩個亂動的物體間跳來跳去
1、在3ds max中製作兩個方塊,然後讓他們隨便動畫,可以隨意做幾個關鍵幀。
2、再做一個小球。
我們這個個練習要把小球在兩個亂動的物體間跳來跳去。
選擇球體,在“運動”麵板內的“指定控製器”展卷欄內選擇位置:位置 XYZ行,並點擊“指定控製器”按鈕,在選擇控製器對話框中選擇“位置表達式”控製器,然後點擊“確定”按鈕。
左側有建立量值的對話框,可以建立標量和向量,在名稱欄內寫一個名字“pos1”
然後選擇“向量”,之後“建立”pos1這個向量。在下方的向量值列表中會出現名字“pos1”
選擇這個名字,然後指定給Box01方塊的 位置:位置 XYZ控製器。
再用同樣方法建立pos2,指定給Box02方塊的 位置:位置 XYZ控製器。
在公式對話框中輸入(1+sin(360*S))/2*(pos1-pos2)+pos2然後按下對話框下方的計算按鈕進行計算。這時我們發現小球可以自動完成彈跳運動。
這個式子為什麼能夠控製小球在兩個方盒間來回運動呢?我解析一下兩端的情況:當sin(360*S)為1時,(1+sin(360*S))/2=1,式子就成為 1*(pos1-pos2)+pos2=pos1,也就是說小球的位置為pos1,即Box01的位置。
當sin(360*S)為-1時,(1+sin(360*S))=0,也就是(1+sin(360*S))/2*(pos1-pos2)=0,所以小球的位置為pos2,即Box02上。
中間狀態自己想象咯….
[page]
實例五 自動滾動的圓球
製作球體的滾動動畫時,如果能夠根據球的移動距離而自動計算出球的旋轉角度將為我們的動畫製作提供很多方便,在這個例子中我們來嚐試解決這個問題。
1、做一個半徑為20的球體,在球體外麵建一個虛擬物體,將虛擬物體與球體對齊。然後用鏈接工具使球體成為虛擬體的子物體。
3、選擇球體,在 “運動”麵板內的“指定控製器”展卷欄內選擇 旋轉: Euler XYZ\X 旋轉: Bezier 浮點行,並點擊“指定控製器”按鈕,在選擇控製器對話框中選擇“浮點表達式控製器”,然後點擊“確定”按鈕。
注意:這裏隻選旋轉的Euler XYZ中的一個軸X,不選Y和Z軸。簡記作Euler XYX\X。
4、在表達式控製器的對話框左上方的名稱欄中輸入Radius並選擇下方的“標量”選項,然後點擊“建立”按鈕,這樣我們就定義了一個名稱為Radius的標量。做完這樣的操作,下方的“標量”欄中將會顯示Radius的字樣。選擇這個字樣後點擊下方的 按鈕,然後在彈出的對話框中設定標量值=20。這個數值是球體的半徑值。
5、在表達式控製器的對話框左上方的“名稱”欄中輸入Ymov並選擇下方的“向量”選項,然後點擊“建立”按鈕,這樣我們就定義了一個名稱為Ymov的“向量”。做完這樣的操作,下方的“向量”欄中將會顯示Ymov的字樣。選擇這個字樣後點擊下方的指定控製器按鈕,然後在彈出的控製器選擇對話框中選擇Dummy01的 位置:位置 XYZ 行。這樣就設定Ymov這個向量=Dummy01的位置。
6、在公式欄輸入如下的表達式:degToRad(360*(Ymov.y/(Radius*2*pi)))。在這個公式中degToRad是角度轉弧度的函數,Ymov.y表明這裏的數值使用Ymov這個矢量的Y軸數值。Radius是我們定義的標量,它的大小等於球的半徑。Pi=3.14159,是max內定義的常量。現在你可以拖動虛擬物體的Y軸進行移動,我們看到球自動的發生旋轉,但旋轉的方向反了,你可以在整個的公式前增加“-”號。最後的公式為:-degToRad(360*(Ymov.y/(Radius*2*pi)))。貼個棋盤格的位圖可以看得更清楚一些。
7、順便提一下:圓周長=2*pi*半徑。這樣做的滾動是非常真實的,比如在做汽車的輪子的滾動時可以采用此法。
實例六 if表達式的應用,這個表達式有免費視頻,但還是在此貼出來。
1、if判斷語句是表達式控製器的重要工具,它可以教會計算機識別不同的狀態從而地動設置動畫。在下麵的例子中我們將使用if判斷語句讓計算機分析攝影機與圓柱體的距離關係,使攝像機離圓柱體遠時圓柱體的片斷數自動減少,相反當攝像機離圓柱體近時圓柱體的片斷數自動增加。
2、建立一個圓柱體,然後建立一個目標點攝像機,目標點對準圓柱。
3、選擇“圓柱體”打開“曲線編輯器”圖表,在瀏覽器中選擇“高度分段”層級。
4、在“高度分段”層級上點擊右鍵選擇“指定控製器”命令。在新彈出的控製器選擇框中選擇“浮點表達式”控製器。
5、在表達式控製器的對話框左上方的“名稱”欄中輸入Maxsegs並選擇下方的“標量”選項,然後點擊“建立”按鈕,這樣我們就定義了一個名稱為Maxsegs的“標量”。做完這樣的操作,下方的“標量”欄中將會顯示Maxsegs的字樣。選擇這個字樣後點擊下方的按鈕,然後在彈出的對話框中輸入100。這樣就設定Maxsegs這個標量=100
6、用同樣的方法創建新的標量Height。設置Height=100。
7、在表達式控製器的對話框左上方的Name欄中輸入Camera並選擇下方的“向量”選項,然後點擊“建立”按鈕,這樣我們就定義了一個名稱為Camera的“向量”。做完這樣的操作,下方的“向量”欄中將會顯示Camera的字樣。選擇這個字樣後點擊下方的 按鈕,然後在彈出的控製器選擇對話框中選擇Camera01的“位置: 位置XYZ控製器”。這樣就設定Camera這個 向量= Camera01的位置。
8、用同樣的方法創建矢量Myself, 點擊下方的 按鈕,然後在彈出的控製器選擇對話框中選擇Cylinder01的“位置: 位置XYZ控製器”。這樣就設定Myself這個 向量= Cylinder01的位置。
9、在公式框中輸入:
if(length(Camera-Myself)>35,3 +(50*Height)/length(Camera-Myself),Maxsegs)
(由於這個公式比較長你可以在逗號後換行)然後按下對話框下方的 按鈕進行計算。現在你可以拖動攝像機的位置觀察圓柱體高度上的片斷數的變化。在此公式中if判斷由三段公式組成,其含義為當攝像機與圓柱的距離大於35時,圓柱體的片斷數按照第二組公式計算,當攝像機與圓柱的距離小於35時,圓柱體的片斷數為100。其中length是計算距離的函數。
OK That's all!
小結一下:
任何的函數後麵都要跟一組小括號,例如:abs()sin()cos()length()等,我們可以用函數列表FunctionList按鈕察看裏邊都有什麼函數,以及它們的用法:
裏邊有我們在該教程中使用的絕對值(Absolute Value)函數,常量(constant)e=2.71828…pi=3.1415…,e的x次方exp(x), ceil(x) 返回x的進一近似值整數,比如3.2返回4,floor(x)用去尾法返回x的近似值整數,比如5.7返回5。mod(x,y)返回x/y的餘數。noise(x,y,z)是一個3維噪波函數。pow(x,y) 返回x的y方,等等….
這隻是表達式動畫的一個入門,希望大家深入研究,掌握並能夠靈活使用這種省時省勁,效果尤佳的方法製作動畫。