3D指令碼 maxscript入門教程(4)

2022-07-22 03:06:15 字數 4283 閱讀 6844

(2013-05-23 18:26:25)

**▼標籤: 

分類: 指令碼

4、流程控制

通過以前的學習,我們知道使用構造器來建立單個的物件,現在就來大量建立物件,輕鬆地完成手工要費很大的力氣才能完成的事。

for 迴圈

輸入 :

for i in 1 to 4 do box pos:[i*50,0,0]

看看下面的flash動畫可以形象的理解for迴圈。

for迴圈動畫

if 條件

x=20

y=65

if x>y then print x else print "x沒有y大"

--第三句的中文意思是:如果 x 大於 y 那麼 列印 x 否則 列印 "x沒有y大" ,結果返回 "x沒有y大"。繼續輸入:

x=70

if x>y then print x else print "x沒有y大"

--結果返回70

綜合使用

fc=freecamera pos:[-100,0,0]

rotate fc (eulerangles 90 0 -90)

move fc [-100,0,0]

for i in 1 to 6 do sphere pos:[i*30,0,0] segments:16 radius:10

輸入上面**,生成場景物件備用  。

現在根據物體離攝影機的距離調整物體的分段數,攝影機在x軸-100位置上,離它最近的乙個球體在x軸30的位置上。測量兩個物件之間距離的函式是distance,輸入:distance fc $sphere01 返回130.0,說明攝影機和左邊的第乙個球體之間的距離是130。輸入:

for i in $sphere* do

if distance fc i>160 then i.segs=4

距離攝影機大於160的球體分段數精簡到4。

輸入:for i in $sphere* do (

if distance fc i>180 then i.segs=8

if distance fc i>240 then i.segs=4

)注意,**塊要用( )包起來,不然程式只執行第乙個if語句。這段**使距離攝影機大於180的球體分段數精簡到8,大於240的球體分段數精簡到4 。

4、動畫原理

設定兩個不同的關鍵幀就可以動畫了。輸入下面的**建立球體沒x軸的運動的動畫:

s=sphere pos:[-50,0,0] radius:10

animate on

(at time 0 s.pos.x=-50

at time 100 s.pos.x=50

)四、換一角度——從大家熟悉的操作流程來學習指令碼

這是對前面知識的總結,前面是對語法基本概念的學習,現在是從大家操作流程的角度來學習,一縱一橫,讓我們對指令碼有個相對全面的了解,理論和實際相互聯絡。 有了前面的基礎才好學下面的內容。

第一步:建立物體

建立目標攝影機

方法見示例欄目中《地面和樹-混合材質的用法》一文

第二步:選擇物體

這裡說的是廣義上的選擇,即操作指定的物件。以前要改變場景中的物件,首先要選擇這個物件。在maxscript中可以在物件沒有被選中的情況下改變物件。這要綜合運用前面講到的路徑名,選擇集,內建物件集,流程控制項等等。

遍歷選擇集

先隨便建立幾個物件,然後選擇它們,例如輸入:

box()

box()

sphere()

cylinder()

sphere()

先用手工把它們全部選擇,此時這些被選擇的物件被稱為選擇(selection),這是物件集之一。輸入下面的**進行遍歷選擇的第乙個物件,把它們的名字顯示出來:

for i in selection do print i.name

返回結果如下:

"box02"

"cylinder01"

"box01"

"sphere02"

"sphere01"

輸入 selection.count,結果返回5,說明選擇的總數是5個。

輸入 selection[1],結果返回$box:box02 @ [0.000000,0.000000,0.000000],說明第乙個元素是box02。

這和前面的for迴圈有什麼區別?前面的是for i in 1 to 4 do box pos:[i*50,0,0] , 變數i的範圍在1到4,這裡是物件集合selection,集合已經存在變數的範圍了,這個變數 i 就是那些物件本身,遍歷的次數就是選擇的總數5,當第一次迴圈時,程式就找到選擇集中的第乙個元素box02,相當於 selection[1],其它以此類推。下面的**進行更複雜的操作,把它們沿x軸間隔為40個單位進行分開:

