で、
多少なりとも分かり易くするため、基準点と回転角=面/軸を先に決めてから、そこを基準として図を描かせましょう、という考えをするのが簡単な場合が多いです。2D-CADでもありますが(例えばAutoCADのUCS)、ワールド座標(絶対座標)これは固定の座標系で、画面中央原点や画面左下原点が多いです、それと、作図する際に先に決めておくローカル座標(相対座標)で、これは自由に決めた点を原点(0,0)として作図する、というものです。
script!にはありませんでしたが、このscript!3Dでは、ローカル座標を扱えるようにしています。それは変換マトリックスとして指定します。ローカル座標として与えた座標に、内部で、変換マトリックスを掛けてワールド座標に変換し図形登録を行う、という仕組みになっています。
ワールド座標での作図命令は、
LINE(直線)、3SOLID(三角面)、4SOLID(四角面)、
を用意しています。
距離計測や写像では3D用の命令を用意していますし、座標の移動も、X,Y,Z座標を直接操作すれば可能です。
ローカル座標での作図命令は、
LINE2D(直線)、CIRCLE2D(円)、ARC2D(円弧)、・・・
等があります。
円、円弧、楕円、楕円弧、曲線、等は内部で直線に分解し、複数の直線データとして登録します。また、ソリッド図形も複数の三角面・四角面データとして登録します。円などは、平面上に置くという感覚で作図します。3D空間上に自由に配置というのは、自由でいいんじゃないか?と思うかもしれませんがいざ作図するとなるとかなり難しいです。それよりも、空間上に平面を想定し、その平面上に円などを描く、という考えをするのが簡単です。これも本ソフトでは、変換マトリックスでの、X-Y平面上というのを想定します。円が傾いている=平面が傾いている=傾いた変換マトリックスを用意する→その上で、紙の上に円を描けば良い、という感じです。
ローカル座標での作図命令で、(3D)と書かれている命令は、そのX-Y平面における高さを扱えるようになっているものです。変換マトリックスのZ座標方向移動をするのでも良いですが何度もあると面倒かもしれませんので用意しています。
それでは、平面を2つ、その平面上に「×」を作図する例です。
ワールド座標での例
// 平面テスト1
#VAR
x = 100 ;*X
y = 100 ;*Y
z = 100 ;*Z
l = 30 ;*線長さ
i
wx1
wy1
wz1
wx2
wy2
wz2
wx3
wy3
wz3
wx4
wy4
wz4
wx1a
wy1a
wz1a
wx2a
wy2a
wz2a
#DRAW
CAL wx1 = - x / 2
CAL wy1 = - y / 2
CAL wz1 = 0
CAL wx2 = x / 2
CAL wy2 = - y / 2
CAL wz2 = 0
CAL wx3 = x / 2
CAL wy3 = y / 2
CAL wz3 = 0
CAL wx4 = - x / 2
CAL wy4 = y / 2
CAL wz4 = 0
PEN 1
4SOLID i, wx1,wy1,wz1, wx2,wy2,wz2, wx3,wy3,wz3, wx4,wy4,wz4
PEN 2
CAL wx1a = - l
CAL wy1a = - l
CAL wz1a = 0
CAL wx2a = l
CAL wy2a = l
CAL wz2a = 0
LINE i, wx1a,wy1a,wz1a, wx2a,wy2a,wz2a
CAL wx1a = - l
CAL wy1a = l
CAL wz1a = 0
CAL wx2a = l
CAL wy2a = - l
CAL wz2a = 0
LINE i, wx1a,wy1a,wz1a, wx2a,wy2a,wz2a
// -----
CAL wx1 = - x / 2
CAL wy1 = - y / 2
CAL wz1 = 0
CAL wx2 = - x / 2
CAL wy2 = y / 2
CAL wz2 = 0
CAL wx3 = - x / 2
CAL wy3 = y / 2
CAL wz3 = z
CAL wx4 = - x / 2
CAL wy4 = - y / 2
CAL wz4 = z
PEN 3
4SOLID i, wx1,wy1,wz1, wx2,wy2,wz2, wx3,wy3,wz3, wx4,wy4,wz4
PEN 5
CAL wx1a = - x / 2
CAL wy1a = - l
CAL wz1a = z / 2 - l
CAL wx2a = - x / 2
CAL wy2a = l
CAL wz2a = z / 2 + l
LINE i, wx1a,wy1a,wz1a, wx2a,wy2a,wz2a
CAL wx1a = - x / 2
CAL wy1a = - l
CAL wz1a = z / 2 + l
CAL wx2a = - x / 2
CAL wy2a = l
CAL wz2a = z / 2 - l
LINE i, wx1a,wy1a,wz1a, wx2a,wy2a,wz2a
ローカル座標での例
// 平面テスト2
#VAR
x = 100 ;*X
y = 100 ;*Y
z = 100 ;*Z
l = 30 ;*線長さ
i
w1
wx1
wy1
wx2
wy2
wx3
wy3
wx4
wy4
wx1a
wy1a
wx2a
wy2a
#DRAW
// 変換マトリックスの初期値をそのまま使用
CAL wx1 = - x / 2
CAL wy1 = - y / 2
CAL wx2 = x / 2
CAL wy2 = - y / 2
CAL wx3 = x / 2
CAL wy3 = y / 2
CAL wx4 = - x / 2
CAL wy4 = y / 2
PEN 1
4SLD2D i, wx1,wy1, wx2,wy2, wx3,wy3, wx4,wy4
PEN 2
CAL wx1a = - l
CAL wy1a = - l
CAL wx2a = l
CAL wy2a = l
LINE2D i, wx1a,wy1a, wx2a,wy2a
CAL wx1a = - l
CAL wy1a = l
CAL wx2a = l
CAL wy2a = - l
LINE2D i, wx1a,wy1a, wx2a,wy2a
// -----
// 変換マトリックスを変更
CAL w1 = 90/180*PI
ROYMATR w1 // Y軸まわりに90°回転
CAL w1 = - x / 2
MATRIXL 0,0,w1 // Z座標方向へ移動
CAL w1 = - z / 2
MATRIXL w1,0,0 // X座標方向へ移動
CAL wx1 = - z / 2
CAL wy1 = - y / 2
CAL wx2 = z / 2
CAL wy2 = - y / 2
CAL wx3 = z / 2
CAL wy3 = y / 2
CAL wx4 = - z / 2
CAL wy4 = y / 2
PEN 3
4SLD2D i, wx1,wy1, wx2,wy2, wx3,wy3, wx4,wy4
PEN 5
CAL wx1a = - l
CAL wy1a = - l
CAL wx2a = l
CAL wy2a = l
LINE2D i, wx1a,wy1a, wx2a,wy2a
CAL wx1a = - l
CAL wy1a = l
CAL wx2a = l
CAL wy2a = - l
LINE2D i, wx1a,wy1a, wx2a,wy2a
というように、ローカル座標を使う場合は、軸を考えて、座標系をぐるっと回して移動、と操作したあとは、Z軸を全く考えずX-Yだけで考えます。
実際にスクリプトを書く前に、ラフ描き(ポンチ絵を描く)をすると分かり易いと思います。









