24h購物| | PChome| 登入
2003-05-04 12:25:40| 人氣255| 回應0 | 下一篇

maxscript學習

推薦 0 收藏 0 轉貼0 訂閱站台

Learning MaxScript

基本的程式規則
MaxScript提供了十分自由的編寫環境,它如同C與C++般並不需要加上許多標點符號,當它在讀一行程式時,若其面對的程式是未完成的敘述,它會自動往下一行進行判讀。

要在同一行中進行多次的計算,可以以「;」加以分開。

可以藉由「--」來加上註解。

在數字上MaxScript將其區分為整數與浮點數,藉由不同的運算方式可以調整數字的型式,如3+4=7而3+4.0=7.0。

在文字的輸入規則是將要輸入的文字以「〝 〞」框起來,如“Hello MaxScript”。

在陣列的輸入規則是將要陣列的元件以「#( , )」方式輸入,可同時存入不同類型的資料,如:#(pi,20,"Hallo MaxScript",6+2^3),當執行結束後會得到:#(3.14159,20,"Hallo MaxScript",14)。

加入變數名稱的規則是:變數名稱 = 變數值,而變數值可以是文字、數字或是任何類型的值。當第一次指定變數值後,就可藉由呼叫變數名來得到變數值。

文字變數可藉由「+」來得到合併的結果,如A="Hallo";B=" MaxScript" 則 A+B="Hallo MaxScript"。

隨機數的創造規則是藉由random X Y 的方式來得到介於X與Y間的變數,而變數的類型是取首位數字的類型,例如X為浮點數時得到的數值便是浮點數。

創造物件
除了先前學習到簡單的運算外,可以藉由MaxScript製作物件如box、cylinders等,最簡單的方式是以box()來進行創造,只要在Listener中鍵入: box() ,如此就可以創造一個基本的方盒。但為了日後控制的方便,最好在創造物件時直接指定物件的變數名稱。所以可以在Listener中鍵入: mybox = box() 。

當藉由MaxScript來創造物件時,若沒有指定參數時,通常使用括號"()"來指定使用內定值來作為參數的指定,而當要指定物件的參數時,可以直接指定在程式碼後面,例如: mybox = box height:20 width:20 length:10。

當依範例輸入、執行後會產生一串文字:
$Box:Box01 @ [0.000000, 0.000000, 0.000000] 說明如下:
"$":路徑名稱(pathname)藉以指定物件,當畫面上指定的物件時,就可以直接以此代表該物件,例如:畫面上已點選物件A後,輸入”$.height = 20”便可直接將物件A的高度屬性改為20。 ╮(╯~╰¡)╭
"Box:Box1"("創造物件:物件名稱"):是指創造的物件及其在max主程式的名稱,並不是變數名稱。
"[0.000000, 0.000000, 0.000000]":代表物件在max主程式的絕對座標值。

修改物件屬性
在MaxScript中可以藉由「點語法」來代表物件的屬性,例如 mybox.height 就可以說是“the height of mybox”.可以修改的參數不僅包括物件的基本屬性如box的長、寬、高外,還包括了比例、位置、顏色等參數也可以修改。

改變物件的名稱(name)
如果要改變物件內定的名稱如Box01,只要更改name的屬性,鍵入
mybox.name = “BlueBox”。

變更物件的顏色(wireColor)
要更改物件的顏色可以有兩種方式,第一是指定物件的顏色:mybox.wireColor = blue,另一種是指定顏色的RGB值:
mybox.wireColor = (color 255 0 255)

變更物件的位置(pos)
藉由輸入mybox.pos = [0,-75,0]來改變物件的位置,".pos"代表物件的位置,而[0,-75,0]則代表物件的[X,Y,Z]的絕對座標值。

變更物件的大小
藉由改變物件的比例調整,輸入mybox.scale = [1.5,1.5,1.5],".scale"代表物件的位置,而[1.5,1.5,1.5]則代表物件的[X,Y,Z]各軸向的放大倍數,其中值得注意的是".scale"只能改變物件在畫面呈現的大小,但卻不會修改物件的參數值,所以無論其修改的比例為何,仍然是以原有的參數加以修改。

展現物件可變更的參數
除了先前提至的位置、比例、顏色等參數外,還可以藉由"showclass()"來呈現物件的所有參數,並藉由點語法來改變參數值。例如:當輸入showclass “box.*”後,系統便會將所有box相關的參數呈現出來。除此之外也可以藉由"showProperties()"達成同樣的目的。

運用基本的變化
藉由MaxScript來改變物件的基本變化,如move、scale、rotate等,雖然如創造物件時所介紹的可藉由「點語法」來改變物件的size、pos等方式來改變,但在3d max中卻較常使用移動來處理物件的位置。

移動物件
藉由〝move name_obj [ X , Y , Z ]〞來移動物件,值得注意的是[ X , Y , Z ]是代表往指定的軸向移動多少位置,與pos不同的是pos指定的數值是絕對座標,而move所指定的是相對座標。

改變物件比例
如同移動物件的程式碼,也可藉由〝scale name_obj [ X , Y , Z ]〞來改變物件比例,值得注意的是依此方式操作的程式碼,[ X , Y , Z ]是代表的是指相對倍數,而非mybox.scale =[ X , Y , Z ]程式中的絕對倍數。不過如同” .scale”的程式一般,只能改變物件在畫面呈現的大小,但卻不會修改物件的參數值。

