当方の「Script!3D」を使って立体を作ろう話その19。
今回は、球の作図命令です。
球の作図
SPHERE n,sp,r,f
原点・作図基準平面は、変換マトリックスとなります。
n : (out) 登録された最終図形要素番号(1〜)
sp: 分割数(4-1000) (偶数指定)
r : 半径[mm] (>0)
f : 表裏逆フラグ 0:外側が表面 1:内側が表面
まずは球1つを作図する簡単例です。
// 球作図テスト01
#VAR
 sp = 12   ;*分割数
 n
#DRAW
 PEN 60
 SPHERE n,sp,50,0
実行します。
20090302a

分割数を24にしてみます。
20090302b

分割数を48にしてみます。
20090302c

分割数を多くすれば綺麗に見えますが、データ量が大きくなりますので ほどほどでどうぞ。

球を横にずらっと並べてみます。
// 球作図テスト02
#VAR
 sp = 12   ;*分割数
 sr = 50   ;*球の半径
 nx = 10   ;*横に並べる数
 ds = 10   ;*間隔
 i
 ix
 iy
 iz
 n
#DRAW
 PEN 61
 CAL i = 0
 CAL ix = 0
 CAL iy = 0
 CAL iz = 0
 #WHILE (i < nx)
  MATRIXO ix,iy,iz
  SPHERE n,sp,sr,0
  CAL ix = ix + sr*2 + ds
  CAL i = i + 1
 #END
実行します。
20090302d


Y軸方向にも同じく作図してみます。
色を乱数で指定してみます。
// 球作図テスト03
#VAR
 sp = 12   ;*分割数
 sr = 50   ;*球の半径
 nx = 10   ;*X軸に並べる数
 ny = 10   ;*Y軸に並べる数
 ds = 10   ;*間隔
 i
 j
 ix
 iy
 iz
 co
 n
#DRAW
 RANDOMIZE
 CAL iz = 0
 CAL iy = 0
 CAL j = 0
 #WHILE (j < ny)
  CAL ix = 0
  CAL i = 0
  #WHILE (i < nx)
   MATRIXO ix,iy,iz
   CAL co = INT(RAND(256))
   PEN co
   SPHERE n,sp,sr,0
   CAL ix = ix + sr*2 + ds
   CAL i = i + 1
  #END
  CAL iy = iy + sr*2 + ds
  CAL j = j + 1
 #END
実行します。
20090302e


ついでにZ軸方向にも同じく作図してみます。
三重ループで1000個も描かせると流石に遅いです。3分位かかります。([ESC]キーを押すと実行中断します)時間が掛かる場合は「□Log出力をしない」にチェックを入れて実行すると速くなります。当方のPCで10×10×10で約20秒位です。
// 球作図テスト04
#VAR
 sp = 12   ;*分割数
 sr = 50   ;*球の半径
 nx = 10   ;*X軸に並べる数
 ny = 10   ;*Y軸に並べる数
 nz = 10   ;*Z軸に並べる数
 ds = 10   ;*間隔
 i
 j
 k
 ix
 iy
 iz
 co
 n
#DRAW
 RANDOMIZE
 CAL iz = 0
 CAL k = 0
 #WHILE (k < nz)
  CAL iy = 0
  CAL j = 0
  #WHILE (j < ny)
   CAL ix = 0
   CAL i = 0
   #WHILE (i < nx)
    MATRIXO ix,iy,iz
    CAL co = INT(RAND(256))
    PEN co
    SPHERE n,sp,sr,0
    CAL ix = ix + sr*2 + ds
    CAL i = i + 1
   #END
   CAL iy = iy + sr*2 + ds
   CAL j = j + 1
  #END
  CAL iz = iz + sr*2 + ds
  CAL k = k + 1
 #END
実行します。
20090302f


次に円状に並べてみます。
// 球作図テスト05
#VAR
 sp = 24   ;*分割数
 sr = 50   ;*球の半径
 nr =300   ;*円状半径
 nx = 16   ;*並べる数
 i
 ia
 ix
 iy
 iz
 n
#DRAW
 PEN 63
 SPHERE n,sp,nr,0

 PEN 64
 CAL ia = 0
 CAL i = 0
 #WHILE (i < nx)
  CAL ix = nr*Cos(ia)
  CAL iy = nr*Sin(ia)
  CAL iz = 0
  MATRIXO ix,iy,iz
  SPHERE n,sp,sr,0
  CAL ia = ia + 2.0*PI/nx
  CAL i = i + 1
 #END
実行します。
20090302g


円柱を置いて球を斜めに複数個配置したい場合です。
// 球作図テスト06
#VAR
 sp = 24   ;*分割数
 sr = 50   ;*球の半径
 nr = 300  ;*円柱半径
 nz = 1000  ;*円柱高さ
 nx = 16   ;*並べる数
 na = 30   ;*傾き角度[°]
 i
 ia
 ix
 iy
 iz
 n
 w1
#DRAW
 PEN 65
 CYLIND n,sp,nr,nz,1,1,0

 CAL w1 = nz/2
 MATRIXL 0,0,w1
 CAL w1 = na/180*PI
 ROXMATR w1  // 軸を傾けます
 BAKMATR  // 変換マトリックスを一時保存

 PEN 67
 CAL ia = 0
 CAL i = 0
 #WHILE (i < nx)
  CAL ix = nr*Cos(ia)
  CAL iy = nr*Sin(ia)/Cos(na/180*PI)  // 傾けただけ楕円軌道となります
  CAL iz = 0
  MATRIXL ix,iy,iz
  SPHERE n,sp,sr,0

  RESMATR  // 一時保存した変換マトリックスに戻す
  CAL ia = ia + 2.0*PI/nx
  CAL i = i + 1
 #END
実行します。
20090302h


以前ロゴを作った際、水滴を模した球をロゴの周り?にバラバラに配置したようなものがありましたが、乱数でてきとうに球を何個も描きたい、というような場合は以下のようになります。
// 球作図テスト07
#VAR
 sp = 24   ;*分割数
 sr = 50   ;*球の半径
 ax =1000   ;*配置範囲X
 ay =1000   ;*配置範囲Y
 az = 500   ;*配置範囲Z
 nx = 50   ;*配置数
 i
 ix
 iy
 iz
 n
#DRAW
 RANDOMIZE
 PEN 70
 CAL i = 0
 #WHILE (i < nx)
  CAL ix = RAND(ax) - ax/2
  CAL iy = RAND(ay) - ay/2
  CAL iz = RAND(az) - az/2
  MATRIXO ix,iy,iz
  SPHERE n,sp,sr,0
  CAL i = i + 1
 #END
実行します。
20090302i