for i in 1 to selection.count do selection.pos.x=selection.pos.x+i*40

這裡的i是數目,selection是元素,是元素的索引,根據 i 的值指向對應的元素,在這裡是指向那五個物件之一。

根據指定條件選擇

繼續使用上面建立的物件。

示例1:根據物件是否具備某種屬性來選擇

for i in geometry where hasproperty i "radius" do i.pos=10

在建立的幾何體中把具有半徑屬性的物體選擇出來,並改變半徑大小。結果那兩個球體和乙個圓柱體的半徑變成10。where是表示指定的條件, hasproperty i "radius" 是條件,用來判斷物件 i 是否具有 radius 屬性,返回true或者false。

示例2:根據物件是否符合指定類來選擇

for i in geometry where classof i = = box do i.pos = i.pos+[0,30,0]

示例3:根據物件的屬性值是否符合指定值來選擇

for i in geometry where i.pos.y ==0 do i.pos = i.pos+[0,30,0]

y軸座標為0的物件都向y軸移動了30。

第三步:變換物體

1、變換方法:postion,move,scale,rotate,前面已經講過。

2、變換座標系和變換中心

變換座標系統:coordsys關聯表示式

[ in ] coordsys world 使用世界空間座標系統

[ in ] coordsys local 使用物件自身的座標系統

[ in ] coordsys parent 使用物件的父座標系統

[ in ] coordsys grid 使用網格座標系統

[ in ] coordsys screen 使用螢幕座標系統

[ in ] coordsys 使用指定的節點物件座標系統,相當於在介面中以拾取的物件作為座標系統

變換中心: about關聯表示式

about selection 以選擇集為變換中心

about pivot 以物件的基準點為變換中心

about coordsys 以當前使用的座標系統的原點為變換中心  

about 以拾取的節點物件的基準點為變換中心

示例一:基本功

先建立兩個物件作為示例物體:

cy=cylinder()

b=box length:10 width:50 pos:[100,0,0]

然後分別執行下面的**:

rotate b (eulerangles 0 0 90)

--box旋轉了自身90度。

in coordsys world rotate b (eulerangles 0 0 90)

--box旋轉了自身90度,和上面相同,這是因為變換中心預設是使用物件自身的基準點。

in coordsys world about coordsys rotate b (eulerangles 0 0 45)

--圍繞世界座標系旋轉了45度,變換中心是世界座標系中心。

in coordsys cy about coordsys rotate b (eulerangles 0 0 90)

--變換座標系是圓柱體cy,b以圓柱體cy座標系原點為變換中心旋轉了90度。

示例二:小應用--一張桌子四條凳

zhuozi=cylinder radius:80 height:60 wirecolor:white

for i in 1 to 4 do (

dengzi=box length:50 height:40 pos:[100,0,0] wirecolor:white

in coordsys zhuozi about coordsys rotate dengzi (eulerangles 0 0 (90*i))

)

不要為3d而3d

和以前的幾個朋友聊天,也有做game的。發現大家對3d技術都非常熱衷,但是這種熱衷顯得刻意的 為3d而3d,就有點捨本逐末。1 遊戲最重要的是策劃,需要具體的滿足人心底的某種需求,2 3d需要 好顯示卡的支援,這樣就將一部分使用者排斥在外面了。3 現在3d engine已經 很成熟了,通過這些上面的...

Unity3D 指令碼入門

1 資料型別和基本運算 a 命名空間就像在檔案系統中乙個資料夾容納多個檔案一樣,可以看作某些類的乙個容器。通過把類放入命名空間可以把相關的類組織起來,並且可以避免命名衝突。命名空間既用作程式de 內部 組織系統,也用作 外部 組織系統。使用命名空間 using 2 整型 整數 8個名稱 sbyte ...

unity3d 指令碼入門

1 virtual和override a virtual 用在基類中,指定乙個虛方法 屬性 表示這個方法 屬性 可以重寫。b override 用在派生類中,表示對基類虛方法 屬性 的重寫。class test2 test public sealed override void show 執行的結果...