在算圖農場主機上,修改MAYA 場景檔的路徑資訊–以 sed、grep 實作
前言
在 MAYA 製作作品時,或多或少會需要使用到貼圖或外部的檔案。而 MAYA 並不會把這些資訊都納入自己的場景檔(scene files)裡頭,它只會記錄外部檔案的路徑,等要開始算圖時,才會去讀取檔案。
國網中心的算圖農場的作業系統是 Linux ,因此,無論你的 MAYA 是在哪種環境下製作的,你都要把 MAYA 檔案內的那些路徑格式改成正確的 Linux 路徑。
路徑設定正確後,算圖才會正確,不然算完的作品可能就沒有貼圖囉!
以下假設在 Windows 下製作動畫,然後上傳到國網中心的算圖農場做算圖 。
存檔要存成 ASCII
請記得,當你準備結束 MAYA 工作時,把存檔格式選擇 MAYA ASCII,也就是 *.ma 檔。如此你才能用文字編輯的方式修改路徑資料。
圖一、選取存檔格式為 Maya ASCII
圖二、 用文字編輯器打開任一 Maya ASCII 檔案,可以看到以文字格式儲存。
Windows 下的路徑
如果你是在 Windows 上製作 MAYA ,路徑可能會像這樣:
F:/maya/projects/Practice_Realflow/sourceimages/office01.hdr
很明顯這可能是個 IBL 環境貼圖所需要的檔案。
Linux 下的路徑
在 Linux 下,路徑通常像這樣:
/RenderFarm/user001/Practice_Realflow/sourceimages/office01.hdr
以 / 作為最頂層,而不是像Windows 以 F: 作為最頂層
該做什麼步驟?
在此我們不細論兩者的設計理念以及區別,總之,我們的任務是把 MAYA 檔案內的
F:/maya/projects/Practice_Realflow/sourceimages/office01.hdr
取代成為
/RenderFarm/user001/Practice_Realflow/sourceimages/office01.hdr
比較、觀察一下關鍵之處,可以看到,其實也就是把 F:/maya/projects 換成 /RenderFarm/user001 這樣就可以了。
改成相對路徑的作法
前一節的作法稱為絕對路徑。事實上這一大串文字真的是落落長,太麻煩了,很多情況下我們喜歡相對路徑,通常會簡短很多。
例如、你把 MAYA 檔案儲存在
/RenderFarm/user001/Practice_Realflow/scenecs/animation.ma
那對這個 animation.ma 檔案來說,上面的 office01.hdr 的檔案,就在相對的 ../sourceimages/office01.hdr 路徑上
註: .. 兩個冒號代表向上跳一層目錄的意思
所以,我們只需要把 F:/maya/projects/Practice_Realflow 取代為 .. ,讓路徑變成 ../sourceimages/office01.hdr 就行了。
有沒有簡短多了呢?
實作,假設 animation.ma 就是你的 MAYA 場景檔案
步驟一、以 grep 指令尋找 animation.ma 內的 F: 關鍵字。找到兩筆資料
[scenes]$ grep 'F:' animation.ma setAttr ".tx" -type "string" "F:/maya/projects/Practice_Realflow//sourceimages/office.hdr"; setAttr ".ftn" -type "string" "F:/maya/projects/Practice_Realflow//sourceimages/cup.jpg";
步驟二、先自己產生一些文字檔來練習搜尋與取代。
[scenes]$ vi test001.ma ### 以 vi 編輯 test001.ma ### ### 把上面的兩筆路徑資料自行複製到 test001.ma 內 ### ### 然後存檔,離開 vi ### [scenes]$cat test001.ma setAttr ".tx" -type "string" "F:/maya/projects/Practice_Realflow//sourceimages/office.hdr"; setAttr ".ftn" -type "string" "F:/maya/projects/Practice_Realflow//sourceimages/cup.jpg"; ### 以 cat 指令確保一下檔案內容 ###
步驟三、 把 F:/maya/projects/Practice_Realflow/ 先變成 ..
[scenes]$ sed -i 's/F:\/maya\/projects\/Practice_Realflow\//../g' test001.ma
- 說明一: sed 指令,格式如下
sed ‘s/[被取代的舊字串]/[取代別人的新字串]/g’ 檔案名稱
- 所以 如果你打 sed ‘s/a/bbb/g’ test001.ma,那所有的 a 都會變成 bbb,例如 maya 會變成 mbbbybbb
- 說明二: –i 代表把改變寫入檔案。若忘記加,所有的輸出會跑到螢幕上 … 那會很精采哦 ~~~XDDD
- 說明三:你可以注意到指令裡面所有的 / 前面都多了一個 \ ,我把它用紅色重新標註給你看 :
sed -i ‘s/F:\/maya\/projects\/Practice_Realflow\//../g’ test001.ma
- 這是因為 / 是特殊字元,有特殊用途的,如果你要告訴系統:「這不是特殊字元,只是普通斜線!」那麼你得在前面加上倒斜線 \
好了,試試看!
步驟四、觀察結果,根據預期路徑應是 “../sourceimages/office.hdr” ,所以找關鍵字 “../source
[scenes]$ grep '\"../source' test001.ma setAttr ".tx" -type "string" "../sourceimages/office.hdr"; setAttr ".ftn" -type "string" "../sourceimages/cup.jpg";
大功告成!
步驟五、對真正的檔案下手,先觀察、下指令、再檢查
[scenes]$ grep 'F:' animation.ma setAttr ".tx" -type "string" "F:/maya/projects/Practice_Realflow//sourceimages/office.hdr"; setAttr ".ftn" -type "string" "F:/maya/projects/Practice_Realflow//sourceimages/cup.jpg"; [scenes]$ sed -i 's/F:\/maya\/projects\/Practice_Realflow\//../g' animation.ma [scenes]$ grep '\"../source'animation.ma setAttr ".tx" -type "string" "../sourceimages/office.hdr"; setAttr ".ftn" -type "string" "../sourceimages/cup.jpg";
大功告成,算圖吧!
Leave a Reply