旋轉物件
在3D的環境要作旋轉的動作比較複雜,在MaxScript中提供了三種方式來指定旋轉的方式,其中最常用的便是 “ euler angles ” 的指定方式,也就是藉由 ” rot_box = eulerangles X Y Z ” 指定角度後,再由物件的軸心依角度來旋轉。例如:
rot_box = eulerangles 0 0 45
rotate mybox rot_box
如此指定的物件便會依Z軸旋轉45度。

物件延伸變化
額外的變數修改
在物件的基準屬性中,除了基本的長、寬、高外,還包括了物件各邊的格線畫分數量,也可藉由來加以控制,例如要修改物件的格線數時可以輸入:
mybox.heightsegs = 10
mybox.widthsegs = 20
mybox.lengthsegs = 10
除此之外,物件屬性中的”Generate Mapping Coords”也可藉由以下輸入修改:
mybox.mapCoords = true

創造物件變形
要讓物件產生變形是相當簡單的,只要藉由addmodifier的命令加上想要加在物件上的變形,就可以產生變形的效果。例如想在方盒物件上加上twist的效果,並設定30度的轉角,可以輸入:
addmodifier mybox (twist angle:30)
之後檢視畫面便可以看到box物件的改變,同時在物件編修選項中,也可以看到其中加上了twist的選項,angle的參數值為30。

改變物件變形參數
當進行完上述動作後,在編修面板中便會加上了twist的編修指令,而若要針對此一參數加以修改,也可藉由「點語法」的方式來予以修改。例如現在要把前一次的轉動角度由30度改為60度,輸入:
mybox.twist.angle = 60

為物件加上動畫
藉由來控制動畫的進行很接近在使用介面控制的過程,藉由指定物件在不同的時間點的位置及比例,來達到物件動畫的效果。
animate on
(
at time 0 (mybox.pos = [0,0,0]; mybox.scale = [1,1,1])
at time 20 (mybox.pos = [20,-129,-130])
at time 50 (mybox.scale = [1,1,6])
at time 100 (mybox.pos = [100,100,100]; mybox.scale = [1,5,1])
)
這時畫面上的box物件便自動的產生了一連串的動畫與變形,試分述如下:
animate on - - 開啟錄影模式自動記錄以下括號內的活動
(
at time 0 (mybox.pos = [0,0,0])在時間為0時,box的位置在[0,0,0]
at time 100 (mybox.pos = [100,100,100]; mybox.scale = [1,5,1])- - 而在時
間為100時,box的位置在[0,0,0]而比例為[1,5,1]
)
所以animate on ( )內可以同時記錄多筆物件的動畫執行。

Controlling Program Flow in Scripts
if判斷式
所謂的if判斷式就是藉由if…then(如果…就…)的方式來進行程式的判斷,來決定物件的屬性或是參數值。例如:
if mybox.height == 10 then mybox.width = 20
而除了if…then的判斷式外,if判斷式還提供了另一種延伸的判斷方式,就是if…then…else…(如果…就…不然…)的方式來定義新的參數值。而在程式的寫法主要可以將程式用一行完全寫出,或是依其命令區分為多行。例如:
if mybox.height == 10 then mybox.width = 20 else mybox.width = 10
或是
if b.height == 10
then b.width = 20
else b.width = 10

迴圈
在maxscript的語法中也提供了一般程式設計中,用來解決重複執行命令的迴圈,而其中常用的有for迴圈及while…do迴圈兩種,分別加以說明。

for迴圈
在程式設計中為解決大量而且重複的命令運算時,最常使用for迴圈來進行,以下是個最常見的迴圈設計(請參見其他相關程式設計書藉):
for i = 1 to 5 do -- 當i的數值是1,運算到i的數值是5,重複執行以下程式
(
box_copy = copy mybox
box_copy.pos = [i * 50, 0, 0]
)
上述的運算是假設for迴圈的增加值是1時,若增加值是除了1以外的數值時,可以藉由下列的方式加以設計:
for i = 1 to 5 by 2 do -- 當i的數值是1,運算到i的數值是5,一次增加2
(
box_copy = copy mybox
box_copy.pos = [i * 50, 0, 0]
)

while and do迴圈
在maxscript的語法中針對while及do提供了兩個不同的迴圈型式,分別是:
do while -- do loop
while do -- while loop
最簡單的方程式如下:
x=10
while x>0 do print (x-=1)
或是
x=10
do print (x-=1) while x>0

自定函數
在程式設計時,可以設定一函數來指定程式依指定的方式加以運作,而且可以重複的加以呼叫,節省不斷重複使用相同的程式碼。在maxscript中函數的編寫方式為:
fn function_name …… =
(
+
………
)
接下去在listener面板中輸入:function_name ……後,maxscript便會自動執行函式。例如下列的例子會產生名為testFunction的函式,藉由此函式的運作會產生一個指定長、寬但卻隨機產生高度的方盒物件:
fn testFunction x y z =
(
mybox = box()
mybox.height = x
mybox.width = y
mybox.length = z
t = random x y
mybox.pos = [t,y,z]
)

台長: 人工生命
人氣(255) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 心情日記(隨筆、日記、心情手札)

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文