許 偉
(陜西教育學院 計算機科學與技術系,西安 710100)
3DS Max是美國Autodesk公司開發的三維動畫制作和渲染的軟件,它廣泛應用于廣告、影視、工業設計、建筑設計、多媒體制作、游戲、輔助教學以及工程可視化等領域。但它不能解決用戶應用的各個方面。軟件中場景對象數據捕獲與數據導入導出,就需要使用者自行設計開發。一般動畫設計者對計算機軟件了解甚少,不具備自主開發能力,而計算機軟件開發者對動畫設計和制作以及動畫制作軟件環境缺乏足夠的認識與相關專業知識,因此很難開發出符合要求的應用模塊來。本文將動畫制作中所涉及到的3DS MAX中數據導入導出應對策略推介如下。
在實際操作中,有時需要使用客戶提供的數據產生特定的動畫效果。應用MAXScript可導入外部數據,這些外部數據可以是文本文件、word文件或Excel文件形式,利用這些數據可以精確地在3DS MAX中創建模型或生成動畫,這種應用在實際工作中非常常見。
在實際應用中筆者遇到用戶提供的CSV數據文件,要求根據文件中提供的數據創建特定運動軌跡的動畫。CSV一種純文本格式,數據的字段由逗號分開,程序通過讀取文件重新創建正確的字段,方法是每次遇到逗號時開始新一段數據。圖1為CSV的一個簡單數據文件。其中每行提
供了四個數據,每個數據之間用逗號分隔開。第一個數據為動畫產生的時間,第二個至第四個為Point3數據類型即[x,y,z] 形式的坐標值,下列提供的MAXScript腳本讀取這個文件的數據,并按照數據文件的要求創建一個動畫,生成的動畫效果為物體作圓周運動。

圖1 CSV數據文件樣式
(
local theFilename = getOpenFileName types:"按列分隔的值 (*.CSV)|*.CSV|All Files (*.*)|*.*"
if theFilename != undef i ned do (
local theFile = openFile theFilename – 打開文件
local theObject = Sphere radius:5 showtrajectory:true
while not eof theFile do ( --循環直到數據讀完
theTime = fl oor ((readValue theFile) + 0.5)--返回小于或者等于指定表達式的最大整數
with animate on
at time theTime
theObject.pos = Point3(readValue theFile) (readValue theFile) (readValue theFile)
)
close theFile --關閉文件
))
有時需要將3DS MAX場景中的物體自身構成坐標參數或運動物體的動畫參數輸出成特定格式的文件,以便對這些參數數據比對和分析,然后制定出最佳的匹配方案,這些應用都需要軟件使用者自行開發。例如,下列腳本中使用getVert命令可獲取場景中所有三維物體的每個被索引頂點所構成的頂點坐標值并將其按照point3數據類型輸出為數據文件。

圖2 將對象構成頂點坐標值輸出為CSV數據文件
-- 創建輸出文件
exFile = openFile "C:\exportData.txt" mode:"w"
-- 采集場景中的全部三維物體
for obj in geometry do (
-- Write name of object
format "對象名稱 ("%"); 對象頂點總數:% "obj.name obj.mesh.numverts to:exFile
-- Write vert positions of object
for i in 1 to obj.mesh.numverts do (
vertPos = getVert obj.mesh i
format "頂 點 編 號:%; 頂 點 坐 標值 :(%,%,%) " i vertPos.x vertPos.y vertPos.z to:exFile
))
-- 關閉輸出文件
close exFile
可以將場景中二維形狀即曲線對象按照指定的采樣插值精度求出曲線的插值點的世界坐標值并將其存儲為特定格式的文本文件。3DS MAX中針對曲線有兩種方法在曲線上進行插值定位計算,一種是頂點插值,另一種是長度插值。當使用頂點插值(又名路徑插補),樣條線被視為若干段,其中每兩個頂點之間的部分是一個規范化的空間從0.0到1.0。插值過程中忽略段的兩個頂點之間的距離,這意味著,如果該段的長度是不同的,沿樣條線的線性插值會導致物體沿曲線運動是非勻速的。當使用長度插補,整個曲線的長度會被單位化,所以參數是0.5就是樣條曲線的中間位置而并不考慮曲線的實際長度。使用0.0和1.0的單位化線性變化關系,會使物體沿此曲線運動勻速動畫速度。3DS MAX中通過 interpCurve3D腳本命令來獲取插值值。例如,運行下列腳本將場景中繪制的世界地圖曲線按照5%的采樣精度,求出其插值點的世界坐標值,如圖3所示。
-- Create export fi le
expFile = openFile "C:\exportData.txt" mode:"w"
-- Loop through geometry in the scene
for obj in shapes do
(
-- Write name of object
format "曲線的名稱:("%") " obj.name to:expFile
-- Write vert positions of object
if (isKindOf obj SplineShape) then
(
for i = 0.0 to 1.0 by .05 do --在曲線上獲取20個采樣位置的坐標值。
(
vert = interpCurve3D obj 1 i
format "采樣點坐標值:(%,%), "vert.x vert.z to:expFile
) )
else
format "它是非 splineshape 對象。 "to:expFile
)

圖3 世界地圖曲線按5%采樣精度取得的插值點坐標
close expFile -- Close export fi le
在現實中很多應用都具有針對性,其指向非常具體,不可能以一概全。作為一個優秀的動畫化設計制作者,不但應具備嫻熟的藝術創作技藝功底,而且也應具備軟件開發知識,若具有一定的開發能力便會進一步提高技能激發創造力,就能將用戶提供的精確數據直接應用于計算機動畫中的具體對象,從而產生精準的動畫效果,計算機動畫是藝術與技術的巧妙結合。
[1] http://mathworld.wolfram.com/
[2] 3DS MAX 2011 MAXScript Reference (軟件所帶的腳本用戶手冊).
[3] 王華.3ds MAXScript 腳本語言完全學習手冊[J].兵器工業出版社, 2006.
[4] Fletcher Dunn Lan Parberry, 著.史銀雪.等譯.3D 數學基礎:圖形與游戲開發(美)[M]. 清華大學出版社.
[5] John Vince.Mathematics for Computer Graphics.Second Edition[M].Springer Science+Business Media.