這種效果用MEL應該很容易做的,但目前為止俺還不會寫mel程序,所以想了一下這個效果如何做。就是車輪前進時自身會跟著一起滾動一定角度的,這裏要做的就是不用MEL而用節點來完成這樣的工作。第一步先創建一個物體,這裏用的是一個比較簡單的NURBS做的車輪。有一點要說明,那就是模型的局部坐標一定要放置在模型的中心,這很重要,因為我們要做的就是利用模型的移動距離來計算出它的轉動角度。
這裏是場景文件,下載後用MAYA打開,場景中有一個NURBS模型,名稱是Che.或者隨便創建一個有點像車輪的模型。
看看這張圖,我們來想想如何根據移動的距離計算出它應該轉動的角度,都是數學知識就不多說了。
[page]打開節點窗口,單擊window->hypergraph,如圖
或者把麵板布局成這樣的:然後在hypershader中創建一個乘除節點
[page]創建乘除節點
並且重命名為zhouchang,ctrl+a打開屬性編輯,設置參數為下圖,注意圖中的input2是模型的直徑,這裏是用長度標注得到的數據,可以根據具體的場景來更改,Operation模式(Multiply)。
[page]
然後,再新建一個乘除節點。重命名為X,然後鼠標中鍵按住模型(這裏名稱是Che)不放,拖動到乘除這裏名稱為X的節點上釋放,在彈出的菜單中選擇other
在隨後的連接窗口中把左邊窗口(che)的Translate屬性下的Translate x和右邊窗口(X)下的Input1下的Input1 x連接,方法就是單擊左邊的Translate x,然後單擊右邊的Input1 x。隨後設置X的Operation模式為Divide,這裏有三個選項,第一個是乘模式,第二個Divide是除模式,第三個是求冪。都是以input1為第一個參數,然後按照指定的運算模式運算Iupt2。
[page]
接下來中鍵按住Zhouchang節點,拖到X節點上釋放,一樣選擇Other。在隨後的連接管理窗口中把左邊(Zhouchang)下的Output下的Output X和右邊的X節點下的Input2下的Input2 X連接起來,如果看不到有些屬性值,在菜單中把隱藏的屬性打開。順便說一下,所有的拖動操作都是在Hypergraph完成的。
現在重要的一點要來了,我們現在要做的就是求出物體的角度,再新建一個乘除節點,並且重命名為Angle,中鍵按住X節點,拖到Angle上釋放,選擇Other,把左邊Output下的Output X和右邊的Input2下的Input2 X連接,還要設定Angle節點的Input1值最左邊的數值為360,這三個輸入框相對應的值是X Y Z,運算模式選擇乘。
[page]
連來連去,頭都大了,接下來中鍵按下Angle節點,拖動釋放到模型(che)節點上,選擇Other,在連接管理窗口中把左邊(Angle)的Output下的Output X和右邊模型下的Rotate下的Rotate Z連接起來。注意,這個例子中的節點名稱很重要,不要搞錯了。
現在看看場景效果,沿X軸方向移動車輪模型,看到了沒有?車輪跟隨著X軸的不斷變化而不停地旋轉著。這個例子中我們用的是X軸的移動變化,當然也可以選擇Y或者Z軸。不過好像不對勁,因為車輪的轉動方向和移動方向不符合現實。這點很好辦,隻要我們把運算出的結果反轉一下就可以了,而做這一點是反轉節點reverse的拿手好戲。新建一個reverse節點,中鍵拖動Angle到剛建的reverse上,在彈出菜單中選擇Input,這樣就把運行結果反轉了一下。
[page]
然後把已經反轉的運算結果輸出到模型(che)的rotate Z上,中鍵拖動reverse1到模型(che)上,選擇other,在連接窗口中把左邊(reverse1)下的Output下的Output X和右邊窗口(che)下的rotate中的Ratate Z連接起來。
大功告成了,現在X方向移動場景中的模型,模型會隨著X距離的變化轉動,而且這個轉動是個精確的數值。這個精度當然不是非常精確的,它受控於模型的直徑和圓周率的值。換句話說,直徑取得越精確,轉動的結果越精確。
有朋友可能會問,那麼如果我縮放了模型,這個值豈不錯了。沒錯,如果把車輪模型進行縮放的話,這個結果的確不正確,現在我們就來讓最後的結果可以隨著車輪模型自動更新。當然這是有限製的,比如隻能等比例縮放XY軸,不過好像也沒有橢圓的車輪吧。回憶一下,在第一個乘除節點Zhouchang的Input2 X值取的是2,這是車輪模型的直徑值,也就是說隻要這個值能夠隨著模型的縮放更新的話,那麼我們的目的就達到了。一句題外話,一定要保證模型現在的縮放值都是1,否則就沒戲。
再創建最後一個乘除節點,重命名為Scale_R,然後中鍵拖動模型節點(che)到scale_R上釋放,選擇other,在連接窗口中把左邊模型(che)下的scale和右邊scale_R節點的Input1連接起來,接著把scale_R的Input2 X(就是input2最左邊的)設為值設為2,這是模型的直徑值(必須保證此時的模型縮放率為1),要視你的模型而定,我這裏是2。
[page]
說說為什麼一定要保證模型此時縮放率為1呢?因為我們要的是直徑能夠隨著模型縮放而自動更新,這個結果說到底就是模型的縮放率乘以它縮放率為1時的直徑值。其實有個更好的方法,就是把標注距離的節點下的值屬性做為input1 X的,然後把標注節點做為子物體連接到模型上。不過我這maya不知道什麼原因,怎樣也找不到需要的那個屬性。
最後一步,把上麵的scale_R的輸出值連接到計算周長的節點Zhouchang下的Input2中的Input2 X,這樣就實現了周長的動態變化。中鍵按下scale_R,釋放到Zhouchang節點上,選擇other,把左邊的scale_R下的Output中的Output X和右邊的Zhouchang下的Input2中的Input2 X連接起來。
現在全部連接完畢。展開Hypergraph窗口中Che節點的輸出和輸入連接,可以看到如下圖。
[page]
現在無論如何移動X軸或者XY軸縮放得到的結果都是正確的了。補充一點,如何你拖動模型節點(che)時連接窗口中找不到相應的屬性,那麼應該看看下麵這圖。
不要把下麵那個Nurbsbook1選擇了,這個隻是陰影組節點的幾何物體信息。