許 偉
(陜西教育學(xué)院 計算機科學(xué)與技術(shù)系,西安 710100)
3DS Max是美國Autodesk公司開發(fā)的三維動畫制作和渲染的軟件,它廣泛應(yīng)用于廣告、影視、工業(yè)設(shè)計、建筑設(shè)計、多媒體制作、游戲、輔助教學(xué)以及工程可視化等領(lǐng)域。但它不能解決用戶應(yīng)用的各個方面。軟件中場景對象數(shù)據(jù)捕獲與數(shù)據(jù)導(dǎo)入導(dǎo)出,就需要使用者自行設(shè)計開發(fā)。一般動畫設(shè)計者對計算機軟件了解甚少,不具備自主開發(fā)能力,而計算機軟件開發(fā)者對動畫設(shè)計和制作以及動畫制作軟件環(huán)境缺乏足夠的認(rèn)識與相關(guān)專業(yè)知識,因此很難開發(fā)出符合要求的應(yīng)用模塊來。本文將動畫制作中所涉及到的3DS MAX中數(shù)據(jù)導(dǎo)入導(dǎo)出應(yīng)對策略推介如下。
在實際操作中,有時需要使用客戶提供的數(shù)據(jù)產(chǎn)生特定的動畫效果。應(yīng)用MAXScript可導(dǎo)入外部數(shù)據(jù),這些外部數(shù)據(jù)可以是文本文件、word文件或Excel文件形式,利用這些數(shù)據(jù)可以精確地在3DS MAX中創(chuàng)建模型或生成動畫,這種應(yīng)用在實際工作中非常常見。
在實際應(yīng)用中筆者遇到用戶提供的CSV數(shù)據(jù)文件,要求根據(jù)文件中提供的數(shù)據(jù)創(chuàng)建特定運動軌跡的動畫。CSV一種純文本格式,數(shù)據(jù)的字段由逗號分開,程序通過讀取文件重新創(chuàng)建正確的字段,方法是每次遇到逗號時開始新一段數(shù)據(jù)。圖1為CSV的一個簡單數(shù)據(jù)文件。其中每行提
供了四個數(shù)據(jù),每個數(shù)據(jù)之間用逗號分隔開。第一個數(shù)據(jù)為動畫產(chǎn)生的時間,第二個至第四個為Point3數(shù)據(jù)類型即[x,y,z] 形式的坐標(biāo)值,下列提供的MAXScript腳本讀取這個文件的數(shù)據(jù),并按照數(shù)據(jù)文件的要求創(chuàng)建一個動畫,生成的動畫效果為物體作圓周運動。
圖1 CSV數(shù)據(jù)文件樣式
(
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 ( --循環(huán)直到數(shù)據(jù)讀完
theTime = fl oor ((readValue theFile) + 0.5)--返回小于或者等于指定表達式的最大整數(shù)
with animate on
at time theTime
theObject.pos = Point3(readValue theFile) (readValue theFile) (readValue theFile)
)
close theFile --關(guān)閉文件
))
有時需要將3DS MAX場景中的物體自身構(gòu)成坐標(biāo)參數(shù)或運動物體的動畫參數(shù)輸出成特定格式的文件,以便對這些參數(shù)數(shù)據(jù)比對和分析,然后制定出最佳的匹配方案,這些應(yīng)用都需要軟件使用者自行開發(fā)。例如,下列腳本中使用getVert命令可獲取場景中所有三維物體的每個被索引頂點所構(gòu)成的頂點坐標(biāo)值并將其按照point3數(shù)據(jù)類型輸出為數(shù)據(jù)文件。
圖2 將對象構(gòu)成頂點坐標(biāo)值輸出為CSV數(shù)據(jù)文件
-- 創(chuàng)建輸出文件
exFile = openFile "C:\exportData.txt" mode:"w"
-- 采集場景中的全部三維物體
for obj in geometry do (
-- Write name of object
format "對象名稱 ("%"); 對象頂點總數(shù):% "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 "頂 點 編 號:%; 頂 點 坐 標(biāo)值 :(%,%,%) " i vertPos.x vertPos.y vertPos.z to:exFile
))
-- 關(guān)閉輸出文件
close exFile
可以將場景中二維形狀即曲線對象按照指定的采樣插值精度求出曲線的插值點的世界坐標(biāo)值并將其存儲為特定格式的文本文件。3DS MAX中針對曲線有兩種方法在曲線上進行插值定位計算,一種是頂點插值,另一種是長度插值。當(dāng)使用頂點插值(又名路徑插補),樣條線被視為若干段,其中每兩個頂點之間的部分是一個規(guī)范化的空間從0.0到1.0。插值過程中忽略段的兩個頂點之間的距離,這意味著,如果該段的長度是不同的,沿樣條線的線性插值會導(dǎo)致物體沿曲線運動是非勻速的。當(dāng)使用長度插補,整個曲線的長度會被單位化,所以參數(shù)是0.5就是樣條曲線的中間位置而并不考慮曲線的實際長度。使用0.0和1.0的單位化線性變化關(guān)系,會使物體沿此曲線運動勻速動畫速度。3DS MAX中通過 interpCurve3D腳本命令來獲取插值值。例如,運行下列腳本將場景中繪制的世界地圖曲線按照5%的采樣精度,求出其插值點的世界坐標(biāo)值,如圖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個采樣位置的坐標(biāo)值。
(
vert = interpCurve3D obj 1 i
format "采樣點坐標(biāo)值:(%,%), "vert.x vert.z to:expFile
) )
else
format "它是非 splineshape 對象。 "to:expFile
)
圖3 世界地圖曲線按5%采樣精度取得的插值點坐標(biāo)
close expFile -- Close export fi le
在現(xiàn)實中很多應(yīng)用都具有針對性,其指向非常具體,不可能以一概全。作為一個優(yōu)秀的動畫化設(shè)計制作者,不但應(yīng)具備嫻熟的藝術(shù)創(chuàng)作技藝功底,而且也應(yīng)具備軟件開發(fā)知識,若具有一定的開發(fā)能力便會進一步提高技能激發(fā)創(chuàng)造力,就能將用戶提供的精確數(shù)據(jù)直接應(yīng)用于計算機動畫中的具體對象,從而產(chǎn)生精準(zhǔn)的動畫效果,計算機動畫是藝術(shù)與技術(shù)的巧妙結(jié)合。
[1] http://mathworld.wolfram.com/
[2] 3DS MAX 2011 MAXScript Reference (軟件所帶的腳本用戶手冊).
[3] 王華.3ds MAXScript 腳本語言完全學(xué)習(xí)手冊[J].兵器工業(yè)出版社, 2006.
[4] Fletcher Dunn Lan Parberry, 著.史銀雪.等譯.3D 數(shù)學(xué)基礎(chǔ):圖形與游戲開發(fā)(美)[M]. 清華大學(xué)出版社.
[5] John Vince.Mathematics for Computer Graphics.Second Edition[M].Springer Science+Business Media.