メインコンテンツへスキップ

01. 「Inverse3 」を出力する

シミュレーションのWebSocketに接続し、サービスが報告する最初のInverse3 のカーソル位置、速度、および力をストリーミングします。

学習内容:

  • WebSocket接続の確立と初期フルステートメッセージの受信
  • 強度ゼロのキープアライブを以下経由で送信する set_cursor_force, セッションがアクティブな状態を維持できるように
  • Haply Hubがシミュレーションを認識できるように、セッションプロファイルを登録する
  • 最初のメッセージに対するハンドシェイクパターン — 最初の送信後に「session/configure」を削除する
  • ワークスペースの読み出し—transform (位置、回転、拡大縮小)と部分更新のセマンティクス
  • コンソール出力を読みやすい速度に抑える

手順​

  1. WebSocket 経由で接続してください ws://localhost:10001. このサービスは直ちに フルステート・フレーム 接続されたデバイスと。
  2. 最初のフレームでは、 device_id 最初のInverse3 を選択し、2つの部分からなる問い合わせメッセージを作成してください:
    • session.configure.profile.name — シミュレーションを登録する Haply.
    • デバイス固有のコマンド set_cursor_force ゼロベクトルを使用します。このサービスはこれをキープアライブとして利用しており、コマンドの受信が続く限り、ステータスフレームを送信し続けます。
  3. そのメッセージを返信してください。 このフィールドを削除してください session 次のサイクル前に――セッションプロファイルは1回限りのハンドシェイクであり、その後のサイクルではコマンドのみを送信する。
  4. それ以降の各状態フレームでは、カーソルフィールドに vec3 (位置、速度、力)を、約10 Hzに制限して出力し、力をゼロにしたキープアライブを再度送信してください。

パラメータ​

名称標準値Zweck
URIws://localhost:10001シミュレーションチャンネルのWebSocket URL
PRINT_EVERY_MS100コンソール出力の制限
セッションプロファイル名co.haply.inverse.tutorials:print-inverse3Haply Hub におけるこのシミュレーションを特定します

読み込まれた状態フィールド​

Aus data.inverse3[0].state:

  • cursor_position, cursor_velocity, current_cursor_force — それぞれ vec3
  • transform — ワークスペース変換;サブオブジェクトとして position (vec3), rotation (quaternion), scale (vec3)
部分更新のためのセマンティクス

中立の標準値に相当するフィールド(position: {0,0,0}, rotation: {w:1,x:0,y:0,z:0}, scale: {1,1,1}), となる ペイロードから除外された、帯域幅を節約するためです。読み込む際は、必ずデフォルト値を指定してください(例: .value("position", default_pos) C++では、 .get("position", default_pos) (Pythonで)。有効にしてください serialization/explicit_fields、すべてのフィールドを常に保持するため。

送信/受信​

WebSocketループ:ステータスフレームの受信、および コマンドフレーム. 最初のコマンドフレームには、セッションハンドシェイクと、強度ゼロのキープアライブが以下を通じて含まれています。 set_cursor_force; それ以降の各フレームには nur キープアライブ(セッションが削除されます)。

単一の非同期ループ — recv() → コマンドを作成 → send() → 繰り返す。

async with websockets.connect(URI) as websocket:
while True:
msg = await websocket.recv()
data = json.loads(msg)

if first_message:
first_message = False
device_id = data["inverse3"][0]["device_id"]
request_msg = {
"session": {"configure": {"profile": {
"name": "co.haply.inverse.tutorials:print-inverse3"}}},
"inverse3": [{
"device_id": device_id,
"commands": {"set_cursor_force":
{"vector": {"x": 0.0, "y": 0.0, "z": 0.0}}},
}]
}

await websocket.send(json.dumps(request_msg))
request_msg.pop("session", None) # one-shot handshake

コマンドラインオプション(Python)​

このPythonバージョンは、チュートリアルの出力内容を変更するための2つのフラグを受け付けます:

旗効果
--full各ステータスフレームの生のJSONペイロードを、1行の要約ではなく、フォーマットされた形式で出力します。サービスがどのフィールドを出力しているかを確認するのに役立ちます。
--query-config各アウトバウンド・タクトごとに再度追加します session.force_render_full_state: {} ein、これにより、サービスは各フレームごとに完全なスナップショットを再度出力するようになります( config-ブロック — デバイス種別、ファームウェア、プリセット、マウント、フィルター、…)。このフラグがない場合は config 最初のフレームでのみ送信され、それ以降のフレームはストリーミング・デルタとなります。

どちらのフラグも組み合わせることができます — python 01-haply-inverse-print-inverse3.py --full --query-config 完全なJSONペイロードを出力し、その内容は以下の通りです。 config 各サイクルごとに表示されます。これは、Haply ハブやHTTP APIを介して設定がどのように変更されるかをリアルタイムで追跡する際に便利です。参照: session.force_render_full_state そのWebSocketコマンドに対して。

C++のバリエーションでは、これらのフラグは提供されていません。これらは常に1行の要約を出力し、 config 最初のフレームのみ。

SDKインストーラーに含まれています

また、チュートリアル 01 は SDK とともにローカルにインストールされています。サービスのインストールディレクトリ内の tutorials/01-haply-inverse-print-inverse3/ nach.

出典: Python·C++·C++ Glaze

関連項目: WebSocketプロトコル ・ ステューアコマンド (set_cursor_force) ・ 会議 ・ 型 (vec3)