Java3Dのシェーディングがよくわからないので、勉強しようとして、そのための実験材料として、ちょっと多面体でも作ってみようと思った。正多面体というのはn=4,6,8,12,20の正n面体しか無いが、正8面体以下は点光源や平行光源の光が当たる面の数が少ないので、正12面体と正20面体にすることにした。
…ら、えらく手こずって、GWの後半をこれだけで潰してしまった。光源とか反射率とか色々実験する計画だったのだが、時間切れ及び肩凝り等のため、一区切りする。
・Javaアプレットの起動ページへ
・ソースコード
LightTest1.java
MyHedron.java
MyHedron12.java
MyHedron20.java
ついでに、各面の中心を凹ませたり凸ませたりしてみた。
多面体の作成は、正12面体と正20面体の各面の法線を求めた上で、各面の中心と頂点を結んで三角形ポリゴンを作る方法で行っている。
正12面体の1つの面をXY平面と平行にすると、その面の法線は(0,0,1)であり、その面と隣の面とがなす角度をθとすると、tanθ=2である(説明は省く。調べると所々に出てくる63.4349...というのがこのθである)ので、(0,0,1)を360÷5=72°回転させると別の1つの法線が求まり、それをZ軸周りに72°ずつ回転させていくと、正12面体の上半分の法線が全て求まる。下半分は、それを逆さにしてZ軸周りに36°回転させて上半分とくっつけると求まる。
正12面体の天面の頂点の1つをX軸上に取ると、そのX座標は、sqrt((3/4) G/sqrt(5)) となる(Gは黄金比=(sqrt(5)+1)/2)(いい説明が思いつかないので説明は省く)。正12面体の各面は五角形なので、これを正12面体の法線で72°ずつ回転させていくと、全ての頂点が求まる。
正12面体の面と頂点を入れ替えると正20面体になるので、正20面体の頂点は正12面体の法線ベクトルのX,Y,Z成分をX,Y,Z座標にすることで得られ、正20面体の法線は正12面体の頂点の座標をベクトルの成分とすることで得られる。
光源は、環境光(赤)と平行光(青)を設定し、なんとなく点光源(黄)を回転させてみた。
正12面体の頂点座標の求め方は、簡潔な説明方法を思いついたら図入りで説明しようと思ったのだが、5枚に渡る手書きのメモのどれもが回りくどい。正12面体の頂点座標の一般式はシンプルなので、おそらく手書きでA4のチラシの裏1枚に収まるくらいにはスマートな導き方があると思うのだが、インターネット上にも簡潔に説明したものがまだ見つけられない。
参考ページ(Wolfram MathWorld内)
・Dodecahedron(正12面体)
・Icosahedron(正20面体)
上記のθについては、「球面三角法」を使うとスマートに求められるようである。
コメント