2018年9月26日(水) 05:49 JST

2016年度第3回GDL講習会

  • 2016年5月 9日(月) 19:23 JST
  • 投稿者:

3回目となる今回は、シェルの作り方を学びます。GDLを用いて、自由なシェルをモデリングしていきます。

放物線シェル 球面

GDLには、ほかのプログラミング言語と同様に、配列があります。配列とは、同じ種類の値を番号づけて管理できる箱のようなものです。今回は、この配列と、直線を引くコマンドLIN_用いて、シェルを作っていきます。

放物線曲線シェル

まずは、放物線を用いたシェルを作ってみます。 もととなる式は下記です。

放物線の式
	DIM x[],y[],z[] !!格納用配列の宣言
	
	w = 30 : d = 40   !!シェルのx,y方向の幅
	Qw = 10 : Qd = 10 !!x,y方向のの分割数
	
	!!それぞれの初期化
	!!必要な点の数は (分割数 + 1) 
	!!x方向
	FOR i=1 TO Qw + 1
		x[i] = (i - 1) * w / Qw -w / 2 !! 頂点を原点にするために幅の半分だけずらす
	NEXT i
	
	!!y方向
	FOR j=1 TO Qd + 1
		y[j] = (j - 1) * d / Qd
	NEXT j
	
	!!z座標
	FOR i=1 TO Qw + 1
		z[i] = (1 / 20) * x[i] ^ 2
	NEXT i
	
	!!x軸方向の線を引く
	FOR j = 1 TO Qd + 1
		FOR i = 1 TO Qw !! 0番目と1番目、1番目と2番目、…、Qw番目と(Qw + 1)番目を結ぶ
			LIN_ x[i],y[j],z[i],x[i + 1],y[j],z[i + 1]
		NEXT i
	NEXT j

	!!y軸方向の線を引く
	FOR j = 1 TO Qd !! 0番目と1番目、1番目と2番目、…、Qd番目と(Qd + 1)番目を結ぶ
		FOR i = 1 TO Qw + 1
			LIN_ x[i],y[j],z[i],x[i],y[j + 1],z[i]
		NEXT i
	NEXT j
	
	!! 頂点確認用の球を配置
	FOR j = 1 TO Qd + 1
		FOR i = 1 TO Qw + 1
			ADD x[i],y[j],z[i]
				SPHERE 0.2
			DEL 1
		NEXT i
	NEXT j

放物線のシェルができました。もし、ドームのようにするなら、z座標の値をマイナスにしてみるといいでしょう。

球面

次に、配列と媒介変数表示を用いて、曲面を作ってみます。 媒介変数表示は、x,y,z座標をほかの変数で表すものです。 有名なものに、極座標や球面座標があります。地球の緯度経度も球面座標の1つです。この球面座標を使って球面を作ってみます。式は下記のようになります。x,y,zがθ(緯度)とφ(経度)で表されています。 このθとφを先ほどのiとjのように使ってみます。 xとyにはθとφの2つの変数が含まれているので、2次元配列、 zにはθの1つの変数が含まれているので1次元配列とします。

球面座標系の式
	th = 180 : ph = 360 !! θ、φの範囲
	Qth = 20 : Qph = 20 !! θ、φの分割数
	
	!!!!!!!!ここから!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	r = 1 !! 球面のパラメータ(半径)
	
	DIM x[][],y[][],z[]
	FOR i = 1 TO Qth + 1
		FOR j = 1 TO Qph + 1
			th_i = (i - 1) * th / Qth           !! θの値
			ph_j = (j - 1) * ph / Qph           !! φの値
			x[i][j] = r * SIN(th_i) * COS(ph_j)
			y[i][j] = r * SIN(th_i) * SIN(ph_j)
		NEXT j
	NEXT i
	
	FOR i = 1 TO Qth + 1
		th_i = (i - 1) * th / Qth
		z[i] = r * COS(th_i)
	NEXT i
	!!!!!!!!ここまで!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	
	!! 緯線(赤道)方向の線
	FOR i = 1 TO Qth + 1
		FOR j = 1 TO Qph !! 0番目と1番目、1番目と2番目、…、Qph番目と(Qph + 1)番目を結ぶ(①)
			LIN_ x[i][j],y[i][j],z[i],x[i][j + 1],y[i][j + 1],z[i]
		NEXT j
	NEXT i
	
	!! 経線(子午線)方向の線
	FOR i = 1 TO Qth !! 0番目と1番目、1番目と2番目、…、Qth番目と(Qth + 1)番目を結ぶ(②)
		FOR j = 1 TO Qph + 1
			LIN_ x[i][j],y[i][j],z[i],x[i + 1][j],y[i + 1][j],z[i + 1]
		NEXT j
	NEXT i
	

