当方の「Script!3D」を使って立体を作ろう話その19。
今回は、球の作図命令です。

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

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

分割数を多くすれば綺麗に見えますが、データ量が大きくなりますので ほどほどでどうぞ。
球を横にずらっと並べてみます。

Y軸方向にも同じく作図してみます。
色を乱数で指定してみます。

ついでにZ軸方向にも同じく作図してみます。
三重ループで1000個も描かせると流石に遅いです。3分位かかります。([ESC]キーを押すと実行中断します)時間が掛かる場合は「□Log出力をしない」にチェックを入れて実行すると速くなります。当方のPCで10×10×10で約20秒位です。

次に円状に並べてみます。

円柱を置いて球を斜めに複数個配置したい場合です。

以前ロゴを作った際、水滴を模した球をロゴの周り?にバラバラに配置したようなものがありましたが、乱数でてきとうに球を何個も描きたい、というような場合は以下のようになります。

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

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

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

分割数を多くすれば綺麗に見えますが、データ量が大きくなりますので ほどほどでどうぞ。
球を横にずらっと並べてみます。
// 球作図テスト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

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

ついでに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

次に円状に並べてみます。
// 球作図テスト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

円柱を置いて球を斜めに複数個配置したい場合です。
// 球作図テスト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

以前ロゴを作った際、水滴を模した球をロゴの周り?にバラバラに配置したようなものがありましたが、乱数でてきとうに球を何個も描きたい、というような場合は以下のようになります。
// 球作図テスト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



このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。