Programming SHOT BARへようこそ。
今回は戦略シュミレーションなどで利用されているHEX(ヘクス、ヘックスと読まれる)という6角形のマスについてです。
日本の真東は?
日本から真東を向いて、まっすぐに進むとどこに行くのでしょう?
アメリカには着かず、南米大陸のチリなどに辿り着きます。
このあたりは義務教育でやっているので覚えている人も多いかと思いますが、
メルカトル図法での東西方向は緯線に平行に描かれているので、実は曲がっている。
球面上での直線は、メルカトル図法の上では曲線に描かれるのです(赤道上や経線上を除く)。
そんなわけで、平面でのマップではなく、実際の球面に近い形でマップを描くことはできないか?というのがテーマです。
緯線経線での分割の問題
まずはHEXに拘らずに球面をマスで覆うことを考えましょう。
まずは単純に緯線経線で格子状にマスを描いたとします。この場合、以下の問題があります。
- 赤道付近と極付近では増すの大きさが違う
- 極が特異点となる
特異点は南北の極の2箇所だけなのですが、極をはさんでの移動が非常に特殊になってしまいます。
メルカトル図法に展開した場合の一番上の1列のマスは北極点を通過することで相互に好きに移動できることになってしまう。
それに比べ、最上段以外で東西方向に移動するときは、赤道部分を周回するのに必要なマス数と同じだけ移動しないといけません。
移動距離に非常に不公平感がでてしまうのが何より問題です。
正20面体で囲ってみてはどうか?
そこで考えたのが球に近い立体である、正20面体で囲う方法です。
頂点が12個あるため、特異点が12箇所にできてしまいますが、全体的に歪みが少なくなることが期待できます。
各面は平面として扱うことができ、面と面の間の座標変換さえしてやれば、うまく扱えそうですね。
というわけで、正20面体の面である正三角形をHEXで埋めてみます。
6角形と3角形は相性がいいので綺麗に埋めることができます。
そしてこれを正20面体にくみ上げるとこのようになります。
どうでしょうか。
辺の部分に両方の面に属する特殊なマスが出現しますが、そこはうまくプログラムする必要があります。
あとは、頂点に存在する特異点ですが、正20面体の場合、ここは5角形になります。
通過できない特殊なマスとして扱ってもよいでしょうし、
5ヶ所にだけ移動できる特殊なマスとして扱うこともできるでしょう。
なお、面の正三角形にHEXをひとつだけ描いた場合にはサッカーボールの形状になります。
ワイヤーフレームのデモ
この球面HEXは以前に書いたワイヤーフレームのデモを流用しています。
Java Web Startによるデモはこちら。
Javaのバージョン1.5以上が必要です。
このデモはJava上で座標変換とかまともにやっているので重いです。
DirectXとかOpenGLとかで描くと結構軽く描画できそうですね。
ま、そもそも三角形の面上のHEXはテクスチャで処理してしまえばよいのですけども。
さまざまな形の世界を創れる
この三角面HEX法を用いると三角形の面の組み合わせで表現できる立体であればなんでもHEXで覆うことができます。
この間証明されたポアンカレ予想の話で出てくるトーラス型(いわゆるドーナツ型)の世界も創ることができてしまう!
世界の形を意識するゲームなんてのもなかなか面白そうだと思いませんか?
投稿日時 : 2007年11月1日 2:01