從零開始的Maya腳本編寫(悠久之翼天使的階梯動畫實例)

大家好!本篇文章將會向你介紹:
用 Python 語言編寫 Maya 腳本的基本操作
一個簡單的 Maya 腳本實例:實現(xiàn)悠久之翼天使的階梯動畫

在編寫 Maya 腳本之前需要做一些準備
Maya 向用戶主要提供了兩種腳本編寫語言:MEL 和 Python。本文只會介紹使用 Python 進行Maya腳本的編寫。
編寫簡單的 Maya 腳本需要熟悉?Python 語言嗎?筆者自己對于 Python 語言也并不熟悉,所以認為這不是必須的,但如果掌握好它可以更好地幫助你進行腳本編寫。然而,如果你完全沒有任何編寫程序的經驗,閱讀本文時可能會有一定的困難。
因為本文介紹的實例比較簡單,所以會使用 Maya 內置的 Script Editor 進行編寫。你可以在 Maya頂部菜單欄依次選擇 “Windows” → "General Editors" → "Script Editor" 打開它。

打開后我們可以進行一個簡單的測試,用 print 函數(shù)打印一句 "Hello World!",選中你所要執(zhí)行的代碼(這里強烈建議選中代碼再執(zhí)行,否則代碼執(zhí)行完就會消失),點擊面板上方的藍色按鈕執(zhí)行,發(fā)現(xiàn)執(zhí)行結果無誤。于是可以正式進行 Maya 腳本編寫啦。

實際上,使用外部調試器是更好的選擇,這樣做會使你的編寫效率更高。比方說?PyCharm。但本文并不打算這方面的東西。讀者可以通過下面的鏈接自行了解 Maya 和外部調試器結合使用。
http://help.autodesk.com/view/MAYAUL/2018/CHS/?guid=GUID-8A96A8DB-FD6F-434F-A878-288DD84E99C7

使用 Maya 命令
使用 Maya 命令必須導入 maya.cmds 模塊??梢酝ㄟ^以下語句導入
這樣就可以使用 Maya 命令了,執(zhí)行下面語句,你會得到一個寬度為11,高度為0.5,深度為4,名稱為 "MyCube1",在寬度上細分數(shù)為11的立方體。你可以在大綱視圖中看到它的名稱。 Maya 用數(shù)字替換 # 號確保每個對象的名稱是唯一的。所以當你再次執(zhí)行一遍這條語句,你會得到一個完全相同的立方體,但它的名稱是 "MyCube2"。

想要完全熟悉每個 Maya 命令是相當困難的事情。好在 Maya 官方為我們提供了詳細的幫助文檔,讀者可以通過下面的網址訪問:
http://help.autodesk.com/view/MAYAUL/2018/CHS/?guid=__CommandsPython_index_html
每個命令都有詳細地介紹,包括書寫格式,參數(shù)和返回值等信息。比方說剛剛使用的 polyCube() 命令就可以找到詳細的說明。

實際上,我們編寫 Maya 腳本,本質上只是在調用 Maya 已經存在的各種函數(shù)。你可能已經明白了 Maya 腳本工作的邏輯,機械性地記住每一條命令和每個參數(shù)的意思是枯燥的,讓我們通過實例去學習吧。

悠久之翼天使的階梯動畫實例編寫
(完整代碼在文章末尾,可以直接執(zhí)行)
本文要做的就是視頻中樓梯向下螺旋生成的動畫。
看一下我們最終要實現(xiàn)的效果:

執(zhí)行腳本,我們會得到一個面板,輸入階梯的數(shù)量,點擊 “Create Angel's Staircase” 按鈕就會生成樓梯動畫。當然你在編寫過程中也可以選擇向面板傳入更多的參數(shù),讓這個效果更具實用性。在 Maya 底部的時間軸上可以定義動畫的時間范圍,因為我輸入的是200,所以選擇設定成了600幀。
可以看到,我們已經得到了樓梯動畫,不過本文無法進行動態(tài)的呈現(xiàn),讀者可以自己去執(zhí)行一次看看結果。

