精簡可以被設置的關鍵幀數目,另外一個重要的的是精簡可以被設置為關鍵幀的屬性,計算機對每一個動畫曲線及其代表的屬性在每一幀進行計算,如果一個關節隻在 X軸旋轉那就沒必要去給移動,縮放屬性等設置關鍵幀。
使每個控製能夠容易被確定是幹什麼的,動畫製作者應該能夠很容易認出每個控製的用途。通過使用nurbs curves 來製作不同形狀的控製,能使我們輕易的認出每個控製是用來控製什麼的,這可以節省很多時間,See file: 2. variousAnimationCtrls.ma。
使用適當的rotation order。沒有什麼能比當一個動畫製作者準備旋轉什麼東西的時候,卻發現他沒辦法按設計的方向來旋轉物體更糟糕的了,這幾乎常常是由於rotation order沒有被正確設置而導致 ( gimbal lock).。幾乎沒辦法消除 gimbal lock,但可以在設置正確的rotation order來避免。
[page]
另一個讓人沮喪的事情,是打開場景後,無法確定哪個物體是幹什麼的,joint1, joint2,和 joint3 對製作者來說是什麼?你能看出來joint1, joint2, and joint3是上臂,胳膊和手腕關節麼?當然不能,正確的命名對下一個工序的製作者和你自己來說都是避免頭痛的一個好辦法。
保持場景整齊。你應該把每樣東西打成組,為每一類組件分類,不要把控製器和模型放在一起比較好,當作單一角色動畫還可以,但當幾個或者二十幾個角色在場景裏時,試者移動一個東西,你將不得不在Outliner 或者Hypergraph中幾百個結點中找你要的東西, 把所有東西歸進不同的組,去除對角色控製結構沒用的形狀,可見,設置等等一切東西。
II. 腿部控製
我們先來看看腳部控製,腳部控製基於通過把控製集中在一個地方來保持控製的簡單性。我們用ikHandles來代替關節來進行控製。
1.創建 ikHandles。首先建立IK,從臀部到腳踝,然後腳踝到腳掌,最後腳掌到腳尖。Load the file 3. legControl.ma.
從臀部到腳踝為ikRPsolver.Skeleton > Ik Handle Tool > Option Box,設置Current Solver 為 ikRPsolver,點 up_leg 到 foot to create the ikHandle.改ikHandle名字為 footIkHanlde。
操作如圖。
[page]
操作如圖。
選擇 Skeleton > Ik Handle Tool,腳踝到腳掌ikHandle,改名字為 ballIkHandle。Skeleton > Ik Handle Tool,腳掌到腳尖 ikHandle改名字為 toeIKHandle。
2. 創建腿部控製。為了控製腿部,我們要建立兩個控製,一個控製腿,一個控製膝蓋。最好的辦法是使用nurbs curves
Import 3a. footXform.ma,Import 3b. kneeXform.ma,移動 footCtrl 和kneeCtrl到如下圖的位置。
進入Attribute Editor 改變footCtr 的rotation order 為ZXY (如果它的默認參數不是這個的話)。
[page]
3. 建立腿部層級。下麵我們將所有的ikHandles 成組到不同的層級。因為腿部需要腳跟和腳掌支撐腿部本身的能力(在腳掌處控製重心平衡),我們需要建立三個運動來進行控製。兩個在腳掌一個在腳尖。最簡單的辦法就是複製 footCtrl 然後刪除這個結點下的shape。這樣可以保留主控製的方向。注:通過使用這個mel ( jscopyControl.), 可以迅速完成這一操作。選擇 footCtrl 並複製,按向下鍵來選擇footCtrlShape。刪除 footCtrlShape。改名字為 ballLift。複製 ballLift 改名字toeLift。
操作如圖。
操作如圖。
操作如圖。
[page]
操作如圖。
操作如圖。
操作如圖。
現在把這些結點放到正確的位置,我們需要把他們放進一個正確的層級。由於ballLIft 和toeWiggle控製將同時被toeLift影響(如果用腳尖走路,腳掌…),它們同時成為toeLift結點的子物體。
FootCtrl is是腳部動作的主控製,所以toeLift是它的子結點,設toeLift 為footCtrl的子物體。
[page]
4. Parent IkHandles。現在的層級結構比較合理,我們需要把Ik Handles 放在正確的結點下麵。ballLift 需要把腳踝從地麵上提起,所以把footIkHandle和ballIkHandle設為ballLift 的子結點。
5. 連接腳部層級到主控製。雖然你可以控製目前的這些接點來做腳部動作,但一個一個選擇並操作會很累,最好的辦法是給foot結點自己建立一係列屬性,並連接到下麵層級中不同的旋轉控製上,選擇footCtrl 並給其添加控製屬性,Modify > Add Attributes。
增加5個屬性(ballLift, toeWiggle, toeLift, toeTwist, footLean).
設置Make Attribute Keyable 為 On
設置 Data Type 為 Float
設置 Attribute Name 為 ballLift
點擊 Add
設置 Attribute Name 為 toeWiggle
點擊Add
設置 Attribute Name 為 toeLift
點擊 Add
設置 Attribute Name 為 toeTwist
點擊 Add
設置 Attribute Name 為 footLean
點擊 Add
屬性增加好了以後,我們用Connection Editor來連接它們。Window > General Editors > Connection Editor,選擇 footCtrl,然後點擊Reload Left,選擇 ballLift然後點擊 Reload Right,連接 footCtrl.ballLift 到 ballLift.rotateX,選擇 toeLift 然後點擊 Reload Right,連接 footCtrl.toeLift 到 toeLift.rotateX,連接 footCtrl.toeTwist 到 toeLift.rotateY,選擇 toeWiggle然後點擊 Reload Right。連接 footCtrl.toeWiggle 到 toeWiggle.rotateX,連接 footCtrl.footLean 到ballLift.rotateZ。
6. 增加膝蓋控製。現在我們使用極約束( poleVectorConstraint)來建立膝蓋控製。這可以讓我們將腿部IK對準 kneeCtrl 結點。它將控製膝蓋一直對準 kneeCtrl,使得做動畫我們能有更好的控製。選擇 kneeCtrl and footIkHandle,Constrain > Pole Vector Constraint。
[page]
另外一個選擇, 限製膝蓋隻繼承TRANSLATION和ROTATE Y,當設置膝蓋為腳部控製的子結點時有很大的彈性, 當腳部沿Z 或 X 軸旋轉時膝蓋控製經常會動。當把膝蓋的動作限製到隻有腳部移動和旋轉,起影響作用的時候會更穩定,解除 kneeCtrl 和 footCtrl的父子關係。複製 footCtrl 然後刪除所有子結點,改名字為 kneeGrp。
Point constrain(建立點約束) kneeGrp 到 footCtrl,選擇 footCtrl 和 kneeGrp,選擇 Constrain > Point,設 kneeCtrl 為 kneeGrp子物體。
設置如圖。
設置如圖。
[page]
現在我們旋轉腳部,可以看到膝蓋不亂動了。
7. 刪除多餘的屬性並清理。設置foot control 的最後一步是刪除多餘的屬性並隱藏ikHandles。打開Channel Control, 設置footCtrl 的scale and visibility屬性為unkeyable and locked。隱藏toeLift並鎖定visibility,translation,和scale。
設置完畢的foot control,一個很幹淨的場景易於使用這些控製。
腿的這部分結束了,後麵是上半身的控製,應用到了約束。
III. 獨立的動作
獨立動作的概念是指在每個控製除了彼此必然影響的地方,其他運動屬性保持獨立。一個很好的例子就是角色的眼球,我們都知道眼球是頭部的子物體,並且無論頭怎麼運動都會跟隨著,當你把頭轉向一邊,你的眼也會跟隨到那一邊。可是,我們也可以將眼睛鎖定到一個特殊的目標。而且他們會有獨立於頭部的動作。(當然眼球仍然隨頭部移動,但它們的旋轉卻是單獨的)如果我們裝配模型不考慮到這些功能 (移動頭部但眼睛卻盯著一個地方),那麼每次我們做一個頭部轉動的動畫時將不得不為眼球再設置一次動畫,轉一下頭,轉一下眼睛,再轉一下頭,再轉一下眼睛…增加無數的工作量,直到讓人瘋掉為止。因此獨立動作對身體上有很多部分是很有用的, 例如:眼睛、頭部、向前動力學控製的胳膊。在maya中有不同的技術可以在裝配骨骼時實現獨立動作。
頭部的獨立動作。如果我們將狒狒的頭部運動獨立於軀幹那麼頭部的做動畫時會更容易。
1. 頭部和脖子的控製準備。打開場景.solateHeadMotion.ma。
[page]
把頭部和脖子控製放置在容易選取的位置,有個容易的方法,將neck control設定為neck joint的子物體,然後將移動和旋轉屬性歸0,解除父子關係。
2. 建立脖子的約束。複製 neckjoint 然後刪除下麵的子物體。改名字為 neckConst。選擇 necktConst 和 neck並且建立一個 orientConstraint。最後neckConst 設為 neck_ctrl 子物體然後隱藏。注意:圖中複製後的 neck joint,子物體全部刪除掉了。
改名字為 neckConst。
方向約束,如圖。
neckConst設為neckctrl的子物體並隱藏。
[page]
3.成將neck_ctrl自成一組。
選擇 neck_ctrl,捕捉到 neck joint。
將組改名為neckControlGrp,設 neckControlGrp 為 torsoctr子物體。
4.為頭部建立Constraints。重複脖子的那一套操作,複製 headJoint 刪除下麵的子物體,改名字為 headJointConst,
選擇headJointConst 和 headJoint 創建orientConstraint,設head_const 為 head_ctrl 子物體並隱藏。
[page]
5. 將headControl 成組。選擇 head_ctrl,CTRL-G 為自己成一個組。捕捉到headjoint,改名為 headControlGrp。
注意:這裏我們沒有設 headControlGrp為 neck的子物體,我們將建立另外一個結點,並且pointConstrain headControlGrp 到新建的結點上,然後在設為Neck的子物體,這樣headControl 將隨脖子移動但有自己獨立旋轉。
6. Constrain headControlGrp (約束頭部控製組)。選擇headControlGrp,複製 headControlGrp,並且刪除所有子物體。
將複製出來的 headControlGrp1 改名字為headControlGrpConst,選擇 headControlGrpConst 和 headControlGrp 建立一個pointConstraint,Constraints > Point。
設headControlGrpConst 為neck子物體。
[page]
現在當你旋轉身體,你會注意到脖子隨著旋轉但頭沒有。非常重要的一點rotation order是正確的,另外gimbal lock的情況不會出現。(注意下圖:猴子身體旋轉了,但頭部朝向不變。)