ブロックを積む(5)
「はじめてのVectorScript」と題して連載を始めるわけですが、本連載は「Vectorworksは持っているけどVectorScriptって何?」、「プログラミングって難しいんでしょ?」「アイデアはあるんだけど...」という人が「それ、VectorScriptでやれば簡単だよね」と言えるくらいになるのが目標です。
VectorworksはMacintosh版とWindows版とのマルチプラットホーム環境でありながらも、VectorScriptはOSを意識することのなくプログラミングが可能で、どちらでプログラミングしてもソースコードの変更なしでMacintosh、Windowsどちらでも実行が可能です。そしてVectorworksを持っていればいますぐにでも始められます。
ゲーム機の場合、DQ7(ソフト)で遊びたいという理由で3DS(ハード)を選ぶと思います。「このソフト(あなたが書いたスクリプト)を使いたいためにVectorworksを選びました」と言わせるようなプログラムを目指してがんばりましょう。自分のアイデアをプログラム化しブログで公開なんてことも夢ではありません。
第5章 続2D図形の描画
2D図形の描画ではブロック塀ということで、四角形に関するAPIの話をしましたが、Vectorworksにはそのほかにも多数の図形があります。
直線、長円、円/円弧、2D基準点、多角形、曲線...。
まずは、直線を描いてみましょう。手順は2通りあります、それぞれペアで使うのが基本です。
手続きMoveTo(pX, pY : REAL);
手続きLineTo(pX, pY : REAL);
手続きMove(moveDX, moveDY : REAL);
手続きLine(lineDX, lineDY : REAL);
手続きMoveToはペンを目的の座標値まで、上げた状態で移動し、手続きLineToはペンを目的の座標値まで、下げた状態で移動します。ペンプロッタで線を描くのをイメージしてみてください。実際に線を描くのはLineToですが、線の描き始め位置までペン先を移動するのはMoveToの役目です。
MoveTo( 10, 20 ); LineTo( 60, 50 );
LineToを続けて書くと線が繋がったように描画されます。
MoveTo( 10, 20 ); LineTo( 60, 50 ); LineTo( 80, 50 ); LineTo( 60, 20 ); LineTo( 10, 20 );
FOR文で繰り返すことで、簡単に連続複製したように描くこともできます。
PROCEDURE sample; VAR ii : INTEGER; BEGIN FOR ii := 0 TO 4 DO BEGIN MoveTo( 10+ii*10, 20 ); LineTo( 60+ii*10, 50 ); END; END; Run( sample );
手続きMoveと手続きLineは、手続きMoveToと手続きLineToに似ていますが、始点から終点へではなく、始点からx方向にxx、y方向にyyと、与える数値が座標値ではなく、移動量になります。
つづいて、長円を描いてみましょう。 長円を描く手続きは2つあります。
手続きOval(p1X, p1Y, p2X, p2Y : REAL);
手続きOvalN(orginX, orginY, directionX, directionY : REAL; width, height : REAL);
OvalはRectと同じように、4つの引数には、対角にあたる座標をいれます。
- ※ 点線の囲みはでません。
Oval( 10, 20, 60, 50 );
OvalN、これもRectangleNと同じように、角度のついた長円を描くことができます。
- ※ 点線の囲みはでません。
OvalN( 10, 20, 1, 1, 50, 30 );
つづいて、円/円弧を描いてみましょう。 円/円弧を描く手続きは2つあります。
手続きArc(p1X, p1Y, p2X, p2Y : REAL; StartAngle, ArcAngle : REAL);
手続きArcByCenter(x, y, radius : REAL; startAngl, sweepAngle : REAL);
まず、Arcですが、最初の4つの引数には、対角にあたる座標をいれます。この四角形に内接する円弧を作成します。このとき、正方形になるようにしないと曲線になってしまいます。また、円弧角が360とすると円になります。
- ※ 点線の囲みはでません。
Arc( 10, 20, 50, 60, 45, 90 );
Arc( 10, 20, 50, 60, 0, 360 );
次に、ArcByCenterは、円の公式のごとく、円の中心、半径、そして、開始角、円弧角となります。こちらも円弧角が360とすると円になります。
ArcByCenter(10, 20, 40, 45, 90 );
ArcByCenter(10, 20, 40, 0, 360 );
つづいて、2D基準点を描いてみましょう。
手続きLocus(pX, pY : REAL);
描画したい座標値、x,yを入れると2D基準点が描かれます。
Locus( 10, 20 );
次に、多角形と曲線を描いてみましょう。手順は2通りあります。
手続きSmooth(smoothType : INTEGER);
手続きPoly(x1,y1,x2,y2,...,xn,yn : REAL);
手続きBeginPoly;
手続きEndPoly;
Polyは予め頂点数が決まっている場合に使います。Smoothのパラメータで、多角形と曲線(ベジェ、キュービックスプライン、円弧)を描き分けます。
Smooth( 0 ); Poly( 0, 0, 0, 20, 20, 20, 20, 0 );
Smooth( 1 ); Poly( 0, 0, 0, 20, 20, 20, 20, 0 );
Smooth( 2 ); Poly( 0, 0, 0, 20, 20, 20, 20, 0 );
Smooth( 3 ); Poly( 0, 0, 0, 20, 20, 20, 20, 0 );
BeginPoly & EndPolyは手続きの間で頂点を追加していきます。ただし、3点以上追加しないと図形ができません。
多角形の場合、
手続きAddPoint(pX, pY : REAL);
を使います。
BeginPoly; AddPoint( 0, 0 ); AddPoint( 0, 20 ); AddPoint( 20, 20 ); AddPoint( 20, 0 ); EndPoly;
曲線(ベジェ)の場合、
手続きCurveTo(pX, pY : REAL);
を使います。
BeginPoly; CurveTo( 0, 0 ); CurveTo( 0, 20 ); CurveTo( 20, 20 ); CurveTo( 20, 0 ); EndPoly;
曲線(キュービックスプライン)の場合、
手続きCurveThrough(pX, pY : REAL);
を使います。
BeginPoly; CurveThrough( 0, 0 ); CurveThrough( 0, 20 ); CurveThrough( 20, 20 ); CurveThrough( 20, 0 ); EndPoly;
曲線(円弧)の場合、
手続きArcTo(pX, pY : REAL; radiusDistance : REAL);
を使います。
BeginPoly; ArcTo( 0, 0, 10 ); ArcTo( 0, 20, 10 ); ArcTo( 20, 20, 10 ); ArcTo( 20, 0, 10 ); EndPoly;
また曲線は、頂点形状を組み合わせることも可能です。
BeginPoly; AddPoint( 0, 0 ); CurveTo( 0, 20 ); CurveThrough( 20, 20 ); ArcTo( 20, 0, 10 ); EndPoly;
さらに、FOR文で繰り返すことで頂点を追加することも可能です。
PROCEDURE sample; VAR ii : INTEGER; BEGIN BeginPoly; FOR ii := 0 TO 4 DO BEGIN AddPoint( 0+ii*20, 0 ); AddPoint( 10+ii*20, 10 ); END; EndPoly; END; Run( sample );
最後に、多角形、曲線の始点と終点を開くか、閉じるかは
手続きOpenPoly;
手続きClosePoly;
を、多角形、曲線を描く前に実行します。
ClosePoly; Smooth( 0 ); Poly( 0, 0, 0, 20, 20, 20, 20, 0 );
ClosePoly; BeginPoly; AddPoint( 0, 0 ); CurveTo( 0, 20 ); CurveThrough( 20, 20 ); ArcTo( 20, 0, 10 ); EndPoly;