ブロックを積む(6)
「はじめてのVectorScript」と題して連載を始めるわけですが、本連載は「Vectorworksは持っているけどVectorScriptって何?」、「プログラミングって難しいんでしょ?」「アイデアはあるんだけど...」という人が「それ、VectorScriptでやれば簡単だよね」と言えるくらいになるのが目標です。
VectorworksはMacintosh版とWindows版とのマルチプラットホーム環境でありながらも、VectorScriptはOSを意識することのなくプログラミングが可能で、どちらでプログラミングしてもソースコードの変更なしでMacintosh、Windowsどちらでも実行が可能です。そしてVectorworksを持っていればいますぐにでも始められます。
ゲーム機の場合、DQ7(ソフト)で遊びたいという理由で3DS(ハード)を選ぶと思います。「このソフト(あなたが書いたスクリプト)を使いたいためにVectorworksを選びました」と言わせるようなプログラムを目指してがんばりましょう。自分のアイデアをプログラム化しブログで公開なんてことも夢ではありません。
第6章 続3D図形の描画
3D図形の描画ではブロック塀ということで、柱状体に関するAPIの話をしましたが、Vectorworksにはそのほかにも多数の図形があります。
多段柱状体、3D基準点、3D多角形、回転体…。
その前に、柱状体を作る手続き、
手続き BeginXtrd(startDistance, endDistance : REAL)
手続き EndXtrd;
ですが、続2D図形の描画で出てきた図形を挟むとどうなるでしょう。
BeginXtrd( 0, 10 ); Oval( 10, 20, 60, 50 ); EndXtrd;
BeginXtrd( 0, 10 ); Arc( 10, 20, 50, 60, 45, 90 ); EndXtrd;
BeginXtrd( 0, 10 ); ArcByCenter(10, 20, 40, 0, 360 ); EndXtrd;
BeginXtrd( 0, 10 ); Poly( 0, 0, 0, 20, 20, 20, 20, 0 ); EndXtrd;
BeginXtrd( 0, 10 ); ClosePoly; BeginPoly; AddPoint( 0, 0 ); CurveTo( 0, 20 ); CurveThrough( 20, 20 ); ArcTo( 20, 0, 10 ); EndPoly; EndXtrd;
PROCEDURE sample; VAR ii : INTEGER; BEGIN OpenPoly; BeginXtrd( 0, 10 ); BeginPoly; FOR ii := 0 TO 4 DO BEGIN AddPoint( 0+ii*20, 0 ); AddPoint( 10+ii*20, 10 ); END; EndPoly; EndXtrd; END; Run( sample );
このように、2D図形を選択してコマンドEをしたときと同じように、色々柱状体を作ることができます。
つづいて、多段柱状体を描いてみましょう。一見すると、柱状体の手続きにMが入っただけです。
手続きBeginMXtrd(startDistance, endDistance : REAL);
手続きEndMXtrd;
柱状体と同じように、2D図形を挟むのですが、2つの2D図形を描くことによって、上面と下面のことなる多段柱状体になります。
BeginMXtrd( 0, 30 ); Rect( 10, 20, 60, 50 ); Rect( 20, 30, 50, 40 ); EndMXtrd;
BeginMXtrd( 0, 30 ); Oval( 10, 20, 60, 50 ); Oval( 20, 30, 50, 40 ); EndMXtrd;
異なる2D図形を描くとどうなるでしょう。
BeginMXtrd( 0, 30 ); Rect( 10, 20, 60, 50 ); Locus( 20, 30 ); EndMXtrd;
複数の2D図形を描くことによって、多段柱状体になります。
BeginMXtrd( 0, 30 ); Rect( 10, 20, 60, 50 ); Rect( 20, 30, 50, 40 ); Rect( 10, 20, 60, 50 ); EndMXtrd;
BeginMXtrd( 0, 30 ); Oval( 10, 20, 60, 50 ); Oval( 20, 30, 50, 40 ); Oval( 10, 20, 60, 50 ); EndMXtrd;
BeginMXtrd( 0, 30 ); Rect( 10, 20, 60, 50 ); Locus( 35, 35 ); Rect( 10, 20, 60, 50 ); EndMXtrd;
つづいて、3D基準点を描いてみましょう。
手続きLocus3D(pX, pY, pZ : REAL);
描画したい座標値、x,y,zを入れると3D基準点が描かれます。
Locus3D( 10, 20, 30 );
次に、3D多角形を描いてみましょう。手順は2通りあります。
手続きPoly3D(x1,y1,z1,...,xn,yn,zn : REAL);
手続きBeginPoly3D;
手続きAdd3DPt(pX, pY, pZ : REAL);
手続きEndPoly3D;
Poly3Dは予め頂点数が決まっている場合に使います。
Poly3D( 0, 0, 0, 0, 20, 0, 20, 20, 0, 20, 0, 0, 20, 0, 20, 20, 20, 20, 0, 20, 20, 0, 0, 20 );
BeginPoly3D & Add3DPt & EndPoly3Dは手続きの間で頂点を追加していきます。ただし、3点以上追加しないと図形ができません。
BeginPoly3d; Add3dPt( 0, 0, 0 ); Add3dPt( 0, 20, 0 ); Add3dPt( 20, 20, 0 ); Add3dPt( 20, 0, 0 ); Add3dPt( 20, 0, 20 ); Add3dPt( 20, 20, 20 ); Add3dPt( 0, 20, 20 ); Add3dPt( 0, 0, 20 ); EndPoly3d;
さらに、FOR文で繰り返すことで頂点を追加することも可能です。
PROCEDURE sample; VAR ii : INTEGER; BEGIN BeginPoly3D; FOR ii := 0 TO 4 DO BEGIN Add3dPt( 0, 0, 0+ii*20 ); Add3dPt( 0, 20, 0+ii*20 ); Add3dPt( 20, 20, 0+ii*20 ); Add3dPt( 20, 0, 0+ii*20 ); END; EndPoly3D; END; Run( sample );
次に、回転体を描いてみましょう。
手続きBeginSweep(startAngle, arcAngle, incAngle : REAL; PitchDistance : REAL);
手続きEndSweep;
柱状体と同じように、2D図形を挟むのですが、挟んだ図形が断面となり、回転します。四角形を入れてみましょう。※レンダリングをかけています。
BeginSweep( 0, 180, 10, 0 ); Rect( 10, 20, 60, 50 ); EndSweep;
長円を入れてみましょう。※レンダリングをかけています。
BeginSweep( 0, 180, 10, 0 ); Oval( 10, 20, 60, 50 ); EndSweep;
円を入れてみましょう。※レンダリングをかけています。
BeginSweep( 0, 180, 10, 0 ); ArcByCenter( 40, 0, 20, 0, 360 ); EndSweep;
円弧を入れてみましょう。※レンダリングをかけています。
BeginSweep( 0, 180, 10, 0 ); ArcByCenter( 40, 0, 20, -30, 60 ); EndSweep;
2D基準点をいれることで中心の位置がかわります。※レンダリングをかけています。
BeginSweep( 0, 180, 10, 0 ); Locus( 30, 0 ); ArcByCenter( 40, 0, 20, -30, 60 ); EndSweep;
回転体の上下をずらすことでバネのような回転体が描けます。※レンダリングをかけています。
BeginSweep( 0, 1080, 10, 20 ); Locus( 30, 0 ); ArcByCenter( 40, 0, 20, -30, 60 ); EndSweep;