탐색
내비게이션 모듈을 사용하면 Inverse3 애플리케이션의 작업 공간을 이동시킬 수 있습니다. 이를 속도 제어 이동 ( rate-control locomotion ) 또는 “게임패드식 드리프트”라고도 부릅니다. 커서가 물리적 작업 공간의 가장자리에 있는 단단한 벽에 부딪히는 대신, 가상 중심으로부터의 거리가 작업 공간 전체를 미끄러지게 하는 속도로 매핑되는 유연한 영역으로 진입합니다. 커서가 더 멀리 밀수록 씬이 더 빠르게 스크롤됩니다.
주요(그리고 현재 유일한) 동작은 버블 내비게이션입니다. 버블 모양은 SDF 프리미티브를 사용하여 정의됩니다. 개념에 대해서는 ‘SDF란 무엇인가? ’를 참조하십시오.
버블 내비게이션 — 개념
장치의 장착 공간 내 중심점을 기준으로 가상 버블이 형성됩니다. 커서는 세 개의 동심원 구역을 통과하게 됩니다:
┌──────────────────────────────────────────┐
│ WALL ZONE │ cursor beyond outer shell
│ ┌────────────────────────────────────┐ │
│ │ VELOCITY ZONE │ │ soft shell → scene moves
│ │ ┌──────────────────────────────┐ │ │
│ │ │ DEAD ZONE (inside) │ │ │ no scene movement
│ │ │ │ │ │
│ │ │ ● centre │ │ │
│ │ │ │ │ │
│ │ └──────────────────────────────┘ │ │
│ │ bubble surface │ │
│ └────────────────────────────────────┘ │
│ outer boundary │
└──────────────────────────────────────────┘
| 구역 | 커서 위치 | 행동 |
|---|---|---|
| 사각지대 | 거품 속 | 이동 기능은 없습니다. 조명 감쇠가 적용됩니다. 장면을 자유롭게 조작할 수 있습니다. |
| 속도 제한 구간 | 표면과 외곽 경계 사이에서 | 거리-속도 곡선을 따라 커서가 가리키는 방향으로 작업 영역이 이동합니다. |
| 벽 구역 | 외곽 경계를 지나 | 단단한 스프링이 커서를 안쪽으로 밀어 넣으면 이동 속도가 포화 상태에 이릅니다. |
세 구역 전체에 스프링-댐퍼 방식의 햅틱 힘이 가해지므로, 표면과 드리프트 쉘, 그리고 외벽을 모두 느낄 수 있습니다.
빠른 시작 — 버블 탐색 활성화
네비게이션은 영구적인 일회성 구성입니다. 한 번 전송하면 사용자가 명시적으로 중지하거나, 서비스를 다시 시작하거나, 세션을 종료할 때까지 활성 상태로 유지됩니다.
시작 (최소 — 기본 둥근 사각형 버블)
- 웹소켓
- HTTP
{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "bubble" }
}
}
]
}
curl -X POST "http://localhost:10001/inverse3/04C3/config/navigation?session=:0" \
-H "Content-Type: application/json" \
-d '{"mode": "bubble"}'
중지
- 웹소켓
- HTTP
{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "disabled" }
}
}
]
}
curl -X DELETE "http://localhost:10001/inverse3/04C3/config/navigation?session=:0"
기타 HTTP 경로
| 방법 | 경로 | 목적 |
|---|---|---|
GET | /{type}/{id}/config/navigation?session=<expr> | 현재 탐색 설정 및 상태 |
POST | /{type}/{id}/config/navigation?session=<expr> | 길찾기 시작 또는 업데이트 |
DELETE | /{type}/{id}/config/navigation?session=<expr> | 탐색 중지 |
버블 모양 카탈로그
버블의 사각 지대는 부호 거리 함수(SDF) 형태로 표현됩니다. 형태에 따라 탐색 느낌이 달라집니다. 편안한 직사각형 휴식 구역에는 둥근 상자(기본값)를, 등방성 표류에는 구체를, 특정 축을 강조하려면 타원체를, 복도에는 캡슐 형태를 사용합니다.
둥근 모서리의 상자 (기본값)
기본 데드 존은 평평하고 깊이보다 높이가 약간 더 높은 구조로, Inverse3 MInverse 모두에서 편안한 느낌을 주도록 조정되었습니다:
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.05, "y": 0.02, "z": 0.03 }, "r": 0.01 }
}
}
구 — 등방성 편차
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
타원체 — Y축보다 X/Z축 방향이 더 넓음
수평 방향의 드리프트가 수직 방향보다 더 부드럽게 느껴져야 할 때 사용하세요:
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
캡슐 — 길쭉한 복도
두 개의 종점 a/b 반경까지 r:
{
"shape": {
"primitive": "capsule",
"parameters": {
"a": { "x": 0.0, "y": -0.03, "z": 0.0 },
"b": { "x": 0.0, "y": 0.03, "z": 0.0 },
"r": 0.04
}
}
}
사용자 지정 크기 및 움직임 효과를 적용한 전체 예시:
{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": {
"mode": "bubble",
"bubble": {
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
},
"velocity_zone_width": 0.025,
"max_velocity": 1.0,
"velocity_ease": "quadratic_in"
}
}
}
}
]
}
속도 곡선
속도 구간 거리는 이징 곡선을 통해 변환된 후 작업 영역 속도로 변환됩니다. 사용자가 쉘 안쪽으로 더 깊이 들어갈수록 장면이 가속되는 방식에 맞는 이징을 선택하세요.
velocity_ease | 느낌 | 사용 시기 |
|---|---|---|
linear | 일정한 가속도 | 예상대로, 훌륭한 기본값 |
quadratic_in | 시작은 느렸지만, 후반에 속도를 내며 | 표면 근처에서는 정밀하고, 장거리 이동 시에는 빠름 |
cubic_in | 시작이 매우 더뎠다 | 매우 정밀하며, 긴 이동 거리를 점차적으로 늘려갑니다 |
sine_out | 부드럽고 빠른 출발, 바깥쪽 근처에서 속도가 정체됨 | 반응이 빠르고, 글자 크기를 부드럽게 조절합니다 |
quadratic_out | 출발 시 가속력이 뛰어나며, 장거리 주행 시 편안함 | 빠른 가속, 편안한 주행 |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
중심 행동
버블의 중심은 중첩된 구조를 통해 구성됩니다 center 네 개의
필드를 가진 객체 — position, relative, follow, speed — 기존의 평면
구성을 대체하여 center, center_enabled, center_mode및 center_drift_speed.
{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}
중심점이 고정된 곳
position 그리고 relative 활성화 시 초기 중심 위치를 제어합니다:
relative | 의미론 position |
|---|---|
true (기본값) | position 는 커서로부터의 오프셋 — 첫 번째 글자는 cursor + position. 기본값으로 (0, 0, 0), 거품이 커서 위치에 정확히 생성됩니다. |
false | position 는 좌표계의 절대점 — 데이터가 유입될 때 마운트 공간으로 변환되고, 유출될 때 다시 애플리케이션 공간으로 변환되므로 왕복 값이 일치합니다. |
그 후 센터가 어떻게 움직이는지
follow 그리고 speed 버블이 활성화된 후 틱별 동작을 제어합니다:
follow | speed | 행동 | 이전의 대응 항목 |
|---|---|---|---|
false (기본값) | 무시하다 | 중심점은 초기화된 위치에 고정됩니다 — 고정 중심점. | center_mode: "fixed" |
true | > 0 | 중앙이 커서 쪽으로 이동합니다 speed 커서가 내부에 있는 동안 m/s. | center_mode: "auto_follow" (와 함께) center_drift_speed) |
true | 0.0 | 매 초마다 커서 위치로 즉시 이동합니다 — 순간 이동 같은 느낌입니다. | center_mode: "track_cursor" |
이제 기본 중앙 정렬 동작은 다음과 같습니다. 수정됨 (follow = false). 이전 버전들은
기본적으로 커서 쪽으로 이동하는 경향이 있었습니다 (auto_follow). 설정 center.follow = true
이전 드리프트 동작을 복원하고, 조정하기 위해 center.speed 이전 값과 일치하도록 center_drift_speed.
~할 때 follow = true 그리고 커서가 바깥쪽 경계를 넘어가면, 중심은
어떠한 경우에도 커서를 따라갑니다 speed, 주변에 버블을 유지하여
커서가 밖으로 빠져나가지 못하게 하기 위해.
충돌 대응
버블은 다음을 초과하는 외부 커서 힘에 반응합니다 collision_detection.force_threshold:
- 일시적인 속도 제한 구간 부풀다 (최대
collision_detection.inflate_ratio횟수velocity_zone_width) 사용자가 장애물을 피할 수 있는 여유를 더 많이 확보할 수 있도록 하기 위해. - ~할 때
collision_detection.enabled는true(기본값), 버블의 중심은 충돌력의 방향으로 이동하지 않으므로, 사용자가 작업 공간을 단단한 벽 쪽으로 끌어당기는 것을 방지합니다.
충돌 감지의 용도 히스테리시스 임계값 주변에서 깜빡임을 방지하려면:
충돌이 활성화되면 다음까지 활성화된 상태로 유지됩니다. |ext_force| ...보다 낮아진다
제품 collision_detection.force_threshold × collision_detection.exit_ratio.
내리세요 exit_ratio 히스테리시스 대역을 넓히기 위해(충돌 시 더 강한 결합);
다음 값으로 설정하세요 1.0 히스테리시스를 비활성화하고 단일 임계값을 사용하려면.
{
"collision_detection": {
"enabled": true,
"force_threshold": 0.5,
"inflate_ratio": 2.0,
"exit_ratio": 0.7
}
}
매개변수 참조
가장 많이 조정되는
| 매개변수 | 기본값 | 설명 |
|---|---|---|
shape | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | 데드 존을 정의하는 SDF 형상 |
velocity_zone_width | 0.03 m | 유량 조절 쉘의 두께 |
max_velocity | 0.5 분/초 | 최대 항해 속도 |
velocity_ease | "quadratic_in" | 거리 → 속도 이징 곡선 |
center.follow | false | 센터가 커서를 추적하는지 여부 |
center.speed | 0.02 분/초 | 속도가 follow = true |
전체 매개변수 목록
| 필드 | 유형 | 기본값 | 설명 |
|---|---|---|---|
center.position | vec3 | (0, 0, 0) | 초기 중심 — 다음 상황에서 커서의 오프셋 relative = true, 앱 공간의 절대 좌표가 false |
center.relative | bool | true | true: position 커서로부터의 오프셋입니다. false: 경계에서 마운트 공간으로 변환된 앱 공간의 절대 위치 |
center.follow | bool | false | false: 중심은 초기화된 위치에 고정됩니다. true: 커서를 중앙에 맞춘다 |
center.speed | float | 0.02 | 다음 조건에서의 표류 속도 (m/s) follow = true; 0.0 매 틱마다 커서에 맞춰 이동합니다 |
shape | 모양 | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | 데드존 SDF 형상 |
velocity_zone_width | float | 0.03 | 유량 제어 쉘의 폭 (m) |
max_velocity | float | 0.5 | 최대 항행 속도 (m/s) |
velocity_ease | 문자열 | "quadratic_in" | 거리 → 속도 이징 |
reset_velocity_on_entry | bool | true | 커서가 속도 영역에 다시 진입할 때 누적 속도를 0으로 초기화합니다 |
bump_width | float | 0.005 | 표면의 돌기 (m) |
bump_stiffness | float | 200.0 | 표면 요철의 탄성 계수 |
spring_inner | float | 0.0 | 버블 센터의 봄 |
spring_surface | float | 10.0 | 수면 위의 봄 |
spring_outer | float | 15.0 | 외곽의 봄 |
wall_stiffness | float | 700.0 | 외곽 경계를 넘어 단단한 벽에 부딪히다 |
damping_inner | float | 0.1 | 중앙부의 감쇠 |
damping_surface | float | 4.0 | 표면에서의 감쇠 |
damping_outer | float | 7.0 | 외부 경계에서의 감쇠 |
rotation_enabled | bool | false | 작업 공간 회전을 탐색 방향에 적용합니다 |
scale_enabled | bool | false | 작업 공간 배율을 이동 속도에 적용합니다 |
collision_detection.enabled | bool | true | 충돌 방향으로의 이동을 차단 |
collision_detection.force_threshold | float | 1.0 | 충돌에 입력할 외력 크기 (N) |
collision_detection.inflate_ratio | float | 2.0 | 충돌 시 속도 구역 폭에 적용되는 배율 (1.0 이상이어야 함) |
collision_detection.exit_ratio | float | 0.7 | 히스테리시스 비율 — 충돌 상태가 지속되는 시간 |ext_force| < force_threshold × exit_ratio. 범위 (0, 1]; 1.0 히스테리시스 비활성화 |
3.5 JSON 스키마에서는 두 개의 기능 그룹이 제외되었으며, 이들의 구현은 3.6 버전에 맞춰 재구성되었습니다:
- 아바타 경계 클램핑: 필드
avatar_boundary_enabled,avatar_boundary및avatar_boundary_hysteresis. - 작업 공간 경계: 필드
workspace_bounded,workspace_transition_speed및workspace_transition_ease.
틱 코드는 기본값을 사용하면 여전히 컴파일되고 실행되지만, 클라이언트는 HTTP나 WebSocket을 통해 해당 필드를 읽거나
쓰지 못합니다. 3.6 버전에서는 아바타 경계(avatar boundary)가 최상위 레벨로
반환됩니다. bounds 전체 배치 변환이 적용된 버블 객체의 피어;
센터 지터 분석이 완료되면 작업 공간 경계값이 반환됩니다.
검증 규칙
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0bump_stiffness ≥ 0spring_inner ≥ 0그리고spring_inner ≤ spring_surface ≤ spring_outerwall_stiffness ≥ 0damping_inner ≥ 0그리고damping_inner ≤ damping_surface ≤ damping_outercollision_detection.force_threshold > 0collision_detection.inflate_ratio ≥ 1.0collision_detection.exit_ratio에서(0, 1]center.speed ≥ 0
A POST 또는 configure.navigation 유효하지 않은 매개변수가 포함된 요청은 거부되며,
invalid-value 이벤트가 발생하더라도 이전 구성은 계속 유효합니다.
이벤트
| 행사명 | 해고된 시점 |
|---|---|
navigation-started | 기기에서 내비게이션이 활성화되었습니다 |
navigation-updated | 이미 활성화된 상태에서 탐색 설정이 업데이트됩니다 |
navigation-stopped | 탐색이 중지되었습니다(명시적 비활성화, DELETE, 또는 세션 종료 시) |
invalid-value | 검증 과정에서 내비게이션 구성이 거부되었습니다 |
알려진 제한 사항
- 3.5 버전에서는 작업 공간 경계와 아바타 경계가 숨겨져 있습니다. 이 두 기능 그룹은 JSON 스키마에서 제외되어 있으나, 3.6 버전에서는 구조가 변경되었습니다. 위의 ‘매개변수 참조’ 항목에 있는 참고 사항을 확인하십시오.
- 비일정한 크기 + 회전: 둘 다
rotation_enabled그리고scale_enabled이 기능이 켜져 있으면 속도 방향이 약간 부정확합니다. 스케일 축에는 회전 효과가 적용되지 않기 때문입니다. - 기기별 크기 조정: 버블 크기(반지름, 영역 너비)는 기기의 물리적 배율에 따라 조정되지 않습니다. MInverse Inverse3 동일한 절대 크기를 Inverse3 , 기기마다 다르게 느껴질 수 있습니다.