4次元メビウス変換によって空間を捻じ曲げてオブジェクトを裏返すことができる、世にも珍しいシェーダーです。 ■技術解説(数学・プログラミングわかる人向け) 超簡単に説明すると、これを4次元バージョンでやっています。 https://www.youtube.com/watch?v=0z1fIsUNhO4&t=120s この動画で3次元球に当たるものの4次元版をここでは「超球」と呼んでいます。xyz空間R3上の物体をxyzw空間の超球に射影し、超球を回転させたのちR3に戻すという操作を行っています。厳密には違う気がするけど、この変換を雰囲気でメビウス変換と呼んでます。 ちゃんとした記事は執筆中です。 ■いろんな性質 □回転方向について ・回転軸によって「押し出される方向」が定まる 超球の回転軸に直交するベクトルが押し出し方向となります。 4次元空間でのの回転軸は2次元平面となっていて、たとえばxy回転の場合z軸方向になります。また、 ・回転中心と押し出し方向を結ぶ直線上では無限遠に発散する このことから、 ・穴の開いてない物体で回転中心が物体内部にある場合、回転によって大きさが無限になる瞬間がある なのでこの方向に穴を開けておくと使いやすいです。 □不動点について 球面上の回転軸と交わる部分は不動点となり、超球ではこの集合は円となります。この不動円の半径は超球の半径で決まります。 物体表面がなんとなくこの円に沿うようにするとうまく裏返しやすいです。 https://twitter.com/uynet/status/1494974220505284609?s=20&t=oXQNhV4Yi_AsCjf2zLptXQ ■かんたんな使い方 Rotation : 4次元球の回転に対応します。単位:[rad] π回転で裏返ります。 AutoRotate : チェックを入れると実行時に自動で回転します。デバッグ用です。Rotationが無効になるので注意。 Radius : 超球の半径です。不動円の半径に紐付いてます(比例じゃない気がしてきたので調べます)。1がデフォルトで正の値を設定してください(なんかインスペクタの都合で負の値も設定できてしまう) VisibleRange : 性質上ものすごい大きくなることがあるので、一定以上離れたポリゴンを非表示にできます。一定以上の半径を超えた部分は少しづつ半透明になって消えます。 Tessellation : 歪みが大きい場合にローポリだとかなり歪な形になるので、動的にポリゴンの分割レベルを上げます。歪みが大きい部分だけ細かくみたいな頭の良いこと(適応的分割)は現状できておらず全部分一様に分割するので、基本的に少しづつ上げることを推奨します。立方体とかでなければ5以下でも十分なはず。 Tex : テクスチャを貼れます。 ■こんなときに使おう https://www.instagram.com/p/CNQCz5YH9PH/ こういう感じで使うと面白いです 中に入って、ボタンを押すと部屋を裏返す!みたいなワールドギミックが面白いと思ってます。 ■注意 まだ一般に使えるように全然できてません。デモ版です。 分かる人はコードを読むなりしてむりやり使ってみるか、今後の開発にご期待ください。 ↓今後の課題であろう部分 ・スケーリング対応 ・不動点集合(円)の可視化 ついでになんとなく動く方向、のベクトル場みたいなのを表示できるとさらに良い(等電位面上をクルクル回る、みたいな感じになりそう) ・回転中心の可視化と変更 自動でいい感じの初期値を設定してくれると嬉しい ・押出し方向の可視化、及び変更(回転ができると嬉しいかも) ・適応的分割(現状テッセレーションは一様) ・アニメーション書き出し ・いい感じのデモの用意 開発に興味のある方はTwitterで@uynetにお気軽に連絡ください。 ■FAQ ・動画と色が違うんだけど.. skyboxを権利上の問題で削除したときに一緒に消しちゃったので、適当になにか貼ってみてた上で、mobius4d.shaderの299行目あたりで宣言してるrをコメントアウトしていい感じにcolに足して下さい。光源はDirectional Lightにしてるので黄ばんでるのが気に食わなかったら光源色を変えて下さい。 ・回転中心を変えたい objectのpivotが中心になるようになってるので、それを変えて下さい。 ・消える・大きくなったり小さくなったりする Radiusをいじっていい感じに調整してください。どこかに大きさがあんま変化しないポイントがあるはずです。 ・スケーリングをいじったらなんかおかしい 現状対応してません。。 ・ものすごいウニみたいになった 遠くに行き過ぎて過ぎてクリッピングされた頂点が消えたものと思われます。クリッピングしないようにいい感じに調整したいです。
더보기