研究開発

ブロックを積む(6)

第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;