마운트 및 작업 공간의 변환
두 가지 변환이 애플리케이션 공간 내 장치의 위치를 결정합니다. 파이프라인을 이해하면 적절한 변환을 선택하기가 더 쉬워집니다.
좌표 파이프라인
| 무대 | 기능 | 설정 방법 | 지속성 |
|---|---|---|---|
| 기저 변환 | 축을 재매핑합니다(예: Z-up → Y-up) | 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 | 수동 — 마운트를 직접 설정 | — |
프리셋을 선택하면 마운트, 좌표계 변환, 작업 공간 원점이 한 번에 일괄 설정됩니다.
마운트를 직접 설정하기
- 웹소켓
- 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 를 직접 직렬화하기 위해서입니다.
작업 공간 변환
워크스페이스 변환은 마운트 위에 적용되는런타임 드리프트입니다. 대표적인 사용 사례는 씬 내비게이션입니다. 즉, 기기를 물리적으로 같은 위치에 둔 채로 애플리케이션 뷰를 이동, 회전, 확대/축소하는 것을 의미합니다.
마운트 변환과 워크스페이스 변환은 모두영구적입니다. 서비스는 전송된 마지막 값을 유지합니다. 차이점은 용도와 성능에 있습니다:
- 마운트는한 번 설정하면 변경하지 않는다는 전제 하에 설계되었습니다. 이는 물리적 구성을 나타내며, 드물게 이루어지는 업데이트에 최적화되어 있습니다.
- 워크스페이스 변환은높은 빈도로 스트리밍된다는 전제 하에 설계되었습니다 (예: 카메라 이동 중에는 매 프레임마다). 내부 파이프라인은 이러한 업데이트 빈도에 최적화되어 있습니다.
- 웹소켓
- 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 틱마다 스트리밍하는 대신,네비게이션 모듈 이 기능을 사용해 주세요. 물리 시뮬레이션, 햅틱 피드백, 작업 공간 경계 처리를 한 번에 처리해 줍니다.