忍者ブログ

≪ 前の記事次の記事 ≫

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

▲TOP

3dsMax:スクリプトを書いてみよう! 入門編 第6回

まず最初に、前回一部誤りがありました。まだ具体的なコードでは出てきていないので、訂正内容は第5回を参照お願いします。

さて、そろそろ最初の着地点に到達したいと思います。
前回のやり方で頂点2の候補のリストアップは可能になりました。
次はどうやって実際の連結先を決めるのか? になります。


流れはこうなります。

1.頂点1の番号と座標を記憶(変数に代入)

2.頂点2候補のリストを元に、その中から「一つずつ」 頂点2候補の座標を求め、頂点1との距離を求めます。

3.現時点で最も頂点1に近い距離を格納した変数と比較して,それよりも今回の距離が近い場合には距離用変数を現在の値に書き換え、最短頂点番号のリストをリセットして今回の頂点番号を加えます。同じ距離の場合は距離の変数はそのままで、最短頂点番号のリストに頂点番号をくわえます。

4.これを全ての頂点候補が終わるまで2~4を繰り返します。

5.最短頂点番号のリストの件数が1ならば、頂点連結を実行します。リストの件数が2以上の場合は処理を止めます。

このような感じになります。

青文字の部分を「ループ処理」とか「繰り返し処理」と言い、赤文字の部分を「条件分岐」とか単に「分岐」と 言います。 基本的にプログラムは「繰り返し」「分岐」「処理」があり、この3つを組み合わせた構造になっているといわれています。そして、多くのプログ ラミング言語やスクリプト等で、記述は若干異なるものの 繰り返しには「for文」が、分岐には「If文」が使われています。(言語によっては同じような 処理で違う文での記述が追加されているものもあります。)

どちらも説明が長くなりますので、詳細は割愛して、実際にコードを書いてみます。

-----こちらをクリックすると今回のスクリプトファイルがダウンロードできます。-----

使い方は、3dsMaxの「MaxScript」メニューから「スクリプトを開く」でダウンロードしたファイルを開きます。

適当な編集可能ポリゴンオブジェクトを準備して、頂点を一つだけ選択、スクリプトのウインドーをアクティブにしてCtrl+Eをすると、、、連結されると思います。

もし、何も変わらない場合は、最も選択頂点に近い頂点の候補が複数存在しています。
この状態の時には何も処理をしないように(厳密にはコマンドを実行する前の頂点選択状態)しています。
ちょっと頂点を動かして再度やってみてください。

頂点が選択されていない状態で実行するとエラーが表示されます。
複数の頂点を選択した状態で実行すると、エラーになったり、変則的に実行されたりします。

いずれのエラーもなぜそうなるのかはっきりしていますし、そういったエラーにも対処できるコードを本来書くべきですが、コードがこれ以上煩雑にならないように今回は割愛しています。

また、「穴」や「辺」と接している頂点は連結可能な頂点候補がかなり増えるのですが、これも同様の理由で割愛しています。

毎回スクリプトを開いたり、起動したりするのは面倒かと思います。
↓こちらを参考に今回のスクリプトをボタンにしていろいろなパターンを試されてください。
http://www.studio-hand.com/au_tips/au_tips_maxscript.htm


ここで一旦 入門編は終わりにします。


今回のスクリプトを書くにあたって、たった数十行なのに結構な時間がかかりました。(4時間ほど)
引っかかった点の多くがプログラミングでは基礎的な部分で、その記述の仕方です。

実際には、今回配列というものが出てきましたが、既存の配列にある数値を追加する方法はどうやるのだろうか?というような感じです。

配列A=#(1,3,10,12,15) の一番最後に 18 を追加して、#(1,3,10,12,15,18) としたい場合です。

そういう場合、ピンク画面に打ち込み、その結果を参考にしながらいろいろテストをして、記述方法を覚えて行っています。リファレンスで探すと探し方がわからない場合はとんでもなく時間がかかるので、「カン」でやるわけです。

先の配列ではこんな感じです。

ピンク画面に
A=#(1,3,10,12,15)
A=A+#(18)
A

そうすると、白画面の一番最後は
#(1,3,10,12,15,18)
と表示されます。 とりあえずこれでよさそうです。

しばらくして、配列の数を数える方法は .countで良いこと、配列のn個目の値を得たり、書き変えたい場合は変数名[n]で良いことを何かの拍子に知ったとします。
そうすると、こんな書き方はだめなのか? と考え始めます。

A=#(1,3,10,12,15) --これは一緒
A[A.count+1]=18
A
とやってみます。
そうすると、白画面の一番最後は先ほどとおなじく
#(1,3,10,12,15,18)
です。

先のほうは 「配列Aに配列#{18}を追加する。」という感じで、後者のほうは 「配列Aの最後尾(厳密に言うと、最後の次= Aの配列数+1)に18を代入する。」とニュアンスになると思います。そして、この2タイプ、追加が1つなら、どっちも大差ないですが、それ以上のときは 差が出てくるケースが考えられます。

そういう感じで、横道にそれながら、覚えていくケースがほとんどです。そうすると、だんだんとカンも良くなってきて、自分ややりたいことを記述する方法を探す時間が短くなってきます。

そういうことの繰り返しになります。

プログラミング自体パズルみたいで楽しく、さらには作業性の向上などが期待できるものです。
多くの人にそのことを感じてもらえたらと思う今日この頃です。



PR

Comment (0) | Trackback () | ▲TOP

Comment

  • メールアドレスは入力しても管理画面でしか表示されません。
  • コメント投稿時にパスワードを設定していた場合のみ、名前をクリックすると編集出来ます。

Vodafone絵文字 i-mode絵文字 Ezweb絵文字

Trackback

Trackback URL: