本文へスキップ
バージョン: 3.5.x

01.Inverse3印刷

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

学習内容:

  • WebSocket接続を開き、初期のフルステートメッセージを受信する
  • ゼロフォースを送信する set_cursor_force キープアライブでセッションを維持する
  • Haply シミュレーションを認識できるように、セッションプロファイルを登録する
  • 「初回メッセージのみ」のハンドシェイクパターン — 初回送信後にセッションの削除および設定を行う
  • ワークスペースの読み取り transform (位置、回転、拡大縮小)の部分更新セマンティクス
  • コンソールの出力を読みやすい速度に調整する

ワークフロー

  1. WebSocketを開く ws://localhost:10001. このサービスは直ちに フルステート・フレーム 接続されたデバイスの一覧表示。
  2. 最初のフレームでは、最初のInverse3を選択してください device_id そして、2つの部分からなるリクエストメッセージを作成します:
    • session.configure.profile.name — シミュレーションを登録します Haply.
    • デバイスごとの set_cursor_force ゼロベクトルを伴うコマンド。このサービスはこれをキープアライブとして利用しており、コマンドが到着し続ける限り、状態フレームを送信し続けます。
  3. そのメッセージを返信してください。 の皮をむく session フィールド 次のティックまで — セッションプロファイルはワンショットのハンドシェイクであり、その後のティックではコマンドのみが送信されます。
  4. その後の各状態フレーム:カーソルを表示する vec3 (位置、速度、力)の各フィールドを約10 Hzにサンプリングレート制限し、ゼロ力キープアライブを再送信する。

パラメータ

名称デフォルト目的
URIws://localhost:10001シミュレーションチャンネルのWebSocket URL
PRINT_EVERY_MS100コンソール出力スロットル
セッションプロファイル名co.haply.inverse.tutorials:print-inverse3Haply 上でこのシミュレーションを特定します

状態フィールドを読み取る

差出人 data.inverse3[0].state:

  • cursor_position, cursor_velocity, current_cursor_forcevec3 それぞれ
  • 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 keepalive; それ以降の各フレームには ただ キープアライブ(セッション情報は削除されます)。

単一の非同期ループ — recv() → build コマンド → 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つのフラグを受け付けます:

効果
--full1行の要約ではなく、各ステートフレームの生のJSONペイロードを整形して表示します。サービスがどのフィールドを送信しているかを確認するのに役立ちます。
--query-config再注入 session.force_render_full_state: {} 送信される各パケットごとに、サービスが完全なスナップショット(以下を含む)を再送信するように 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/ サービスのインストールディレクトリの下に。

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

関連: WebSocketプロトコル制御コマンド (set_cursor_force)セッション型 (vec3)