許 偉
(陜西學(xué)前師范學(xué)院計(jì)算機(jī)與電子信息系,陜西西安 710100)
MAXScript是3DS Max內(nèi)置腳本語(yǔ)言,類(lèi)似C++程序語(yǔ)言,在一定程度上可以控制3DS MAX。使用MAXScript可以建立和操控幾何體、攝像機(jī)、燈光、輔助物體、粒子、修改器、動(dòng)畫(huà)、控制器、軌跡視窗、渲染器等。
使用MAXScript在MAX里可以完成一些工作量很大且重復(fù)單調(diào)并相當(dāng)耗時(shí)的工作,有時(shí)只需要幾行命令,就可以取得高效的操作,也可以處理非常復(fù)雜的問(wèn)題。對(duì)于臨時(shí)性的專項(xiàng)工作,如果要使用腳本提高工作效率時(shí),可直接在“MAXScript Listener”窗口中或腳本編輯窗口中錄入命令運(yùn)行即可,而不必設(shè)置和設(shè)計(jì)用戶操作界面。多年來(lái),筆者在項(xiàng)目工程和教學(xué)中使用MAXScript實(shí)現(xiàn)動(dòng)畫(huà)制作,取得了較好的效果。希望將方法和經(jīng)驗(yàn)以案例的形式與讀者共享,以期與讀者交流、探討,達(dá)到共同提高的目的。
由于用戶需求的多面性,3DS MAX不可能涉及到應(yīng)用的各個(gè)層面,具體應(yīng)用的算法和功能模塊就需要用戶自己開(kāi)發(fā),即使編寫(xiě)的程序不成體系,代碼運(yùn)行效率不高也無(wú)關(guān)緊要,因?yàn)閼?yīng)用的目的就是減少交互創(chuàng)建的繁瑣。如在3DS MAX軟件中創(chuàng)建園形平面物體。
[分析]3DS MAX軟件中沒(méi)有創(chuàng)建圓形平面的命令,在實(shí)際教學(xué)中會(huì)經(jīng)常用到圓形平面對(duì)象,通過(guò)下列腳本可創(chuàng)建一個(gè)建立圓形平面的插件,直接將下列程序拷貝 “MAXScript Listener”窗口中運(yùn)行即可,如圖1左圖所示效果。
程序中setMesh命令用來(lái)創(chuàng)建三角面[1],三個(gè)不重疊的頂點(diǎn)坐標(biāo)就可以創(chuàng)建一個(gè)可視的三角面。setMesh命令其后有兩組數(shù)組參數(shù),第一組數(shù)組為所創(chuàng)建三角面的頂點(diǎn)坐標(biāo)值,第二組數(shù)組指定三角面的頂點(diǎn)的索引值,該索引值的順序,決定了三角面的法線方向,如圖1右圖所示。
在使用3DS MAX的過(guò)程中,針對(duì)某個(gè)具體案例會(huì)經(jīng)常重復(fù)使用同一個(gè)或一些命令,這既費(fèi)時(shí)又乏味的重復(fù)勞動(dòng)就可以使用腳本來(lái)完成。腳本的應(yīng)用有時(shí)為了簡(jiǎn)化制作過(guò)程,提高制作效率,只需要一行或數(shù)行語(yǔ)句就可完成耗時(shí)、費(fèi)力的工作。如制作古建筑屋頂?shù)耐咂?/p>
[分析]由于瓦片是錯(cuò)落而上擺放,每后一排瓦片都要產(chǎn)生錯(cuò)落操作:選擇要提升的一排瓦片,然后將其擠壓一定數(shù)值的高度,釋放選擇;再選擇次一排要提升的瓦片……。對(duì)于這樣重復(fù)性的操作就可用腳本完成。
圖1 創(chuàng)建圓面物體所需數(shù)組對(duì)應(yīng)
實(shí)現(xiàn)上述操作的腳本其實(shí)并不需要用戶熟記多邊形編輯里的相關(guān)命令腳本,只需利用宏腳本記錄器記錄下操作命令,系統(tǒng)會(huì)自動(dòng)將操作轉(zhuǎn)化為MAXScript腳本命令。在3DS MAX場(chǎng)景中以面為子物體對(duì)象選擇第二排瓦片,使用Editable Poly中的Extrude命令對(duì)所選的第二排瓦片的面進(jìn)行30個(gè)單的高度擠壓,接著撤銷(xiāo)這次擠壓操作,這樣就可以在“MAXScript Listener”窗口面板中得宏記錄記錄下的命令:
對(duì)這兩行命令稍加改造,就可使改造后的命令變成一個(gè)臨時(shí)的命令按鈕。完成后的命令腳本如下:
在“MAXScript Listener”窗口面板中用鼠標(biāo)選中上述四條命令運(yùn)行它一次,然后再選擇除了第一條命令以外的其它三條命令,將它們拖動(dòng)到3DS MAX軟件的工具欄上,將其變成命令按鈕。
接著,只需要依次選擇每一排的瓦片面,每選擇一排,按一下剛才在工具欄上生成的按鈕,直至完成每排瓦片高度的制作,再多的瓦片都能很快建立。如圖2所示。
圖2 可編輯多邊形中Extrude操作30各單位對(duì)應(yīng)的腳本命令
在3DS MAX中使用腳本產(chǎn)生動(dòng)畫(huà)效果是動(dòng)畫(huà)創(chuàng)作的較高層次,用MAXScript生成的動(dòng)畫(huà)往往具有出神入化、令人驚嘆的視覺(jué)效果,這恰恰是傳統(tǒng)的交互操作方式很難完成的。
如用戶要求將一幅彩色畫(huà)上的每個(gè)像素都創(chuàng)建一個(gè)尺寸很小且固定大小的正方形平面,并且這個(gè)正方形對(duì)應(yīng)于畫(huà)幅上這個(gè)像素的顏色,要求按照像素的亮度的大小對(duì)正方形個(gè)體產(chǎn)生旋轉(zhuǎn)角度不一的動(dòng)畫(huà)效果,亮度暗的正方形個(gè)體旋轉(zhuǎn)角度小,反之則旋轉(zhuǎn)角度大,它的效果像是大型運(yùn)動(dòng)會(huì)開(kāi)幕式前演員表演的翻版動(dòng)畫(huà),如圖3截圖效果。
[分析]由于圖像上像素的排列是矩形的陣列,因此讀取位圖的像素必須按照先行后列,不能跨行讀取像素。像素的讀取可使用getpixels命令并配合For循環(huán)語(yǔ)句完成,對(duì)于彩色圖像中的亮度信息計(jì)算的轉(zhuǎn)換矩陣為:=0.299+0.587+0.114,此公式中的數(shù)據(jù)分別為三基色的相對(duì)強(qiáng)度。
圖3 按像素生成幾何模型并設(shè)置動(dòng)畫(huà)的效果
位圖像素的存放是按一定的陣列方式存放的,例如,像素為50X28的圖形其左上角為[0,0],其右下角則為[49,27],如圖3所示。讀取位圖的像素必須按照先行后列,不能跨行讀取像素。運(yùn)行完上述這段腳本程序,直接播放動(dòng)畫(huà)按鈕即可產(chǎn)生動(dòng)畫(huà)效果。筆者選用的圖像的像素為50×50,RGB全彩色,總計(jì)可產(chǎn)生2500個(gè)三維幾何體。
利用MAXScript可根據(jù)數(shù)學(xué)公式編程生成非常優(yōu)美的數(shù)學(xué)曲線,這在實(shí)際教學(xué)中會(huì)帶來(lái)直觀效果,使晦澀抽象的數(shù)學(xué)公式變得生機(jī)勃勃。
如用MAXScript根據(jù)球面螺旋線數(shù)學(xué)公式進(jìn)行編程可以生成非常漂亮的球面螺旋線,如圖4所示。
圖4 球面螺旋曲線
[分析]球坐標(biāo)是三維坐標(biāo)系的一種,用以確定三維空間中點(diǎn)、線、面以及體的位置,它以坐標(biāo)原點(diǎn)為參考點(diǎn),由方位角、仰角和距離構(gòu)成。球坐標(biāo)系與其他坐標(biāo)系的變換需要用到特別的方程式。徑向距離、天頂角、方位角,分別標(biāo)記為 (r,θ,φ)。表示一個(gè)點(diǎn)p在三維空間的位置的三維正交坐標(biāo)系,其對(duì)應(yīng)的直角坐標(biāo)系的坐標(biāo)轉(zhuǎn)換公式為[2]:
根據(jù)上述公式,利用MAXScript中的創(chuàng)建樣條曲線命令編程就可創(chuàng)建出球面螺旋曲線,具體腳本程序如下。
筆者在實(shí)際的項(xiàng)目制作和教學(xué)活動(dòng)中,每當(dāng)遇到重復(fù)性的工作時(shí),都會(huì)使用腳本或指導(dǎo)學(xué)生使用腳本來(lái)減輕工作量。開(kāi)始使用會(huì)感到非常困難,但只要勤于練習(xí),渡過(guò)適應(yīng)過(guò)程就能體驗(yàn)到使用腳本的優(yōu)勢(shì)。同時(shí)要學(xué)會(huì)使用《3DS MAX MAXScript Reference》,在手冊(cè)里找到自己所要使用的節(jié)點(diǎn)屬性、相應(yīng)的類(lèi)及所需的操作命令,就能進(jìn)一步提高解決問(wèn)題的能力。
[1][美]Fletcher Dunn,Lan Parberry.3D數(shù)學(xué)基礎(chǔ):圖形與游戲開(kāi)發(fā)[M].史銀雪,陳洪,王榮靜,譯.北京:清華大學(xué)出版社,2005.
[2]Spherical Coordinates[EB/OL].http://mathworld.wolfram.com/SphericalCoordinates.html.