2018年7月16日(月) 10:06 JST

メビウスの輪 -GDLメモ vol.1

  • 2010年6月11日(金) 12:10 JST
  • 投稿者:

GDL講習会のページは多くの方に楽しみにしてもらっているらしく、順調にアクセスが増えています。グラフィソフトの方からも、「西の方面」で話題になっているという話を聞きました。GDLに関するお問い合わせも多く、長くやっているといろいろとあるもんだなあと感じ入っているところです。

どのあたりなんでしょうか? > Kさん

さて、GDL講習会のページはあまり長くなると読みにくくなるので適当な分量になるように端折っているわけですが、もう少し詳しく知りたいという要望も届いています。ということで、このたびGDLメモという記事カテゴリを新たに設けました。

とはいうものの、あまり期待させすぎてはいけませんので、のんびりペースでやっていくつもりと初っぱなからいいわけしておきます。

初回はメビウスの輪を扱います。メビウスの輪は有名なのでここで説明する必要はありませんね。いきなりソースを示しましょう。検証用のコードを一部残してあります(コメントアウトされています)。

!!
!! メビウスの輪
!!                        2010 HLAB(C)
!!

DIM x1[], y1[], z1[]     !!配列の宣言
DIM x2[], y2[], z2[]     !!メビウスの輪の帯端の座標を格納

r = 10   !! 半径
d = 2    !! 帯の幅(4)の半分
q = 64  !! 分割数


!! q+1番目の点の座標は1番目と同じ(無駄)だがループ内を簡単にするため+1する !!
FOR i = 1 TO q + 1 	
	x1[i] = r*cos((360/q)*(i-1)) + d*cos((180/q)*(i-1))*cos((360/q)*(i-1))
	x2[i] = r*cos((360/q)*(i-1)) - d*cos((180/q)*(i-1))*cos((360/q)*(i-1))
	y1[i] = r*sin((360/q)*(i-1)) + d*cos((180/q)*(i-1))*sin((360/q)*(i-1))
	y2[i] = r*sin((360/q)*(i-1)) - d*cos((180/q)*(i-1))*sin((360/q)*(i-1))
	z1[i] = d * sin((180/q)*(i-1))  !!1 ひねりは180°です。≠360°ですから注意!
	z2[i] = -z1[i]
NEXT i

!!!上で定義した頂点を単純につなぐと....
!FOR i = 1 TO q
!	LIN_ x1[ i ], y1[ i ], z1[ i ], x2[ i ], y2[ i ], z2[ i ]
!	LIN_ x1[ i ], y1[ i ], z1[ i ], x1[i+1], y1[i+1], z1[i+1]
!	LIN_ x2[ i ], y2[ i ], z2[ i ], x2[i+1], y2[i+1], z2[i+1]
!NEXT i

!! 配列の座標値をつないで3角形を作る
FOR i = 1 TO q
	PLANE 3,
	x1[i], y1[i], z1[i],
	x1[i+1], y1[i+1], z1[i+1],
	x2[i], y2[i], z2[i]
	PLANE 3,
	x1[i+1], y1[i+1], z1[i+1],
	x2[i+1], y2[i+1], z2[i+1],
	x2[i], y2[i], z2[i]
NEXT i

!! 元になったXY平面上の円はここにあります
!FOR i = 1 TO q
!	 LIN_ r*cos((360/q)*(i-1)), r*sin((360/q)*(i-1)), 0, r*cos((360/q)*i), r*sin((360/q)*i), 0
!NEXT i

プログラマが10人いれば、10通りのプログラムができるのが普通ですから、上のコードが最上のものとはいいません。読みやすさ、理解しやすさを優先してあります。

GDL初心者の方がつまずきそうな文法規則(配列、ループ)はGDL講習会のページで勉強してください。2010年版でもそこまですでに説明済みです。

中級者の方はこのコードは冗長だと思うかもしれません。ループは一回でいいですし、そもそも配列を使わなくても書けたりします。見やすさ優先か効率優先かでコードをかき分けるのが普通です。この記事では前者です。あと、同一平面上にない4点をPLANEに渡すとどうなるか、も確認しておくといいかもしれません。さらにもう一点、レンダリング結果があまりきれいでないのは、分割数が小さいからだけではありません。これについては別の機会に。

感想ですけれども、こうやって説明してみますと、形状モデリングだけでは不足なのがわかります。3Dグラフィックスの基礎的な知識も必要だということを再認識しました。

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。