眠い...
https://github.com/binzume/webrtc-rdp
Chromeだとビデオストリームのラベルからウインドウハンドルが取れるので,ウインドウごとに操作できるようにする.複数のウインドウを共有してても,マウスカーソルが行方不明にならなくなった.
VR用のデスクトップ環境,ウインドウを自由にVR空間内に並べたくなる気がするのだけど,他のアプリだと普通のリモートデスクトップと同じようなのが多い.
なんだか,似たようなもの前にも実装したような気がしながら書いてたけど,2003年頃にもリモートデスクトップ実装してた…….しかもクリップボード周りやウインドウ単位の操作とか面倒でTODOにしていた内容までよく似ている.
Win32 APIの知識とか20年くらい前の状態で止まってるけど今もほとんど変わってないの凄いな.
AndroidのADBにWiFi経由でつなぐとき,再起動するたびにPCにつないでadb tcpip
を実行しないといけないのがだるい.PCに繋がずにadb tcpip
してくれる何かが欲しいのだけど無いな...
M5Stamp Pico と MAX3421E が手元にあったので,ESP32からAndroidにadbでつないで自動的にコマンド実行するようにしようと思ったけど,最近のADB接続はRSA鍵が必要だった.めんどい.毎回確認ダイアログ出て良いなら真面目に実装しなくても大丈夫そうに見えるけど良くわからないな.
マウス使えるようにしたり,色々追加してそこそこ使えるようになった.
高解像度のビデオテクスチャ使った場合のエイリアシングが気になるのだけど,ミップマップを毎フレーム作るのも効率悪すぎるし,異方性フィルタリングでどうにかしようとしたけどいまいち.レンダリング面積に合わせて,ホスト側で映像ストリームの解像度変えるのが一番良さそうだけど,少し面倒だな…….
あと,ChromeのgetDisplayMedia()で取得したVideoTrackのラベルの謎の数字,ウインドウハンドルなのか.これでストリームとウインドウを紐付けられそうだけど,将来変わりそうな気がする.
WebKit系ブラウザなら,MediaTrackSettings.displaySurface
を見ればキャプチャ対象がウインドウかモニタか判別できるのか.マルチディスプレイ環境の場合とかどうしよう.
眠い…….
WebRTCのリモートデスクトップでマウスイベントをデータチャネルで送れるようにしてみる.キーボードは,Oculus QuestでBluetoothキーボード使うよりPCのキーボード使う方が楽なので後回し.ブラウザからはマウスをコントロールできないので,ホスト側でマウスを操作するデーモンを起動しておくようにする.
Goからマウスやキーボードを操作するのgo-vgo/robotgoが良さそうだけどCgo使ってるのでビルドが少し面倒.Windowsの場合は lxn/win やkbinani/win とかを使って直接Win32 APIを呼んだほうが無難かも.
マウスの操作はウインドウ単位にするのは難しいので,Screen Capture APIでデスクトップ全体をキャプチャしてるのか知りたいのだけど,VideoTrackのラベルから推測するしかなくて自動的に設定するのは難しそう. (参考: https://zenn.dev/mima_ita/articles/c8d0b3f5e0e424) Chromeだと謎の数字が入ってるけど,ウインドウハンドルに変換できたりするんだろうか.
やることが溜まってるのだけど時間と気力が足りていない…….
* 昨日の続き
色々なものに依存してたので単体で動くようにしておく.SignalingもAyame Laboを使って静的なファイルだけにして,github.io上で動くようになった.
https://github.com/binzume/webrtc-rdp
良い感じなのだけど,ChromeのScreen Capture APIでウインドウをキャプチャすると,アプリケーションによっては日本語入力中の変換候補が表示されない...デスクトップ全体を共有すれば見えるのだけど,ディスプレイが4KなのでOculus Quest 2だと解像度が足りなくて残念.
AyameのSDKだとMediaStreamを接続時にしか渡せないみたいだけど,addTrack/removeTrackするなら自分でSDPをやりとりしないといけない?DataChannel上で色々渡せば実現できそうだけど,何か間違ってる気がするので今のところはストリームごとにPeerConnection作ってしまっている.
体調はマシになったけど,起きる気力が無くて夕方まで寝ていた.
* WebRTC + WebXR なリモートデスクトップ環境
Goで書かれたWebRTC Signaling ServerのOpenAyame/ayameとOculus QuestのWebXRで遊ぶ日.
いままで,VNCをWebSocketでプロキシしてJavaScriptでCanvasにレンダリングしてWebGLのテクスチャにコピーするみたいな面倒なことやってたけど,WebRTCだとVideo Textureにそのまま流し込めるし,ホスト側もブラウザでページ開くだけで良くなった.
あと,ChromeのScreen Capture APIはウインドウ単位でのキャプチャができるので,スクリーン全体+個別のウインドウを共有すると,HMDの解像度が足りない問題を軽減できるのも良さそう.Windows側のウインドウがそのままVR環境に出てるのが不思議な感じなのと,マウスカーソルどこあるか混乱するけど…….
Ayameは簡単に起動できて,JavaScriptのAPIにMediaStreamを渡せば動くので,スクリーンを共有したりするのが一瞬で書けて良い.
publicなシグナリングサーバがAyame Laboに用意されているのでサーバ立てなくても試せそう.
ただ,サーバはOSSとして公開されてるけど,mainパッケージに実装されているのでライブラリとしては使いにくい.代わりを探したら,https://github.com/castaneai/ayu を見つけたけど,こっちはRedisにかなり依存しているので他のKVSで動かしにくそう.
昨日の昼過ぎに寝て,気付いたら朝だった...だいぶマシになったけどだるい.
binzume/modelconv とりあえず,UnityのシーンとかのcolliderをglTFに埋め込めるようにしたりしていた.
Travis CIのCIがもう動いてないので,いいかげんGitHub Actionsに移行.リポジトリにCIの設定ファイルを含める方式,設定するときは楽だしバージョン管理もgitに任せられるのはよいのだけど,リポジトリたくさんあると修正して回るのけっこう面倒だな.
glTFにPhysicsの情報を埋め込みたくて, binzume/modelconv をいじってたのだけど,よく使われていそうなglTFのPhysics extensionが見つからない.
欲しいと書いている人は見かけるのだけど,みんな適当にextraに入れたりしてるっぽい?
唯一,仕様がまとまっていて使っている人がいそうなのはBLENDER_physicsくらいかも.基本的な剛体の定義だけなので,制約とか材質とか色々欲しくなる.
髪を切ったりする.
朝から肉を焼いて,夜に鰻を食べるような生活.
* Oculus Questのリモートデスクトップ環境
Oculus QuestのVR内にPCのデスクトップを表示するやつ.久しぶりに見たら色々便利そうなのが増えてた.
個人的にはOculus Questのブラウザをよく使うのと,WebXRアプリをQuest上でデバッグしたりするので,ブラウザ上で動くやつだとタブ切り替えるだけで済むので使い勝手良い.
アプリ
Virtual Desktop
有料.昔からあるやつ.SteamVRで遊べる.無難だけどスクリーンが一枚しかないのが不便.
Immersed
一番がんばっている感じがする.複数スクリーン使える.Windowsが認識しているディスプレイの配置も反映されているのでマウスカーソルの移動とかも違和感ない.ただ,UIとか気合が入ってるわりに,肝心の操作感はあまり良くない気がする.
Horizon Workrooms
Facebook製.使ったことないけど単なるリモートデスクトップとして使うにはいまいちっぽい?
Web
VNC + Websockify + VNC.js + WebXR
前から使っている.セットアップは面倒.WebXR環境にスクリーン並べたり色々遊べる.
Chromeリモートデスクトップ
Oculus Questと相性あまり良くない.ブラウザをアップデートするたびに動くようになったり動かなくなったりする.最近はクリックイベント周りが色々おかしい.
ViRTC
表示だけ.ホストもクライアントもブラウザだけで動くので,同じ部屋ならこれとワイヤレスキーボードの組み合わせが手軽かもしれない.P2P WebRTCなので変なサーバは経由してないはずだけど,自分でサーバ立てるか,https://github.com/rviscarra/webrtc-remote-screen や https://github.com/DeshmukhPooja/webrtc-remote-desktop とかを使ってた方が安心かも.
調子悪いので寝る.
年末のふるさと納税の返礼品が届き始めたので,どうやって冷凍庫に詰めるか試行錯誤していた...