這樣的效果在各種三維軟件中都不難實現(xiàn)。在編寫 Maya 腳本時思路也比較簡單。首先我們需要創(chuàng)建單個的階梯。
階梯的參數(shù)可以根據(jù)讀者的喜好而定,詳細的參數(shù)設置需要去上文提到的網站上查看。
得到了一個階梯,接下來我們只需要通過循環(huán)控制每一級階梯的變換就可以得到完整的階梯。仔細觀察可以發(fā)現(xiàn),每一級階梯相比其下一級階梯僅在高度和旋轉上有所改動,于是我們可以定義 angle 和 ystep 兩個變量,每一次循環(huán)都使其增加一個恒定的增量。理所當然地,我們可以寫出這樣的代碼
move() 函數(shù)可以移動物體,而 rotate() 函數(shù)則可以旋轉物體。傳入定義好的 angle, ystep 變量就可以實現(xiàn)階梯的規(guī)律性變化。更加詳細的參數(shù)可以查閱幫助文檔。
使用函數(shù)是一個好習慣,這樣做會使你的代碼結構更加清晰。Python 語言還支持面向對象,不過在本文中并沒有使用類的必要。上面的代碼得到了這樣的結果

雖然這樣的效果也很有趣,但并不是我們想要的。我們發(fā)現(xiàn)每一級樓梯都以自身的幾何中心進行旋轉,于是我們需要重設旋轉的軸心。在 rotate() 函數(shù)中,可以通過設置 pivot=(20, 0, 0) 改變旋轉軸心。這個參數(shù)接受一個列表,接受軸心的坐標。將軸心坐標移動到合適位置后。我們還會發(fā)現(xiàn),在大綱視圖中創(chuàng)建了兩百級階梯,它們占滿了大綱視圖,這實在令人沮喪。于是,想要將其都歸入一個組中。為此,只需要定義一個 Group 包含所有的階梯即可。group() 函數(shù)為提供了這種功能,只需要調用 parent() 函數(shù)將其鏈接起來即可。于是我們得到了修改后的代碼:
執(zhí)行一下,發(fā)現(xiàn)我們已經得到了想要的效果,大綱變得干凈整潔,階梯也得到了想要的效果。那么如何制作階梯螺旋向下生成的動畫呢。在 Maya 物體的屬性中,有一向叫做 Visibility,只接受兩個參數(shù),控制物體的可見性。于是可以這樣計算,假設我們現(xiàn)在有600幀,200級階梯,因為階梯是由下往上生成的,所以我需要在600幀處將第一級階梯的可見性關掉,三幀之后將其可見性打開。依次類推,但是手動為200個物體 key 幀是難以想象的。
于是我們將編寫第二個函數(shù)用于關鍵幀的設置,Maya 為我們提供了 setKeyframe() 函數(shù),在上一個函數(shù)中,我們在生成每一級階梯時調用?setKeyframe() 函數(shù),相應的數(shù)據(jù)已經在前文計算過。只需要 設置 TimeKey 變量每次循環(huán)依次遞減即可。我們仍可以調用 playbackOptions() 函數(shù)獲取當前時間軸長度,這樣,無論我們的時間軸是多少幀,都可以生成相應的階梯動畫。
如果此時調用 CreateStairs() 函數(shù),已經可以得到最后的結果。但是,我們還想實現(xiàn)與用戶的交互,這應該怎么做呢?
Maya 提供的 window() 函數(shù)和 showWindow() 函數(shù)為我們解決了這個問題。為了方便用戶的使用,我們甚至可以調用?intSliderGrp() 函數(shù),它的好處是可以通過滑動條控制傳入數(shù)值的大小,這樣更加直觀。對于 button() 函數(shù),我們要設置其相應方式,確保當用戶點擊? “Create Angel's Staircase” 時,函數(shù)得到執(zhí)行。
就這樣,我們得到了這個流程的完整代碼。

完整代碼
做完這個實例,也許你已經了很多自己的想法想要去實現(xiàn),結合官方的幫助文檔,編寫自己的Maya 腳本吧。

本篇文章到此結束啦,謝謝你的閱讀。