球面ができました。①と②は、緯線と経線がFOR文でどのように線が引かれているかを示しています。

一葉双曲面

スクリプト中の、「ここから」と「ここまで」に囲まれた部分を変えると、様々な曲面を作ることができます。次の式は一葉双曲面の式です。この式をGDLで表現し、球面の式の「ここから」と「ここまで」の部分を置き換えます。

一葉双曲面の式
	a = 3 : b = 4 : c = 0.1 !!一葉双曲面のパラメータ
	DIM x[][],y[][],z[]
	FOR i = 1 TO Qth + 1
		FOR j = 1 TO Qph +1
			th_i = ((i - 1) * th / Qth - th / 2)/40
			ph_j = (j - 1) * ph / Qph
			x[i][j] = a * COS(ph_j) + th_i * a * SIN(ph_j)
			y[i][j] = b * SIN(ph_j) - th_i * b * COS(ph_j)
		NEXT j
	NEXT i
	FOR i = 1 TO Qth + 1
		th_i = (i - 1) * th / Qth
		z[i] = c * th_i
	NEXT i

正葉曲線を用いた曲面

正葉曲線の式

これもGDLで記述して球面のスクリプトの「ここから」と「ここまで」と置き換えてみましょう。

	!!zも2次元配列にしてください
	DIM x[][],y[][],z[][]
	
	n = 2 !! 正葉曲線のパラメータ
	FOR i = 1 TO Qth + 1
		FOR j = 1 TO Qph + 1
			th_i = (i - 1) * th / Qth
			ph_j = (j - 1) * ph / Qph
			x[i][j] = SIN(n * ph_j) * SIN(th_i) * COS(ph_j)
			y[i][j] = SIN(n * ph_j) * SIN(th_i) * SIN(ph_j)
			z[i][j] = SIN(n * ph_j) * SIN(2 * th_i) / 4
			!! x,yが原点に来るとき、zも0になるように調整
		NEXT j
	NEXT i
	!! 線を書く部分のzも2次元配列にしてください

外サイクロイドを用いた曲

外サイクロイドの式

最後は外サイクロイドを用いた曲面です。これまでの例でも同様ですが、スクリプト中で「パラメータ」とある値は、形状を決めるための係数です。変えてみると、違った印象の曲面ができるかと思います。

	rc = 5 : rm = 1 !! 外サイクロイドのパラメータ
	
	DIM x[][],y[][],z[]
	
	FOR i = 1 TO Qth + 1
		FOR j = 1 TO Qph + 1
			th_i = (i - 1) * th / Qth
			ph_j = (j - 1) * ph / Qph
			x[i][j] = ((rc + rm) * COS(ph_j) - rm * COS((rc + rm) / rm * ph_j)) * SIN(th_i)
			y[i][j] = ((rc + rm) * SIN(ph_j) - rm * SIN((rc + rm) / rm * ph_j)) * SIN(th_i)
		NEXT j
	NEXT i
	
	FOR i = 1 TO Qth + 1
		th_i = (i - 1) * th / Qth
		z[i] = rc * COS(th_i)
	NEXT i

次回はシェルコンテストです。これまでの講習会の成果を活用してかっこいいシェルをモデリングしてくるという所謂中間発表です。近年の傾向として上記のような数学的な曲線や方程式をもちい、思いがけないものを発生させるというアプローチを楽しんでいる作品も増えていますが、プログラミング言語によるモデリングには狙った形を正確に作ることができるという建築やデザインにおいては大きなメリットとなる特徴もあります。どんなシェルを作るかという構想の段階で少しこういった特徴を踏まえながら考えてみるとよいかもしれません。