今日だけ頑張るんだ

主に軽めの開発記録

KenzenViewerを作ったときに考えていたこと

この度、VR(Windows/MetaQuest)で画像を見られるアプリをリリースしました。

naninunenoy.booth.pm

経緯

元々画像ファイルの収集癖があり、好きなアニメのDVDのジャケット画像を集めて保存したりしてました。 PCに保存したから後で何かに使うわけでもないのに保存だけしてました。 たまに眺めるとかはしたかもしれません。

「好みの画像だったから保存した」みたいなミーム?があるので他にも同じ人がいるんだろうと思います。

dic.nicovideo.jp

ただ、画像を見る際PCやスマホのディスプレイ以上に大きく表示はできません。 画像を大きく表示したくても当然ディスプレイ外が描画されるわけもありません。

ある日、OculusQuest2を買って遊んでいるとOculusLinkで簡単にデスクトップをミラーリングできることを知りました。 そしてそのミラーリングしたディスプレイは自由に移動・拡縮でき好きな大きさで画像を見られることが出来て感動しました。

そしてUnityの画面を割と簡単にVRビューで表示できることを知り自分用に画像を見られるアプリを作ってみるかというアイデアが生まれました。

Windowsのデスクトップがミラーリングできるのでブラウザや標準のフォトアプリで同様のこともできます。最初はそれで満足してましたが、ミラーリングは自分の用途ではTooMuchに感じましたし、フォトアプリもページ送りの挙動や拡大の操作などは当然VRのコントローラは想定してないので使いづらい面も感じました。

仕事ではUnity使った開発をしていますし、個人開発というものをオレもやってみるかーと開発を始めました。

そしてリリース

開発開始から1~2年1ありましたが、ひとまず他人にも使えるレベルになったと判断したのでリリースとしました。 開発でこだわった点は以下です

  • 画像の読み込みと表示を可能な限り早くする
  • 左右両手のコントローラで同じ操作をできるようにする

です。

画像の読み込みと表示を可能な限り早くする

別スレッドのファイル読み込みのよりメインスレッド上で UnityWebRequest 経由で読む方がなんだかんだ早い2みたいな発見を経ましたが、OSSで用途に合ったものがあったのでそれを使っています。

github.com

また、一度読み込んだ画像の縮小画像をwebpに変換して保存し、次回の表示時に利用するなどしています。大量の画像を表示することを想定したうえでの仕様です。3

webpはpngよりファイルサイズが小さいくらいの認識でしたが、以下の記事でUnityでも使えることを知り採用しました。

note.com

また、2度ほど抜本的な作り直しをしましたが上記の詳細も併せて別の機会にまとめようと思います。

左右両手のコントローラで同じ操作をできるようにする

ナニとは言いませんが、片手だけで操作したい場面があるのです。

アプデの構想

MetaQuest以外でも使えるように

QuestLink(OculusLink)頼りなのでMetaQuestでしか動きません。SteamVRを経由すれば他のVR機器でも動くらしいと教えてもらったので試したいと思っています。 ただ、現状ユーザが自分だけなので優先度は低めかも。

動画再生

Unityの VideoPlayer がPC上のローカルの動画を再生するのに使えそうなので動画の再生の対応はしたいです。しかし時間送りとかUIが面倒そうなのでひとまずは再生と停止だけかな。

音声再生

音声もUnityの AudioClipAudioSource で行けそうですが、現状のアプリの都合上画像を表示しながらの音声再生はやっかいなので後回しになりそう。

複数画像表示

ほんとは画像を複数枚表示して動かしたりしたかったのですが、これをやろうとするといつまで経ってもリリースできないと思ったので、一枚表示の時点でリリースしました。

Apple Vision Pro の Safari では標準機能のようです。まさにこんなことがしたいですねー。自分としてもここまで出来るようになれば完成といっていいかなと思っています。

今後

アプデだったり、人目に付くように記事を書いたり、LTなどの機会を作っていきたいなと思っています。


  1. Gitの最初のコミットが2022年の6月でした
  2. 結局 Texture2D の生成はメインスレッド実行でボトルネックになるので
  3. 自分が収集した画像は1万とか超えているのでそれらを表示することを視野に入れました