建築でコンピュータ、する?
2025年11月19日(水) 20:03 JST
第7回GDL講習会ではソリッド演算を学びました。ソリッド演算を用いると、複数の図形を組み合わせた多様なモデルをつくれるようになります。 講習内では「パンチングメタル」のモデリングに取組み、課題としてレンガ間のモルタル・入口・内部空間を表現した「windmill ver.3」を作成してもらいました。
ソリッド演算を用いるためには前準備が必要です。1つ以上の基本形状をまとめてGROUPとし、2つのグループに対してソリッド演算を適用します。 windmillを例に順に見ていきます。
解答ではモルタルのベースとなる円柱・室内空間をつくるための円柱・レンガ・入口の4つのグループを作成し、複数回引き算して最終形を求めています。 また、リアリティを向上させるためにレンガの積み方に微小なずれを加えました。
GROUP "mortar" !モルタルベース MATERIAL 2 CYLIND mill_h,mill_r+rennga_d+0.001 ENDGROUP
GROUP "mill" !室内空間 MATERIAL 2 CYLIND mill_h,mill_r+0.02 ENDGROUP
GROUP "rennga" !レンガ MATERIAL 161 FOR j=1 TO div_h FOR i=1 TO div_r ADDY -(mill_r+rennga_d)-rnd(0.01) ADDX -rennga_w/2 BRICK rennga_w,rennga_d,rennga_h DEL 2 ROTZ 360/div_r+rnd(0.05) NEXT i ROTZ 360/div_r/2+rnd(3) ADDZ (mill_h-rennga_h*div_h)/(div_h-1)+rennga_h NEXT j ENDGROUP DEL TOP
このように4つのグループを作成した後、これらに対して下のスクリプトのように引き算をすることで、下図のような風車小屋をつくることができます。なお風車と円錐の屋根部分は部位をわかりやすくするために加えてあるもので実際のグループには含まれていせん。GROUP "ent" !入口 ADDY -(mill_r+rennga_d)-0.1 ADDX -ent_w/2 BRICK ent_w,ent_d,ent_h ENDGROUP
result_1=SUBGROUP("mortar", "mill")
result_2=SUBGROUP(result_1,"rennga")
GROUP "result_3"
PLACEGROUP result_2
PLACEGROUP "rennga"
ENDGROUP
result_4=SUBGROUP("result_3", "ent")
PLACEGROUP result_4
以下、解答例となります。
!!!!!部材の寸法設定
blade_a=RND(360) !羽ランダム回転角度
mill_h=3 !小屋高さ
mill_r=1 !小屋半径
roof_h=1 !屋根高さ
rooh_r=mill_r+0.3 !屋根半径
support_w=0.3 !回転軸支持部幅
support_d=0.3 !回転軸支持部奥行
support_h=0.45 !回転軸支持部高さ
axis_l=0.4 !回転軸長さ
axis_r=0.08 !回転軸半径
frame_d=0.05 !羽骨幅
frame_l=2 !羽骨長さ
blade_dif=0.3 !羽と羽骨格の長さの差
blade_t=0.01 !羽厚み
blade_w=0.2 !羽幅
blade_l=frame_l-blade_dif !羽長さ
joint=axis_l*8/9 !羽設置位置
!!!!!屋根配置
ADDZ mill_h
MATERIAL 160
CONE roof_h,rooh_r,0,90,90 !小屋屋根
!!!!!支持部配置
ADDY -mill_r
ADDX -support_d/2
BRICK support_w,support_d,support_h !支持部
DEL 1
!!!!!回転軸配置
MATERIAL 16
ADDZ support_h*2/3
ROTX 90
CYLIND axis_l,axis_r !回転軸
DEL 1
!!!!!羽骨・羽配置
ADDY -joint
ROTY blade_a
FOR i = 1 TO 4
MATERIAL 16
BRICK frame_l,frame_d,frame_d !羽骨
ADDX blade_dif
ADDZ frame_d
MATERIAL 26
BRICK blade_l,blade_t,blade_w !羽
DEL 2
ROTY 90
NEXT i
DEL TOP
rennga_w=0.2 !レンガ幅
rennga_d=0.05 !レンガ奥行
rennga_h=rennga_w/2 !レンガ高さ
ennsyu=mill_r*2*PI !円周の長さ(直径×円周率)
div_r=int(ennsyu/rennga_w)-1 !一周分割数=レンガ個数
div_h=int(mill_h/rennga_h)-3 !高さ分割数=レンガ個数
GROUP "mortar" !モルタルベース
MATERIAL 2
CYLIND mill_h,mill_r+rennga_d+0.001
ENDGROUP
GROUP "mill" !室内空間
MATERIAL 2
CYLIND mill_h,mill_r+0.02
ENDGROUP
GROUP "rennga" !レンガ
MATERIAL 161
FOR j=1 TO div_h
FOR i=1 TO div_r
ADDY -(mill_r+rennga_d)-rnd(0.01) !レンガを円周上に移動
ADDX -rennga_w/2 !レンガの中心を円の法線上に移動
BRICK rennga_w,rennga_d,rennga_h
DEL 2 !ローカル座標を中心に戻す
ROTZ 360/div_r+rnd(0.05) !次のレンガ生成位置に角度を合わせる
NEXT i
ROTZ 360/div_r/2+rnd(3) !レンガが半個ずれて置かれるよう回転
ADDZ (mill_h-rennga_h*div_h)/(div_h-1)+rennga_h !(小屋高さ-レンガ総高さ)/(隙間の数)+レンガ高さ
NEXT j
ENDGROUP
DEL TOP
ent_w=0.4
ent_d=0.08+0.1
ent_h=0.8
GROUP "ent" !入口
ADDY -(mill_r+rennga_d)-0.1
ADDX -ent_w/2
BRICK ent_w,ent_d,ent_h
ENDGROUP
result_1=SUBGROUP("mortar", "mill")
result_2=SUBGROUP(result_1,"rennga")
GROUP "result_3"
PLACEGROUP result_2
PLACEGROUP "rennga"
ENDGROUP
result_4=SUBGROUP("result_3", "ent")
PLACEGROUP result_4
DEL TOP
KILLGROUP "mortar" : KILLGROUP "mill" : KILLGROUP "rennga" : KILLGROUP "ent"
KILLGROUP result_1 : KILLGROUP result_2 : KILLGROUP "result_3" : KILLGROUP result_4 :
第1回では基本コマンドのみで作成したwindmillが、第7回までにここまでの仕上がりとなりました。
GDL講習会も次回で最後となります。最後まで頑張っていきましょう。
以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。