マウントとワークスペースの変形
2つのトランスフォームが、アプリケーション空間内でのデバイスの位置を決定します。パイプラインを理解すれば、適切なものを選びやすくなります。
座標パイプライン
| ステージ | 機能 | 設定方法 | 永続性 |
|---|---|---|---|
| 基底変換 | 軸を再マッピングします(例:Z軸上向き → Y軸上向き) | session.configure.basis — チュートリアル 08 を参照(HTTP リモート設定) | はい |
| マウント変換 | デバイスの物理的な取り付けオフセット(アームの位置、回転、スケール) | configure.mount または configure.preset — チュートリアル 08 を参照(HTTP リモート設定) | はい |
| ワークスペースの変換 | カメラ/シーンのナビゲーションによるドリフト | commands.set_transform — チュートリアル 09 を参照(WebSocket によるティックごとのストリーミング) | はい(保持される) |
マウント変換
マウントとは、デバイスが物理的にどこに配置されているかを表します。アームのオフセット、 向き、スケールです。一度設定すれば(ユーザーが物理的なセットアップを変更した際に再設定されます)、実行時に更新されることはほとんどありません。
プリセット(工場出荷時の設定)
マウントを自分で計算する代わりに、名前付きのプリセットを選択してください:
| プリセット | 原点の配置 | アームの向き |
|---|---|---|
defaults | デバイスの基部 | 前方(アームの正面) |
arm_front | デバイスの基部 | 前方 |
arm_front_centered | ワークスペースの中央 | 前方 |
led_front | デバイスの基部 | LED側を前方へ |
led_front_centered | ワークスペースの中央 | LED側を前方へ |
custom | 手動 — マウントを自分で設定する | — |
プリセットを選択すると、マウント、座標系変換、ワークスペースの原点が一度にまとめて設定されます。
マウントを直接設定する
- WebSocket
- HTTP
{
"inverse3": [{
"device_id": "049D",
"configure": {
"mount": {
"transform": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"rotation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 },
"scale": { "x": 1.0, "y": 1.0, "z": 1.0 }
}
}
}
}]
}
curl -X POST "http://localhost:10001/inverse3/049D/config/mount?session=:0" \
-H "Content-Type: application/json" \
-d '{"transform":{"position":{"x":0,"y":0,"z":0},"rotation":{"w":1,"x":0,"y":0,"z":0},"scale":{"x":1,"y":1,"z":1}}}'
mount と preset は同時に指定できません同じメッセージで両方を送信すると意味が曖昧になるため、サービスはこれを拒否します。
どちらか一方を選択してください:名前付き preset(マウントを自動的に設定します)、または明示的な
mount 変換。
マウントを送信するその場合は、変換を次のようにラップします:{ "mount": { "transform": { … } } }。
スナップショットからマウントを読み取るその場合は、フラットな形式になります:{ "mount": { "position": …, "rotation": …, "scale": … } }。
これは意図された設計です。コマンドは統一された command_data ラッパーを使用すると、スナップショットは core::transform を直接シリアライズするためです。
ワークスペースの変換
ワークスペース変換は、マウントに対して適用される実行時のドリフトです。 代表的なユースケースは、シーンのナビゲーションです。つまり、デバイスを物理的に同じ位置に置いたまま、アプリケーションのビューをパン、回転、ズームすることを指します。
マウント変換とワークスペース変換は、どちらも永続的です。サービスは送信された最後の値を保持します。両者の違いは、目的とパフォーマンスにあります:
- マウントは、一度設定したら変更しないことを前提に設計されています。物理的な構成を表しており、更新頻度が低い場合に最適化されています。
- ワークスペースの変換は、高頻度でストリーミングされることを前提に設計されています (例:カメラのナビゲーション中は毎フレーム)。内部パイプラインはこの更新頻度に最適化されています。
- WebSocket
- HTTP
{
"inverse3": [{
"device_id": "049D",
"commands": {
"set_transform": {
"transform": {
"position": { "x": 1.0, "y": 0.0, "z": 0.0 },
"rotation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 },
"scale": { "x": 1.0, "y": 1.0, "z": 1.0 }
}
}
}
}]
}
curl -X POST "http://localhost:10001/inverse3/049D/state/transform?session=:0" \
-H "Content-Type: application/json" \
-d '{"transform":{"position":{"x":1,"y":0,"z":0},"rotation":{"w":1,"x":0,"y":0,"z":0},"scale":{"x":1,"y":1,"z":1}}}'
GET は現在の変換を返し、DELETE は恒等変換にリセットします。
マウントまたはワークスペースをスケーリングすると、デバイスが描画する力が変化します。スケーリングは接触力の計算に使用されます。侵入深度に影響するためです。例えば 2x このスケールでは、侵入深度がおよそ半分になります(デバイスの可動範囲に対して仮想シーンの大きさが2倍になるため)。その結果、感じる力は 1x その時の概算半分となります。逆に 0.5x このスケールでは、力はおよそ2倍になります。
これは通常、望ましい動作です。ハプティックシーンを縮小すると、接触は自然に弱くなり(「より遠くにいる」状態になるため)、拡大すると接触は強くなります。もしこれが望ましくない場合(例:ユーザーがズームしても剛性を一定に保つ必要がある場合)は、力のゲインをスケーリングの逆数で補正してください。
連続的な移動(バブルナビゲーション、レート制御によるドリフト)が必要な場合は、
手動で set_transform ティックごとにストリーミングする代わりに、ナビゲーション・モジュール を使用してください。物理演算、ハプティックフィードバック、ワークスペースの境界処理を一括して処理してくれます。