• このエントリーをはてなブックマークに追加

GDLスクリプトによるオブジェクトの作り方(中級編)

初級編で作成したカラーボックスに縦横の段数設定を加えてみましょう。

はじめに、知っておくと便利なプログラム制御について紹介します。

0

1.プログラム制御

1)コメント

「!」をスクリプトの前に記述すると、プログラムはその行のスクリプトの実行を無視します。第三者が見ても理解できるように、スクリプトや計算式のコメントを自由に記述することが出来ます。

1

2)フロー制御

例えば、棚板を5分割したい場合は、座標変換とblockコマンドを4回繰り返す必要があります。スクリプトは以下のようになります。

add 0,0,高さ/5

block 幅,奥行,厚さ

add 0,0,高さ/5

block 幅,奥行,厚さ

add 0,0,高さ/5

block 幅,奥行,厚さ

add 0,0,高さ/5

block 幅,奥行,厚さ

2

しかし、段数を固定しない場合はどのようにスクリプトを書けばよいでしょうか?

このような場合にフロー制御を使います。まずは、段数を固定値としてフロー制御を使って書くと以下のようになります。

 

for i=1 to 4

add 0,0,高さ/5

block 幅,奥行,厚さ

next i

 

更に、分割数を変数に入れ替えると

何回でも実行を繰り返すことが可能になります。

 

for i=1 to 分割数の変数

add 0,0,高さ/分割数の変数-1

block 幅,奥行,厚さ

next i

 

3)サブルーチン制御

スクリプトは複雑になっていくと、動作が重たくなるだけでなく、不具合(バグ)も発生しやすくなります。使用するコマンドをサブルーチン化することで、繰り返し記述するスクリプトを単純化でき、不具合が発見しやすくなります。

 

例えば、2種類のblockを書く場合(座標変換は記述していません)

block 幅A,奥行A,高さA

block 幅B,奥行B,高さB

 

となりますが、サブルーチンで書くと

 

gosub 10

gosub 20

end

10:

block 幅A,奥行A,高さA

return

20:

block 幅B,奥行B,高さB

return

 

となります。

※gosubとはラベル番号のついたサブルーチンに行くという宣言です。

※10:や20:はラベルといいます。サブルーチンの場所を差します。

※一番最初のサブルーチンの行の前には必ずendを付けて、本文の終了を宣言します。

※サブルーチンは必ずreturnを付けて元に戻るようにします。

 

更に、パラメータをコマンド毎に定義すると

幅=幅A

奥行=奥行A

高さ=高さA

gosub 10

幅=幅B

奥行=奥行B

高さ=高さB

gosub 10

end

10:

block 幅,奥行,高さ

return

 

となり、blockコマンドは1行のみ、コマンド実行時前にパラメータを宣言するだけなので、間違いを発見しやすくなります。

 

4)条件ステートメント制御

パラメータの変数に、ある条件の数値が代入された場合、変数を指定したり、ラベルの行先を変えたりします。

 

例えば、変数が0の場合は100:を実行、変数が1の場合は200:を実行させたい場合は

以下のようになります。

 

if 変数=0 then 100:

if 変数=1 then 200:

end

100:

コマンド

return

200:

コマンド

return

 

2.カラーボックスのスクリプト(参考)

1)パラメータ

分割に関するパラメータを設定します。「タイプ」は整数に設定します。

3

2)3Dスクリプト(全文)

!パラメータの定義————–

!t_Side:側板サイズ

!t_Tana:棚板サイズ

!m_Side:側板材質

!m_Tana:側板材質

!y_step:縦分割数

!x_step:横分割数

!tateyoko:分割方法 横0 縦1 縦横2

!_x:サブルーチンに代入する変数

!_z:サブルーチンに代入する変数

 

!左板——————–

material m_side

_x=t_side

_z=zzyzx

gosub 10

 

!右板——————–

add a-t_side,0,0

_x=t_side

_z=zzyzx

gosub 10

del 1

 

!下板——————–

material m_tana

add t_side,0,0

_x=a-t_side*2

_z=t_tana

gosub 10

del 1

 

!上板——————–

add t_side,0,zzyzx-t_tana

_x=a-t_side*2

_z=t_tana

gosub 10

del 1

 

!条件式——————

if tateyoko=0 then 100

if tateyoko=1 then 200

!2の場合は横板内の条件式へ

 

!横板——————–

100:

add t_side,0,t_tana/2

y_span=(zzyzx-t_tana*2)/y_step

for i=1 to y_step-1

add 0,0,y_span

_x=a-t_side*2

_z=t_tana

gosub 10

next i

del  y_step

 

!条件式——————

if tateyoko=2 then 200

end

 

!縦板——————–

200:

add t_side/2,0,t_tana

x_span=(a-t_tana*2)/x_step

for i=1 to x_step-1

add x_span,0,0

_x=t_side

_z=zzyzx-t_tana*2

gosub 10

next i

del  x_step

end

 

!サブルーチン—————–

10:

block _x,b,_z

return