Apple Vision Pro が気になっていたのだが、 あっさりと相対的に安価な Quest3 に流れました。 お値段的には、Hololens(初代) が限界かも。 あと、mac使いではないので腰が重い。 いちおう、 MacMini を調達して Metal とか練習しようとは思っていたのだが。。。

とりあえず、

  • WebXR
    • MR
    • HandTracking
  • WebRTC
  • xrterm

でおもちゃを作ってみようという方向性になった。 WebXR なら VisionPro でも動く可能性が高そうだし。

で、WebXR 周辺を探っていた。

xrterm に目を付けて、 xrterm が使っている、 xterm.jsA-Frame を使ってみた。

xterm.js

vscode の terminal 実装の部品ということで強そう。 typescript だった。 xrterm の解読過程である程度動きがわかってきた。

ユーザーのキーボード入力を受けつけて shell stdin へと渡す文字列を生成する input と、 shell stdout を受けて描画する Renderer の機能がある。 shell stdout は、エスケープシーケンスで色がついていたりする。 Terminal という class の上にキーボード入力と Renderer の両方がまとまっている。 入力は WebBrowser の textarea が裏に隠してあって、これに focus して keydown イベントを処理する。Terminal.onData へと出力される。 出力は、デフォルトでは canvas 2d への描画となる。 AddOnWebGL 描画するものがあり,

Hyper™
A terminal built on web technologies
Hyper™ favicon https://hyper.is/
Hyper™

という terminal emulator もある。 同じ部品を WebXR に持ちこみたいわね。

A-Frame

Three.js のラッパー。 シンプルで薄い感じが使いやすいのだが、 実装が素直でない prototype をごにょごにょするclass 継承 を使っていたりして LanguageServer の恩恵が受けにくい。 時代が良くなかった w

A-Frame の hand tracking 実験

A-Frame の板に xterm.js を描画する

GitHub - RangerMauve/aframe-xterm-component: Playing around with getting xterm.js working in Aframe VR
Playing around with getting xterm.js working in Aframe VR - RangerMauve/aframe-xterm-component
GitHub - RangerMauve/aframe-xterm-component: Playing around with getting xterm.js working in Aframe VR favicon https://github.com/RangerMauve/aframe-xterm-component
GitHub - RangerMauve/aframe-xterm-component: Playing around with getting xterm.js working in Aframe VR

xrterm より先らしく実際に QuestPro で動かしてみました。 動いたけど重かった。落ちました w 毎フレーム dom の 2d canvas を、three.js のテクスチャにコピーするような実装になっていて、 そりゃ重いよね。

xrterm - Terminal for XR
xrterm - Terminal for XR favicon https://xrterm.com/
xrterm - Terminal for XR

aframe-xterm-component と比べて軽量化されていて、 xterm.js の WebGL addon を改造しているぽい(解読中)。

xterm.js + PTY(WebSocket) + WebGL 描画 の目処がついた。 これで MR 内に テキスト端末を持ちこみたい。

Vite とか React

xterm.js を解読するにあたって typescript を使う環境として Vite を試してみた。 なるほど ESModule いいですね。となった。 Vite 使うと WebPack(苦手) を回避できる。

調べながら js やっている中で、 なんとなく JSX を知る。 JSX やるなら、ついでにセットで TypeScript もやるか。わかる。 逆もまた然り。 このサイトを Gatsby から Astro に変えて寄り道する。 Astro は、ViteTypeScriptJSX だ。

Three.js + React

じゃぁ Three.js と React を組みあわせて使うのがよいのでは。 Three.js にインスペクターつけるのに、React を使う。