2015年2月3日火曜日

Maxscript その18 「for式 ループ処理その1(+whileループ)」

ループ処理の基本となるforループ、for式。「for文」などで検索すると、説明しているサイトが沢山出てくると思う。
---------
■for式1

【構文】
for i = 0 to 10 do print i

for <変数> = <初期値> to <終了値> [by <変化値>] do <式>

使える値はinteger値、float値、time値

byで変化値を変える。 byを記述しない場合の変化値は1。

for i = 0 to 10 by 2 do print i
for i = 10 to 0 by -2 do print i

複数の処理を繰り返し実行したい場合は do の後の<式>にブロック式を用いる

for i = 1 to 10 do (
    obj = Sphere()
    obj.radius = 5
    obj.pos = [i*10,0,0]
    c = (255/10)*i
    obj.wirecolor = [c,c,c]
)

上のスクリプトは多分下の書き方でも同じだと思う・・・。
for i = 1 to 10 do (
    obj = Sphere radius:5 pos:[i*10,0,0] wirecolor:(random [0,0,0][255,255,255])
    --色の記述ちょっと変えた
)

【for式で使われる変数のスコープ】

for式で定義される変数(下の場合「i」)は、for式の中だけで有効なローカル変数となるようだ。

(
    for i = 1 to 10 do (
        print i
    )
    print i
)

この場合、最後のprint iの実行結果は「undfined」 となる

【戻り値】
for式も式なので処理が終わると「OK」という答えを返す。
a = for i = 1 to 10 do ()



OK値(値>特殊データ値)

【多重ループ

どのような順番で処理がされるているか注意して確認してみる。

num = 3
for x = 1 to num do (
  for y = 1 to num do (
  for z = 1 to num do (
  format "x = %\ty = %\tz = %\n" x y z
  )
  )
)





























---------
■for式2
for <変数名> = <初期値> to <終了値> [by <変化値>] collect <変数名>

x = for i = 1 to 10 collect i
print x

この場合のfor式の戻り値は「OK」ではなく、iに代入された全ての値の配列となる。

x = for i = 1 to 10 (
    collect i*2
)
print x
---------
tips:強制ループ終了 exit
一般的にループを途中で中断させるための命令が用意されている。maxscriptにもそのためのexitという関数があるが・・・。


どういう事だ?と調べようとしたらリファレンスが「ループ終了のページ→forループのページ→ループ終了のページ」とループしていた!流石ループの説明だ。exitしたい。

exit使うとパフォーマンスが落ちるのでwhileかwhereを使ってね。という事らしい。


【例】 -- 0~100からランダムで値を取得し、50より大きい場合はforループを終了させる。
(※説明用にfor式を使っているが、この場合は下で説明するwhileループの方が適しているかもしれない)

x = 0
for i = 1 to 100 while x <50 do (
    x = random 0 100
    print x
)

while<式>の答えは(True/False)となっており、答えがFalseとなると処理が中断される

意味はないが、処理がされないfor式は以下のようになる。

for i = 1 to 100 while false do ()
---------
tips:for式とfloat値

コンピューターでのfloat値の扱いには色々あるらしい。以下は、maxの側の問題なのかコンピュータで演算する際の問題なのかは不明だが、for式の値にfloatの値を使うと以下のような事が起きる場合がある。(検索「浮動小数点 丸め誤差」)

for i = 0.0 to 10.0 by 0.1 do print i


for式に使う値は出来るだけintegerを使うようにした方が良いかもしれない。

for i = 0 to 100 do (
    print (i/10.0)
)

---------
tips:whileループとDoループ

本来、Tipsではなく、別で扱った方がいいくらい代表的なループ処理の一つ。無限ループとも言われたりしますか?Maxscriptでは2つのループが準備されている。条件の記述を間違うとループ処理が終わらず、永遠とループ処理がされてしまう。「ESC」キーを長押しすることで強制的にループ処理を止める事が出来るようだ。たまに、Maxの強制終了により強制的にループ処理を抜ける事もある。ワイルドだぜ。

do <式> while <条件>
while <条件> do <式>

例:Xに10を代入し、Xを1つづ引いていく。Xが1より小さくなるとループ処理が終わる。
x = 10
while x>0 do print (x-=1)

doとwhileの違いはdoはwhileの前に処理があるため、最低1回は処理が行われる

x =10
do (print (x-=1)) while (x>10)

x = 10
while (x>10) do (print (x-=1))
---------
ここまで来るとスクリプトで出来ることがとても増えてくる。特に大量の情報を扱うCG制作において、このループ処理がもたらす効果は本当に大きい。実際どのように使うか等の具体例は後ほどまとめて掲載したいと思う。

0 件のコメント:

コメントを投稿