読者です 読者をやめる 読者になる 読者になる

arXiv探訪

興味の赴くままに数学するだけ

立方体の面を球面に射影する手法の疑問

最近、ここのUnityに関するチュートリアルが面白くて、色々遊んでいる。一般的な入門とは異なり、シェーダをフルスクラッチで書いたりしているのがマニアックで自分好み。こんな良質なチュートがあって、しかも無料で読めて(パトロン系だったのが最近、一般公開したっぽい)、UnityやUEという強力な環境も整っていて、今の時代は恵まれているなぁとつくづく思う。そのうちユニークなシェーダとか作ってみたい。

立方体の面を球面へ

で、本題は先ほどのCube Sphereのページ。作った立方体の面を球面に変形する課題を扱っているのだが、まずは「普通に」正規化してみよう。つまり立方体の座標を{ v=^{t}(x, y, z) }とすると、

{ \displaystyle \frac{v}{|v|}=\frac{1}{\sqrt{x^{2}+y^{2}+z^{2}}}\left(\begin{matrix} x \\ y \\ z \end{matrix}\right) }

に写すことを考える。

f:id:mathmathniconico:20170223180126p:plain

球面上の格子模様と色は、立方体上に等間隔で入れた格子と面ごとに設定した色である。ちょっと分かり難いかもしれないけど、頂点方向の間隔が狭くなっていることが分かるだろうか。

そこで次のような変形を考える。まず立方体上の座標は何れかが{ 1 }になることから、{ 1-(1-x^{2})(1-y^{2})(1-z^{2}) = 1 }が常に成り立つ。

{ 1-(1-x^{2})(1-y^{2})(1-z^{2}) = x^{2}+y^{2}+z^{2}-x^{2}y^{2}-y^{2}z^{2}-z^{2}x^{2}+x^{2}y^{2}z^{2} }

であるから、上手い{ v_{0}=(x_{0}, y_{0}, z_{0}) }を設定して、{ x_{0}^{2}+y_{0}^{2}+z_{0}^{2} }が上の式となるようにすればよい。例えば

{ \displaystyle x_{0}^{2}=x^{2}-\frac{x^{2}y^{2}}{2}-\frac{x^{2}z^{2}}{2}+\frac{x^{2}y^{2}z^{2}}{3} }

などが考えられる。つまり

{ \displaystyle x\mapsto x\sqrt{1-\frac{y^{2}}{2}-\frac{z^{2}}{2}+\frac{y^{2}z^{2}}{3}} }

で写してみる。

f:id:mathmathniconico:20170223180201p:plain

ご覧のように、歪みが緩和されているのが分かる。テクスチャも描きやすくなるだろう。

で、この方法を調べても数学的な背景が全く出てこない。ココとかココとか紹介されているけど方法論のみ。数学的な意味が何かありそうなだけに気になのだが調べようがない。もちろん完全な等間隔になっているという訳ではないし、何かしら意味のある変換の近似(例えばテイラー展開の有限次の項まで取ったとか)だと思うのだけど。風船を膨らませてるのかなとも思ったけど物理はからっきしダメなので分からない。{ 2 }{ 3 }の交代級数が出てるので、対数関数あたりが怪しいけどどうなんだろう。

おまけ

Unityを触ってみて、UEと比較してUnityの方が分かり易い印象。その手軽さはsteamにある個人製作の大量のク○ゲーが物語っている。UEの方は大規模タイトルでの採用が多いことから、リッチな絵作りとかソースを直接触ってカスタマイズしたい場合に選ばれるのかもしれない。ゲームエンジンとしての違いとかはよく分からないけど。個人的にはUEはIMEを変えないとまともに動かないのと、ランチャーが無駄に重いので非力な環境では作業が辛い。