現在位置をメートル単位で表示するシェーダーを作りました。
現在位置をメートル単位で表示するシェーダー Position Shader を公開しました。
おきゅたんの17 Liveの配信でおきゅたんがコーゲンシティで迷子になっていたのを見て、作ってみようと思ったのがきっかけです。
ユニちゃん家をさがすhttps://t.co/6g2ams5NXX pic.twitter.com/kFjAYEQbse
— オノッチ (@onotchi_) August 25, 2018
現在位置表示、もともとVoxelKeiさんが自身の作成したワールドで実装されていたので、技術的には十分可能だと思っていました。ですが、いざ自分でやってみようとしたらいくつかハマったところがあったので、書いていきます。
Position Shader、まず基本構造としては、UVを適当な数のセルに分割し、それぞれで該当する文字を表示する…といった感じです。
分割方法や、それぞれのセルの区別の仕方はsetchiさんのスライドを見ると意識しやすくなります。
この辺に関しては、とくにハマる部分はありませんでした。
以下、変にハマった、ミスったところ。
現在位置ってどうとるの?
→まずこれのチョイスをミスったよね…。
メッシュの特定の頂点の座標を出そうとしてけど、「特定の頂点」ってどう特定しようかね…と思っていた時に、
「あ、頂点じゃなくてカメラの座標を出せばいいじゃん」と思いついたので、始めはそう実装していました。
この選択があとから響くんですが、二眼VRの場合、左右の目でカメラ位置ってずれるんですよね。
なので座標の境界点に立つと、左右の目で見える座標の数字が1ずれる。
奇しくもVoxelKeiさんに出来栄えを見せに行った日にVoxelKeiさんの指摘で発覚したのでしたw
結局VoxelKeiさんのアドバイスで、「メッシュの原点位置をワールド座標に変換してそれを表示する」という実装に変更しました。
mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz
— オノッチ (@onotchi_) August 30, 2018
とかでいいですかねえ。
23が表示されない。
→意味がわからない。
座標で22mまでは順々に変化するんですが、23mが表示されない。22mが2m分続いたあと、24mに切り替わる。そんな謎挙動がありました。
23mだけだったので、まぁ無視しちゃおうかな…、なんて思っていたのですが、実際は23mだけでなくいくつか変になる座標があり、
330m台だったかな、そこがガッツリ10m単位で320m台から340m台にジャンプするような感じだったりするのが発覚しました。
いよいよ無視できなくてTwitterの集合知に頼る。
int n = 1;
— オノッチ (@onotchi_) August 31, 2018
int a = int(floor(23 / n) % 10);
int b = int(floor(23 / 1) % 10);
if (a == b)
{
col = fixed4(1, 0, 0, 1); //赤
}
else
{
col = fixed4(0, 1, 0, 1); //緑
}
return col;
23の時だけこれが緑色になるの。なんでー。
(正確には23以外の時でも出るけど、1-30くらいの範囲だと23だけ)
丸め誤差やその他いろんな検討意見がでたあと、剰余計算のバグなどを教えてもらう。
“MME 0.37で剰余演算の結果がおかしいことがあるのでご報告しておきます。
— たさし (@_TASASI_) August 31, 2018
具体的には、117 % 10の値が6になる、などです。
x …” 【記事】MikuMikuEffect ver0.37 https://t.co/Erq6PdcsSd #blomaga
不思議ですねー。コンパイル時に演算するかどうかで変わっちゃうんですかね???
— たるこす (@tarukosu) August 31, 2018
くぐってたらこのツイートを見つけましたhttps://t.co/WdyyEN76o1
基本的な演算がちゃんと動かないのはつらいですね…
— たるこす (@tarukosu) August 31, 2018
これを試してみてはどうでしょう?https://t.co/FICb5mj798
剰余計算にバグがあるとかひどい。
これも計算法を変えることで回避しました。
こんなハマりを経て、いろんな人に助けられつつ無事公開に至りました。
ありがとうございます。
BOOTHの説明にも書きましたが、腕時計のように腕部分に仕込んで常に確認できるようにするもよし、アニメーションオーバーライドで必要に応じて目の前に表示されるようにしてもよし、だと思います。
またワールド作成者なら、レーダー的な小物として配置し、「座標XXXにススメ」みたいな冒険ワールド作るのもいいかと思います。
よろしくお願いします。