メインコンテンツまでスキップ

Live Studio Virgo Extension

jp.lilium.livestudio.virgo の変更履歴です。

[0.26.0] - 2026-09-27​

Added

  • テイクはキャプチャーしたポーズを運び、Fusion なしで再生できます。 VirgoMotionSource は MotionSourceBase(jp.lilium.livestudio を参照)上のサンプラーになりました:再生位置で受信ストリームをサンプリングし、基底クラスがポーズを state レーンに載せるため、リプレイはポートで何も待ち受けていなくてもテイクからアバターを駆動します。ストリームはフレームソース fusion として宣言されます。受信したボーンごとの回転は、Studio が Fusion に送るのと同じビルドデータから構築した隠しスケルトン上で、WirePoseNormalizer によって Studio が記録するマッスル空間のポーズに変換されるため、変換は厳密です。受信フレーム間の補間はマッスル空間で行われるようになりました。この変換は過渡的なもので、ワイヤがマッスルを運ぶようになれば Fusion 側へ移ります。配置は受信スレッドではなく、サンプリング後のフレーム先頭で適用されるため、記録されるポーズはパケット到着時にカメラがどこに立っていたかに依存しません。カメラ合わせのオフセットは state レーンに乗るため、テイクは撮影した場所で再生されます。
  • receivedFrameCount と validFrameCount が読み取り専用で公開され(UI では非表示)、ドライバーはモーションが実際に届いているかを判別できます:少し間を空けた 2 回の読み取りで増えていなければ、Fusion → UDP → Studio の経路が壊れています。静止したアバターではそれを示せません。
  • ビルドが -noCompanionApp 付きで起動された場合、FusionApp は Fusion を起動しないため、呼び出し側が独自の引数で Fusion を起動できます。

