Web開発
NerdLens: カードボードVRでコンピューターをミラーリング
NerdLens: Mirror your computer with cardboard VR (github.com)
要約
NerdLensは、既存のVRヘッドセット(iPhoneとGoogle Cardboard用)でコンピューター画面をミラーリングできる、オープンソースの実験的なVRデスクトップアプリケーションです。デスクトップ画面をJPEGフレームに圧縮し、USB経由で送信して、Cardboardビュー内の仮想スクリーンにレンダリングします。高価なヘッドセットやクラウドストリーミングは不要で、スマートフォン、Cardboardビューア、そしてかなりの好奇心があれば利用できます。これはまだ初期の概念実証であり、洗練された消費者向けアプリではありません。
全文翻訳
NerdLens
お持ちのヘッドセットにコンピューター画面をミラーリング。
iPhoneとGoogle Cardboard向けの有線、オープンソースVRデスクトップ実験。
NerdLensは、デスクトップをキャプチャし、JPEGフレームに圧縮し、USB経由で送信し、ステレオスコピックCardboardビュー内の仮想スクリーンにレンダリングします。高価なヘッドセットは不要です。クラウドストリーミングも不要です。必要なのは、スマートフォン、Cardboardビューア、そしておそらく不合理なほどの好奇心だけです。
重要
NerdLensは初期の概念実証であり、洗練された消費者向けアプリではありません。現在のモバイルプロジェクトはiOSを対象としており、ソースビルドが必要です。ハッキングや実験に最適です。
できること
選択したディスプレイまたはウィンドウをVRにストリーミング(10〜60 FPSで設定可能)
USB有線トンネルでトラフィックを維持(iproxy経由)
ライブプレビュー、接続状態、フレームカウント、解像度、ターゲットFPSを表示
ヘッドセットを外さずに仮想ディスプレイを近づけたり遠ざけたりする
フレーム書き込みの中断から自動再接続試行で復旧する
視聴セッション中にiPhoneをスリープさせない
仕組み
フローチャート
LR
A["デスクトップまたはウィンドウ"] --> B["SvelteキャプチャUI"]
B -->|"JPEGフレーム"| C["Tauri / Rustホスト"]
C -->|"TCP :12345"| D["iproxy USBトンネル"]
D --> E["Unity iOSクライアント"]
E --> F["VRディスプレイ上のテクスチャ"]
F --> G["Google Cardboard"]
B -->|"距離設定"| C
読み込み中
スマートフォンはTCPサーバーを実行し、デスクトップホストはlocalhost:12345に接続します。これはiproxyによって接続されたiPhoneに転送されます。各メッセージは、1バイトのタイプ、ビッグエンディアンのペイロード長、およびペイロード自体で始まります。
タイプ
ペイロード
目的
0
なし
キープアライブ、クライアントによって予約済み
1
JPEGバイト
VRに表示されるテクスチャを置き換える
2
UTF-8 JSON
表示距離などのビューア設定を更新する
クイックスタート
macOSとXcodeが必要です
iOS 13以降を実行するiPhone
Google Cardboard互換ビューア
USBケーブル
Unity Hub(Unity 6000.1.5f1およびiOSビルドサポート付き)
Bun、Rust、およびTauriシステム前提条件
libimobiledeviceからのiproxy
Homebrewでiproxyをインストールします:
brew install libimobiledevice
次にプロジェクトをクローンします:
git clone https://github.com/ThatXliner/NerdLens.git
cd NerdLens
1. iPhoneクライアントのビルド
Unity HubでTest0ディレクトリをUnity 6000.1.5f1を使用して開きます。Assets/Scenes/SampleScene.unityを開きます。ビルドターゲットをiOSに切り替え、Xcodeプロジェクトをビルドします。生成されたプロジェクトをXcodeで開き、開発チームを選択し、iPhoneを接続して、デバイスでアプリを実行します。アプリが起動したら、電話をCardboardビューアに入れます。Google Cardboard XRパッケージはUnityプロジェクトで既に宣言されており、Unity Package Managerによって取得されます。
2. USBトンネルを開く
iPhoneを接続して信頼し、NerdLensモバイルアプリを実行したまま、別のターミナルでトンネルを開始します:
iproxy 12345 12345
このプロセスはセッション全体で実行し続けてください。
3. デスクトップホストを開始する
cd desktop
bun install --frozen-lockfile
bun run tauri dev
NerdLensで:
Connectを選択します。
Start Recordingを選択し、ディスプレイまたはウィンドウを選択します。
ヘッドセットを装着します。
Distanceスライダーを使用して、画面を快適な位置に配置します。
これで完了です。あなたのモニターはモニターを装着しています。
開発
desktop/からこれらのコマンドを実行します:
# Svelteフロントエンドのみを開始
bun run dev
# フロントエンドの型チェック
bun run check
# フロントエンドのビルド
bun run build
# 完全なデスクトップアプリを実行
bun run tauri dev
# Rustホストを検証
cargo check --manifest-path src-tauri/Cargo.toml
プロジェクトマップ
NerdLens/
├── desktop/ # Tauri 2 + Svelte 5画面ストリーミングホスト
│ ├── src/routes/+page.svelte # キャプチャコントロール、プレビュー、統計
│ └── src-tauri/src/lib.rs # TCPプロトコル、リトライ、Tauriコマンド
├── Test0/ # Unity 6 iOS/Cardboardクライアント
│ ├── Assets/ReceiveVideo.cs # TCPサーバーおよびフレーム/設定デコーダー
│ └── Assets/Scenes/ # VRシーン
├── JOURNAL.md # 元のビルドログ
└── Logo.png
トラブルシューティング
ホストが接続できないと表示される
Connectを選択する前にiPhoneアプリを起動してください。電話がロック解除され、信頼され、USB経由で見えることを確認してください。iproxy 12345 12345がまだ実行されていることを確認してください。ローカルポート12345を他に何も使用していないことを確認してください。
iOSビルドが署名されない
生成されたXcodeプロジェクトを開き、Apple開発チームを選択してください。Xcodeが競合を報告した場合は、一意のバンドル識別子を付与してください。接続されている電話が開発用に有効になっていることを確認してください。
ストリームがフリーズまたは停止する
デスクトップホストで画面キャプチャを停止して再開してください。iproxyを再起動し、NerdLensから切断して再接続してください。ターゲットFPSを低くしてみてください。フル解像度のJPEGエンコーディングはこのプロトタイプでは意図的にシンプルにされています。
表示が不快である
電話をビューアに戻す前にDistanceを調整してください。定期的に休憩を取ってください。このプロトタイプには、完全な快適性キャリブレーションフローはまだ含まれていません。
ロードマップ
よりスムーズで低遅延のビデオ転送
両端での接続およびエラーフィードバックの改善
自動デバイス検出およびiproxy管理
ディスプレイ配置コントロールと軸ロック
より洗練されたVR環境
パッケージ化されたデスクトップおよびモバイルリリース
プロジェクトジャーナルには、最初のUnityプロジェクトの失敗を含む、素晴らしい率直な開発ストーリーが記載されています。
貢献
バグレポート、実験、プロトコル改善、そして巧妙に過剰設計されたアイデアを歓迎します。変更内容とそのテスト方法を明確に説明して、Issueを開くか、Pull Requestを送信してください。
ライセンス
NerdLensはGNU General Public License v3.0の下でリリースされたフリーソフトウェアです。