torutkのブログ

ソフトウェア・エンジニアのブログ

JavaFX 3DのSphareに貼るテクスチャのマッピング(続)

JavaFX 3DのSphareに貼るテクスチャのマッピング - torutkのブログの続きです。

前回のあらすじ

前回は、テクスチャマップとして用意した世界地図をJavaFX 3DのSphereに貼ると、南北方向に縮んだ(北極/南極付近が広がった)表示となっているのに気づきました。

検証のため、緯度経度を10度刻みで引いたテクスチャマップを作成し、これをSphereに貼ってみたところ、赤道付近の緯度経度の格子は横長の長方形となり、極地付近の緯度の間隔が赤道付近よりも延びていました。
本来は赤道付近の緯度経度の格子は正方形となること、緯度線の間隔は一定であることが正しい姿です。

一方、他の3Dグラフィックライブラリでは

OpenGLDirectXJava 3D、WebGL、Three.js、Babylon.js、gl.enchant.js、PhiloGL、CubicVR.js、Away3DWPFJavaFXとそれぞれのライブラリで地球を表示させている素晴らしいブログがありました。
OpenGL で地球を回してみるテスト - CX's Hatena Blog

ここを見ると、JavaFX 3D以外は皆具合よく表示されているのが分かります。(つд⊂)エーン

テクスチャマップを円筒投影してみる

JavaFX 3D の Sphereテクスチャマッピングをする際、あらかじめ正積円筒図法による投影をテクスチャ画像に施しておきます*1。これは、昨日の日記で緯度経度格子が極に近いほど大きくなっていたものをあるべき姿に修正することを目的としており、次のような格子画像となります。

これを、Sphereに貼ると次のように表示されます。

極付近は次のようになります。

無理やり感はありますが、なんとなくよい感じになっています。

世界地図画像を正積円筒図法で投影したものが次になります。

これをテクスチャに貼った画像が次となります。

昨日の日記に貼っている地球儀の写真と比べると、ほぼ同じ形状となっていることが分かります。

JavaFX 3DのUVマッピングがどうなっているのか?

JavaFX 3DのSphereへのテクスチャマップの挙動から、球面上の点(微小面)に貼り付けるテクスチャの点(微小面)は、次の図のような関係になっているのではないかと推測します。

3Dグラフィックスの一般的なUVマッピング(ポリゴン上の点とテクスチャ上の点の対応付け)は、次のようになっています。

UVマッピングとその計算式は次のWikiペディアURLで参照できます。
https://en.wikipedia.org/wiki/UV_mapping

課題

今後の課題として、Sphereへのテクスチャマッピングで使用するUVマッピングJavaFXではどのように実装されているのかを確認し、問題があるかどうかを調べてみたいと思います。

続きは明後日(id:torutk:20161103)

*1:投影にはGIS(地理情報システム)用ツールを使用します。商用製品ではArcGISオープンソースではQGISなどが著名です。