Changed

  • ⚠ VirgoMotionSource のリグ設定——UDP ポート、再生遅延、カメラの高さ、カメラの距離——は、ライブシーンの値ではなくプロジェクト設定になりました。 これらはこのマシンがどう配線され、そのカメラがどこに立っているかを表すもので、何が演じられたかではないため、テイクには入りません。また予備のマシンは別のポートで待ち受けられます。⚠ リグ設定の異なるマシンでリプレイすると、アバターの配置が変わります。
  • Open、ResyncTiming、ResetCamera は記録されません。⚠ ResetCamera はワールドを動かします——キャプチャーカメラを固定し直すため、アバターの位置が変わります——テイク中にそれを押すと、リプレイはその時点から食い違います。
  • AnimationFrameBridge.ToLiveStudio は WirePoseNormalizer を受け取り、スケルトンが構築されていない間(まだアバターが読み込まれていない)は false を返します。ブリッジの呼び出し側には破壊的変更です。
  • VirgoMotionSource は、削除された IAvatarBuildObserver インターフェースを実装する代わりに、新しい AvatarBuildNotifier.onAvatarBuilt イベントでアバタービルドの通知を受け取ります。動作は変わりません。
  • VirgoMotionSource.ResyncTiming は Fusion にもキャプチャーのタイミングを取り直すよう求めるようになり、1 つのボタンでパイプライン全体を再同期します。タイミングの基準は 2 つあります——Fusion のキャプチャーストリームへのオフセットと、Studio の再生オフセット——片方を取り直すともう片方のずれが残るため、それぞれのアプリでボタンを押す必要がありました。Fusion への要求は投げっぱなしで、ローカルのリセットは常に実行されるため、Studio だけのセッション(やオフラインの Fusion)でも従来どおり再同期されます。
  • FusionRequestSystem は、RemoteControl の /exposed/* → /live/* のルート改名に従い、/live/function/... を呼びます。
  • カメラ合わせは記録されなくなりました。リプレイはテイクから自身のものを取ります。 _offsetPosition と _offsetRotation は state レーンから外れ、公開されなくなりました。リプレイが始まると、VirgoMotionSource はリプレイが供給する最初の有効なフレームのキャプチャーカメラに配置を合わせます。これはモーションが届き始めたときにライブ実行が行うのと同じリセットです。リプレイはその合わせを最後まで保ちます:シークやループでも保たれ、新しいリプレイは自身のものを取ります。テイクは既にすべてのポーズとともにキャプチャーカメラを運んでいるため、記録された合わせはその 2 つ目のコピーでした。
    • 何も受信したことがなく、Fusion も動いていないマシンでも、テイクは撮影した場所に配置されます。
    • 最初に再生されるフレームが正しい合わせで配置されるかどうかが、ハンドラーの順序に依存しなくなりました。
    • リプレイ実行中にキューに入ったライブのリセットは、リプレイの合わせを置き換えるのではなく、リプレイの終了を待つようになりました。
    • 代償:テイク中に押した Reset Camera は再生されません。
    • VirgoMotionSource のものは、今は何も記録されません。

Fixed

  • 何も触らなかったセッションを終了するときに、ライブシーンを保存するか尋ねなくなりました。 VirgoMotionSource のカメラ合わせのオフセット(_offsetPosition / _offsetRotation)は、state レーンに載せたときにライブシーンのメンバーになり、resetCameraAtReceived は起動のたびにキャプチャーの最初のフレームからそれを計算し直します。結果は実測値なので実行ごとにわずかに異なり、そのため手を付けていないセッションが未保存の編集として数えられ、終了時に確認が出ていました——次の起動で新しい値が測られるため、保存しても解決しませんでした。オフセットは明示的な lane = FrameLane.State とともに persistable = false を宣言するようになりました。これは FrameLaneRules が明言している例外——シーンは保存しないがテイクは運ばなければならないメンバーで、ポーズや表情ウェイトと同じ形——です。テイクは引き続き撮影した場所で再生され——オフセットは以前とまったく同じく state レーンに乗ります——シーンファイルは次の起動がどのみち上書きする値を持たなくなりました。

[0.25.1] - 2026-07-20​

Added

  • THIRD_PARTY_NOTICES.md に、Tools~/VirgoMotionFusion/ 配下に同梱しているサードパーティコンポーネント(MediaPipe とそのモデル、MediaPipe Unity Plugin、Protocol Buffers、UniVRM、Newtonsoft.Json、Bouncy Castle、Final IK、および Unity パッケージ群)を記載しました。これまで本パッケージは、これらを帰属表示なしで同梱していました。

Changed

  • FusionApp が、ウィンドウの表示設定を常に明示的に渡すようになりました(-hidewindow または新しい -showwindow)。フュージョンは既定でウィンドウを出さず(タスクトレイのみ)起動するため、fusionHideWindow: false を指定しただけでは、結局は自分でウィンドウを隠すフュージョンが起動してしまっていました。

Removed

  • 同梱のフュージョンビルドから、6 つの AR Foundation Remote アセンブリと MCPForUnity.Runtime.dll を同梱しないようにしました。どちらもエディタ専用の開発ツールで、Player ビルドが参照することはありません。AR Foundation Remote は有償の Asset Store アセットで、公開配布される本パッケージ内に同梱されるべきものではありませんでした。ビルドスクリプトが Managed/ と ScriptingAssemblies.json から除去します。

[0.25.0] - 2026-07-17​

Added

  • VirgoMotionSource.ResyncTiming: フレームバッファとフレームオフセットをクリアし、次の Update で送信側の採番に再ロックする公開関数です。送信側(Fusion)と受信側(Studio)はそれぞれ自分の壁時計でフレームを採番するため、両者をフレームオフセットで橋渡ししています。長時間のストールやクロックの飛びからの復帰にも使えます。

Changed

  • Fusion が、キャプチャーシーンを組み込める Player(ウィンドウ)ビルドとして配布されるようになったため、バッチモードだけでは Fusion を識別できなくなりました。FusionApp は常に -fusion-child / -hidewindow の起動引数を付与し、FusionQuitSignalListener はそのマーカーで判定します(従来の headless ビルドのためにバッチモードも引き続き受け付けます)。
  • BuildPostProcessor が Tools を StandaloneWindows64 のときだけ同梱するようになり、iOS とキャプチャーのビルドでは出力の隣に Tools がコピーされなくなりました。

Fixed

  • Fusion の再起動後にアバターが固まらなくなりました。再起動すると送信側のフレーム採番が小さい値に戻る一方、バッファの frameCount は増える一方なので、再生が古いフレームにピン留めされていました。VirgoMotionSource は、受信した採番が大きく巻き戻ったときにフレームバッファをクリアして自動的に再同期します。フレームギャップの警告も、補間の探索範囲より広いギャップに限定されました。
  • Studio が、Fusion への buildavatar POST を成功するまで再試行するようになりました。Studio より後に起動した Fusion でも、アバターのスケルトンを受け取れます(従来は一度きりの POST が失敗すると、アバターを選び直す必要がありました)。一時的な接続失敗は、エラーではなく警告として 1 回だけログに出るため、Fusion なしで Studio を起動してもコンソールが溢れなくなりました。

[0.24.3] - 2026-07-09​

Changed

  • VirgoMotionSource の再同期と受信フレームギャップのメッセージを、警告ではなく通常のログにしました。通常のタイミングのゆらぎでも発生するため、格下げしてコンソールの繰り返しのノイズを取り除きます。

Fixed

  • ポーズフレームのルートの valid バイトが、body(MediaPipe)と face(ARKit)のトラッキングビットを別々に持つようになりました。これが jp.lilium.livestudio の非対称なアバター表示ゲートを駆動するため、被写体がキャプチャーの視錐台から外れてもメッシュが点滅しなくなります。

[0.24.2] - 2026-07-05​

Changed

  • VirgoMotionSource を、ワープ時にキャプチャカメラの基準点にアンカーするようにしました。WarpTo ではアバターをマークに配置し、ソースのトランスフォームを mark + up * height + forward * distance に置いて Y 軸に 180° 回転させ(+Z が被写体を向くように)、撮影カメラ(cam0)をそこにピン留めします。実世界のカメラの高さ/距離を設定しておくと、アバターがマーク上に立ちます。ResetCamera もカメラ相対になりました。
  • VirgoMotionSource の既定の _cameraDistance / _cameraHeight を 0.7m / 1.3m にしました。

Fixed

  • 受信したポーズフレームを、ギャップを許容してサンプリングするようにしました。補間バッファが正確なフレーム番号を要求する代わりに近傍のフレームを探索するため、壁時計量子化による周期的な欠落フレームや、時折の UDP 欠落を吸収します。これにより Capture→Fusion→Studio 経路で見られた再現性のあるモーションのスパイク/スタッターが解消されます。
  • キャプチャのリセットがヨーを正しくゼロにするようにし、再センタリングで残留した向きが残らないようにしました。

[0.23.5] - 2026-06-22​

Added

  • Readme インスペクタが、ゲームパッドの背景入力に必要なプロジェクト設定(Player Settings の「Run In Background」と Input System の「Background Behavior = Ignore Focus」)を検証するようになりました。どちらかが無効な場合は警告と、両方を一括で有効化するワンクリックボタンを表示します。これにより、アプリが最前面ウィンドウでない間もビルドでゲームパッド入力が機能し続けます。

[0.23.0] - 2026-06-21​

Changed

  • VirgoMotionSource が、受信した最も近い 2 つの 60fps フレーム間を Update 内で補間するようにしました(補間対象が既にバッファされているよう、設定可能な _delaySeconds のリードを設けています)。これにより可変レンダーフレームレートでもアバターが滑らかに進み、フレーム保持時に SpringBone が震えなくなりました。配置の基準として任意の anchor トランスフォームを使えるようになり、ソースを追加読み込みしたセット内に置けます。
  • VRCFTAvatar の表情を ExpressionResolver 経由でルーティングするようにしました。

Fixed

  • ResetCamera が、ポーズ駆動のアバタールート(ぶれたポーズスナップショットに引っ張られて毎回わずかに着地点が変わっていた)ではなく、キャプチャーカメラチャンネル(デバイス/ARKit のヨー)を読むようにしました。繰り返しリセットしても安定します。新しい _cameraHeight フィールド(既定 1.5m)が仮想カメラを床に落とさず目線の高さに持ち上げます。

[0.22.0] - 2026-06-14​

Added

  • ワイヤーフレームの AnimationFrameData が、ボーンごとのトラッキング presence 配列(bonePresences、0..1)を持つようになり、HumanoidPoseData.bonePresences へ橋渡しされます。これにより Studio のアバターが、モーションのポーズと自身のアニメーションをボーン単位でブレンドできます。AnimationSystem.MakeAnimationFrameData は現状すべてのトラッキング対象ボーンを presence 1(全身トラッキング)で埋めますが、合成側で個々のボーンを下げてアニメーションを流すことができます。

Changed

  • ワイヤーフレームの AnimationFrameData が、単一カメラではなく 2 つのキャプチャーカメラチャンネル(cameras[2]、各 1 つの CameraData)を持つようになり、worldA / worldB のカメラを個別にアバターパイプラインへ橋渡しします。
  • ワイヤーフォーマット変更: AnimationFrameData にボーンごとの presence 配列と 2 つ目のキャプチャーカメラチャンネルが加わり、シリアライズサイズが変わりました。Fusion アプリと Studio はフレームを厳密な構造体サイズで検証するため、Studio が再びフレームを受け付けるには Fusion 実行ファイルを再ビルドする必要があります(古い Fusion ビルドは無効サイズとして拒否されます)。

[0.21.2] - 2026-06-11​

Changed

  • FusionApp がシャットダウン時に Fusion プロセスの終了を保証するようにしました。PID で識別する終了シグナルを配信できない場合(起動時の競合や前回実行の孤児プロセス)は、プロセスを残し続ける代わりに強制終了します。Studio は Fusion の終了を待ってブロックしなくなりました。
  • BuildStudioApp が、ビルド出力フォルダと exe 名をプロジェクトフォルダ(VirgoMotionStudio / VirgoMotionStudioVRC)から決めるようにし、専用の VRC ビルドエントリーポイントとプロファイルのパスを廃止しました。バッチモードでは最初のビルドシーンを開き、lilToon が全シェーダーバリアントを再コンパイルするのを避けます。

[0.21.0] - 2026-06-08​

Changed

  • Fusion プロセスを静的な FusionAppHost ではなく FusionApp コンポーネントがホストするようにし、Fusion のホスティングをシーンごとに設定できるようにしました。

[0.20.11] - 2026-06-03​

Added

  • Studio 終了時に PID で識別した終了シグナル(FusionQuitSignalListener)で Fusion をグレースフルに終了させ、ウィンドウなしの Fusion プロセスが強制終了される代わりに状態を保存するようにしました。

Changed

  • Studio が Fusion を停止する際に終了を待ってブロックしなくなりました。終了シグナルを送って即座に戻ります。

Fixed

  • Readme インスペクターのボタンが、LiveStudioVirgo を変更不可の git/レジストリ依存として取り込んだ場合でもクリックできるようにしました。

[0.20.10] - 2026-06-02​

Added

  • Fusion 起動前にキャプチャー用 UDP ポートを Windows ファイアウォールで自動的に許可するようにしました(初回のみ UAC プロンプト)。新しい registerFusionFirewallRule / fusionCapturePorts プロジェクト設定で制御します。
  • モーションを受信できないときに復旧するための「Allow Capture Ports through Firewall」ボタンを Readme インスペクターに追加し、オプションパッケージ一覧の上に説明行を追加しました。

Changed

  • 「Allow Capture Ports through Firewall」操作が、ルールが既に存在する場合に黙って何もしない代わりに、結果(既に許可済み/追加/失敗)をダイアログで報告するようにしました。

[0.20.9] - 2026-06-02​

Added

  • ライブの UDP パケット受信状態を示す VirgoMotionSource 受信インジケーターを追加しました。
  • Readme インスペクターに Install ボタンを備えたオプションパッケージインストーラーを追加しました。

Fixed

  • UDP 受信スレッドのビジーウェイトを Socket.Poll に置き換え、アイドル時の CPU 使用を削減しました。

[0.19.1] - 2026-05-07​

Added

  • 初回リリース。親 VirgoMotion リポジトリから jp.lilium.livestudio.virgo として取り込みました。jp.lilium.livestudio の上に VirgoMotion 固有のアダプター層(UDP VirgoMotionSource、Fusion REST FusionRequestSystem、AnimationFrameBridge、Build / Tools メニュー)を提供します。