(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 執行的結果...