Quest3 でなんか作ってみた (その2)
前回 以降に作ったデモの種明かしや、ちょっと困った点とかのメモなど。
(↑ 前回も面白いのでまだ見てない方はぜひ見てね!)
プロペラの近くで遊んではいけません
PLATEAU SDK が出たので使ってみました。
最初、実機で PLATEAU SDK を動かしていたのですが結構広い範囲を描画したかったので流石にキツイ…
仕方がないので事前に PC 上で街を表示して Cinemachine で飛びたいコースに合わせてカメラパスを設定し、Unity Recorder で録画しておきます。最初360度 Equirectangular 画像としてキャプチャしたのですが歪みが気になったので6面Cube画像として保存しました。
実機では他のデモでも使った部屋のモデルを表示し、家全体が収まる(20m)程度の6面体の内側に動画を貼り付けています。
ベランダに出て外から見た時どうなるか不安だったのですが思ったより良い感じに遮蔽できていました。
プロペラや起動ボタンなど小物を作ったら実演。渋谷のスクランブル交差点からスタートなのですが「〇〇秒ぐらいでビルを回り込むからそっちを見て、〇〇秒ぐらいで皇居の方を見て…」と脳内コンテに従って視線移動。
プロペラに悪戯して壊れるところはこっそりボタンを押して破壊をトリガーしています。プロペラが壊れたら現実の横方向がバーチャルの下になるよう天球を回転させつつベランダの端に駆け寄って落ちた演出。ここもボタンで部屋を非表示に切り替えています。動画にはタイミングが難しかったので墜落する移動は無いので、カメラを地面に向かって回転しつつ落下させながら手を天にかざして「うわ~」的な寸劇。(近所の人に見られたら恥ずかしくて生きていけないw)
ガレージのある部屋って憧れますよね!
Scaniverse の Android 版が出たので使ってみました。
まずは車のキャプチャ。自宅のガレージで撮ると壁などが映り込んで面倒だったので空いている時間を見計らって近所のスーパーの屋上駐車場の真ん中で撮影。設定を変えたりしながら何カットか撮影しました。
GaussianSplatting のデータから背景を除去するのは PLAYCANVAS の SuperSplat を利用しました。
実機での再生は UnityGaussianSplatting が有名ですがパススルーの可否や OpenGL/Vulkan の対応などを考え keijiro さんの SplatVFX を使わせていただきました。(エディタ上と実機でモデルの向きが違うような気がしますが実機で動けばOK)
流石にちょっと重くてパススルーとの同期がプルプルしたり画面外がちらついたりしていますが車内のハンドルとかもそれっぽくあるの、良いですよね!
Quest3 でも 3DHat
流行り(?)の 3D Hat を Quest3 でも表示してみました。
昔は何分もかけて描画していたものがリアルタイムで動かせるのはすごいですよね。
帽子を被せてもらったのは MZ-80 mini。(MZ-80 は私が初めて買ったパソコンです)
ゼンゼロモデルを部屋に召喚してみた
技術的にはあまり大したことしていないのですが原神やゼンゼロは公式が3Dモデルを公開してくれているので部屋に召喚してみました。
モーションは適当にググって見つけたものを使わせていただいています。
モデリングは専門外なのでマテリアルの設定が怪しいものがあって変な表示になっているものもあるかと思いますが…
CTスキャンのデータを可視化してみた
転院する時に貰った診療情報提供書、CD が入ってそうな開けちゃダメっぽい封筒を開けてしまって「しまったー。うっかりあけてしまったー。どうしよう?」ということで Quest3 で表示してみました。
CD にはビューアも入っていたので画像保存メニューから連番 jpeg で書き出せました。元データは DICOM (Digital Imaging and COmmunications in Medicine) 形式のようでフリーのコンバータもあるようですが試したものは連番画像の順番が変になったりして結局ビューアの書き出しが一番マトモでした。
画像は 512x512。医療用データってもっとクソでかいのかと思っていましたが受け渡し用のデータは小さくしているんですかね?
Unity 側では連番画像を Instantiate するコードを書いて並べるだけ。メジャーを顎に当てて測ると上から下まで80cmか90cmぐらいだと思うのですが面倒なので1mにしています。画像の縦横サイズも適当に決めたので実際よりちょっと大きく表示されていると思います。
スライスを1枚選ぶ部分は RHand.PointerPose.position で選んで RHand.GetFingerIsPinching でつまんだかの判定。指さしているか (最後にさわさわしたかったので青いカーソルが出ないモードも欲しかった) の判定は中指のボーン3個から角度を求めて中指が曲がっていれば指さしていると判定しています。
ただ、隠れちゃったり画面外に出ると持ったものをすぐ落としてしまうので実用性で言えばコントローラで操作したほうが安定しますね (動画は何回も落としたら撮り直した)。 今回は動画的な映えを重視してハンドジェスチャーで操作しています。
その後コメントで 3D Slicer の Total Segmentator で着色するとわかりやすいかもと教えて頂き、調べると BSD ライセンスで使いやすそうだし「背骨の近くを通っている太いパイプはなんだろう? 食道はこんな所通ってないよな?」と思っていたので試してみました。
Total Segmentator もメニューから選ぶだけでインストールできて楽ちん。AI関連(?)で Python 系の何かのインストールにちょっと時間がかかるのと Python は専門外なので既存の Python 環境を変にされないか不安ですがセグメンテーションまでは無事に終了。
で、書き出しなのですがマニュアル的には
png や jpeg は can read single/series of frames, can write a single frame
tif が can read/write single/series of frames
なので tif で書き出せば連番画像になりそうですがエラーでうまく書き出せません。
デフォルトは nrrd (nearly raw raster data) ですがこれは元データ? nrrd で書き出して連番画像に変換してみたのですが Segmentation されていないみたい?
カメラアイコンじゃ1枚しか撮れないし…
結局 Utilities - Screen Capture を使えば1枚保存して連番を進めてくれるようで、カーソルキーでコマを進めてキャプチャ、を「ポチカシャポチカシャ」と170回やって保存しました。(絶対もっと賢いやり方があると思うw)
スクリーンサイズで保存されるので縦横比が変になりますが実機側でスケールかけて対応。
ちなみに輪切りの画像だけかと思ったら 3D Slicer で見ると縦スライスや横スライスの画像もあるんですね。CDのビューアでは見えなかったような…