Onoty3D

Unityに関するメモとか

現在位置をメートル単位で表示するシェーダーを作りました。

f:id:onoty3d:20180901101604p:plain

現在位置をメートル単位で表示するシェーダー Position Shader を公開しました。
おきゅたんの17 Liveの配信でおきゅたんがコーゲンシティで迷子になっていたのを見て、作ってみようと思ったのがきっかけです。

現在位置表示、もともとVoxelKeiさんが自身の作成したワールドで実装されていたので、技術的には十分可能だと思っていました。ですが、いざ自分でやってみようとしたらいくつかハマったところがあったので、書いていきます。

Position Shader、まず基本構造としては、UVを適当な数のセルに分割し、それぞれで該当する文字を表示する…といった感じです。
分割方法や、それぞれのセルの区別の仕方はsetchiさんのスライドを見ると意識しやすくなります。

この辺に関しては、とくにハマる部分はありませんでした。

以下、変にハマった、ミスったところ。
現在位置ってどうとるの?
→まずこれのチョイスをミスったよね…。
メッシュの特定の頂点の座標を出そうとしてけど、「特定の頂点」ってどう特定しようかね…と思っていた時に、
「あ、頂点じゃなくてカメラの座標を出せばいいじゃん」と思いついたので、始めはそう実装していました。
この選択があとから響くんですが、二眼VRの場合、左右の目でカメラ位置ってずれるんですよね。
なので座標の境界点に立つと、左右の目で見える座標の数字が1ずれる。
奇しくもVoxelKeiさんに出来栄えを見せに行った日にVoxelKeiさんの指摘で発覚したのでしたw
結局VoxelKeiさんのアドバイスで、「メッシュの原点位置をワールド座標に変換してそれを表示する」という実装に変更しました。

 

23が表示されない。
→意味がわからない。
座標で22mまでは順々に変化するんですが、23mが表示されない。22mが2m分続いたあと、24mに切り替わる。そんな謎挙動がありました。
23mだけだったので、まぁ無視しちゃおうかな…、なんて思っていたのですが、実際は23mだけでなくいくつか変になる座標があり、
330m台だったかな、そこがガッツリ10m単位で320m台から340m台にジャンプするような感じだったりするのが発覚しました。
いよいよ無視できなくてTwitter集合知に頼る。

 丸め誤差やその他いろんな検討意見がでたあと、剰余計算のバグなどを教えてもらう。

 

 

 剰余計算にバグがあるとかひどい。
これも計算法を変えることで回避しました。

こんなハマりを経て、いろんな人に助けられつつ無事公開に至りました。
ありがとうございます。

BOOTHの説明にも書きましたが、腕時計のように腕部分に仕込んで常に確認できるようにするもよし、アニメーションオーバーライドで必要に応じて目の前に表示されるようにしてもよし、だと思います。
またワールド作成者なら、レーダー的な小物として配置し、「座標XXXにススメ」みたいな冒険ワールド作るのもいいかと思います。
よろしくお願いします。