2018年12月18日(火) 03:58 JST

2016年度第6回GDL講習会

  • 2016年6月 7日(火) 17:12 JST
  • 投稿者:
    ゲストユーザ

第6回では三次元のソリッド演算を使って、切り欠き(ソリッド減算)や結合(ソリッド加算)によるモデリングを行いました。GDL教科書では尖頭ヴォールト屋根のモデリングを解説しているので、ここでは違う様式のモデリングの例としてペンデンティブドームを掲載します。

image


ペンデンティブドーム

ペンデンティブドームとは、二つの半球が上下に重なったような見た目の構造であり、上部の半球の重量を下部の球が四方の柱へ加重を分散させることによって大空間を可能にしているのが特徴です。上部のドームの足元には、ほとんど垂直加重のみしかかからないため、開口部が多く設置でき、内部に光を取り入れることができるとされています。代表的な建築としてはイスタンブールにあるハギア・ソフィアが挙げられます。以下にコードを示します。

leng = 10			!底辺長さ
t = 0.5				!壁厚
und_r = leng * SQR(2)		!下部半球半径
abo_r = SQR(und_r^2-leng^2)	!上部半球半径
wind_d = 0.8			!窓幅
wind_h = 1			!窓高さ
wind_num = 40			!窓数(偶数で)

RESOL 64			!曲線の滑らかさ
MATERIAL 147			!材質

!下部の半球/////////////////////////////////////
GROUP "und_ell_out"		!外側
	ELLIPS und_r , und_r
ENDGROUP

GROUP "und_ell_in"		!内側
	ELLIPS und_r - t , und_r - t
ENDGROUP

und_ell = SUBGROUP("und_ell_out","und_ell_in")	!内部を切り抜き ①
KILLGROUP("und_ell_out"):KILLGROUP("und_ell_in")!! ③
!下部トンネル部分///////////////////////////////
GROUP "sub_tunnel"
	ROTX 90
	ADDZ -leng * 1.5
	CYLIND leng * 3 , leng - t
	DEL 1
	ROTY 90
	ADDZ -leng * 1.5
	CYLIND leng * 3 , leng - t
ENDGROUP	

und_dome = SUBGROUP(und_ell , "sub_tunnel")		!トンネル切り抜き ②
KILLGROUP(und_ell)
KILLGROUP("sub_tunnel")

!下部配置//////////////////////////////////////
ADDZ leng
CUTPLANE	!半球の上部を高さでカット
	ADDZ -leng
	PLACEGROUP(und_dome)
	KILLGROUP(und_dome)
CUTEND


!上部の半球/////////////////////////////////////
GROUP "abo_ell_out"		!外側
	ELLIPS abo_r , abo_r
ENDGROUP

GROUP "abo_ell_in"		!内側
	ELLIPS abo_r - t , abo_r - t
ENDGROUP
abo_ell = SUBGROUP("abo_ell_out","abo_ell_in")	!内部を切り欠き
KILLGROUP("abo_ell_out")
KILLGROUP("abo_ell_in")

!窓の切り抜きボリューム////////////////////////
GROUP "wind_abo"
	ROTX 90
	ADD 0 , wind_h + t , -und_r
	CYLIND und_r * 2 , wind_d / 2
ENDGROUP

GROUP "wind_und"
	ADD -wind_d /2 , -und_r , t
	BRICK wind_d , und_r * 2 , wind_h
ENDGROUP

wind_part = ADDGROUP("wind_abo","wind_und")		!窓部品を結合
KILLGROUP("wind_abo")
KILLGROUP("wind_und")

!窓を円形に並べる//////////////////////////////

wind_dir = 180 / (wind_num/2)

GROUP "wind"
	FOR i = 0 TO (wind_num/2)-1
		ROTZ wind_dir
		PLACEGROUP(wind_part)
	NEXT i
	KILLGROUP(wind_part)
ENDGROUP

abo_dome = SUBGROUP(abo_ell,"wind")		!窓を切り抜き
KILLGROUP(abo_ell)
KILLGROUP("wind")
!上部配置//////////////////////////////////////
ADDZ leng
PLACEGROUP(abo_dome)
KILLGROUP(abo_dome)

使っている形は単純なものですが、ペンデンティブドームの形をうまく再現できています。最底面の長さと、壁厚のみで全体の形状が決まるため、案外パラメトリックな形状だということが分かります(壁面の厚さに関しては忠実なものではありませんが…)。

スクリプトにおいて言及しておきたいのは次の二点でしょうか。一点目は、①のようにソリッド演算の結果を変数に格納して扱えることです。①では、「SUBGROUP( "und_ell_out", "und_ell_in" )」の結果を「und_ell」という変数に格納しています。また、ソリッド演算の結果を使う場合は「"」で挟む必要はありません。②の部分、「und_dome = SUBGROUP( und_ell , "sub_tunnel" )」では、「und_ell」はソリッド演算の結果が格納された変数、「sub_tunnel」はグループ名(文字列)ですので、後者のみ「"」で囲んでおく必要があります。もう一点は、③のような「KILLGROUP」コマンドです。これは作成したグループが不要になったタイミングで呼ぶことで、後に続くグループの形状情報(≒ボディ)をメモリから削除し、処理負荷を軽減するためのコマンドです。上記のスクリプトでは逐一KILLGROUPしなくても大丈夫ですが、ひとまず例示のためにKILLGROUPを随所に書いてみました。そもそもKILLGROUPはスクリプトの最後で自動的に呼ばれるようですが、グループやソリッド演算を多用した長大なスクリプトをメモリの少ないマシンで実行する際はKILLGROUPコマンドを書いておき、メモリの節約に努めるとよいかもしれません。