탐색
내비게이션 모듈을 사용하면 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) 형태로 표현됩니다. 형태에 따라 탐색 시 느껴지는 감각이 달라집니다. 등방성 드리프트에는 구체를, 특정 축을 강조하려면 타원체나 직육면체를, 복도 탐색에는 캡슐 형태를 사용합니다.
구 (기본값)
{
"shape": {
"primitive": "sphere",
"parameters": { "r": 0.05 }
}
}
타원체 — Y축보다 X/Z축 방향이 더 넓음
수평 방향의 드리프트가 수직 방향보다 더 부드럽게 느껴져야 할 때 사용하세요:
{
"shape": {
"primitive": "ellipsoid",
"parameters": { "a": { "x": 0.06, "y": 0.03, "z": 0.06 } }
}
}
둥근 상자 — 모서리가 둥근 직사각형 사각지대
{
"shape": {
"primitive": "rounded_box",
"parameters": { "b": { "x": 0.04, "y": 0.02, "z": 0.04 }, "r": 0.008 }
}
}
캡슐 — 길쭉한 복도
두 개의 종점 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",
"workspace_bounded": true
}
}
}
}
]
}
속도 곡선
속도 구간 거리는 이징 곡선을 통해 변환된 후 작업 영역 속도로 변환됩니다. 사용자가 쉘 안쪽으로 더 깊이 들어갈수록 장면이 가속되는 방식에 맞는 이징을 선택하세요.
velocity_ease | 느낌 | 사용 시기 |
|---|---|---|
linear | 일정한 가속도 | 예상대로, 훌륭한 기본값 |
quadratic_in | 시작은 느렸지만, 후반에 속도를 내며 | 표면 근처에서는 정밀하고, 장거리 이동 시에는 빠름 |
cubic_in | 시작이 매우 더뎠다 | 매우 정밀하며, 긴 이동 거리를 점차적으로 늘려갑니다 |
sine_out | 부드럽고 빠른 출발, 바깥쪽 근처에서 속도가 정체됨 | 반응이 빠르고, 글자 크기를 부드럽게 조절합니다 |
quadratic_out | 출발 시 가속력이 뛰어나며, 장거리 주행 시 편안함 | 빠른 가속, 편안한 주행 |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
중심 모드
버블의 중심은 커서를 따라가거나, 커서에 정렬되거나, 마운트 공간에 고정된 상태로 유지될 수 있습니다.
center_mode | 행동 | 사용 사례 |
|---|---|---|
auto_follow (기본값) | 커서를 향해 천천히 이동하며 center_drift_speed 커서가 말풍선 안에 있을 때 | 일반적인 탐색 — 버튼을 누르는 사이에 커서 위치로 "되돌아가" |
fixed | 중앙은 절대 자동으로 이동하지 않습니다 | 특정 기준점을 중심으로 한 고정 항법 |
track_cursor | 매 초마다 커서 위치로 이동합니다 | 텔레포트 방식의 이동 — 커서는 항상 거품의 중심에 위치합니다 |
{ "center_mode": "fixed" }
모든 모드에서: 커서가 바깥쪽 경계를 벗어나면, 중앙이 커서를 추적하여 버블이 커서 주위에 유지되도록 하고 커서가 빠져나가지 못하게 합니다.
작업 공간 경계
대부분의 기기는 물리적 범위가 제한적입니다. workspace_bounded 이 설정되면,
버블의 중심은 장치의 물리적 작업 공간 내에 유지되므로
그에 따른 탐색으로 인해 커서가 도달 가능한 영역 밖으로 벗어나지 않게 됩니다.
{ "workspace_bounded": true }
초기 중심점이 작업 영역 밖에 있는 경우, 모듈은 시간이 지남에 따라 이를 서서히
안쪽으로 이동시킵니다 (workspace_transition_speed / workspace_transition_ease)
갑작스럽게 전환하는 대신 — 시작 시 진동으로 인한 갑작스러운 움직임을 방지합니다.
아바타 경계
~할 때 avatar_boundary_enabled 이 설정되면, 최종 아바타의 세계 내 위치
(작업 공간 + 커서)가 임의의 SDF 형상 내부에 고정됩니다. 축별 고정 스크립트를 작성하지 않고도
사용자를 방, 복도, 차량 조종석 등에 가두는 데 유용합니다.
{
"avatar_boundary_enabled": true,
"avatar_boundary": {
"primitive": "box",
"parameters": { "b": { "x": 5.0, "y": 3.0, "z": 5.0 } }
}
}
그리고 avatar_boundary 이 도형은 버블 도형과 동일한 기본 도형을 지원합니다
(sphere, ellipsoid, rounded_box, capsule, box, ...).
충돌 대응
버블은 다음을 초과하는 외부 커서 힘에 반응합니다 collision_threshold:
- 일시적인 속도 제한 구간 부풀다 (최대
collision_inflate_scale횟수velocity_zone_width) 사용자가 장애물을 피할 수 있는 여지를 더 많이 확보하기 위해 - ~와 함께
stop_at_collision, 버블 중심은 충돌력의 방향으로 이동하는 것을 거부하여, 사용자가 작업 공간을 단단한 벽 쪽으로 끌어당기는 것을 방지합니다.
{ "stop_at_collision": true, "collision_threshold": 0.5, "collision_inflate_scale": 2.0 }
매개변수 참조
가장 많이 조정되는
| 매개변수 | 기본값 | 설명 |
|---|---|---|
shape | {sphere, r=0.05} | 데드 존을 정의하는 SDF 형상 |
velocity_zone_width | 0.03 m | 유량 조절 쉘의 두께 |
max_velocity | 1.0 분/초 | 최대 항해 속도 |
velocity_ease | "linear" | 거리 → 속도 이징 곡선 |
center_mode | "auto_follow" | 센터가 커서를 어떻게 추적하는지 |
workspace_bounded | false | 클램프 중심을 장치의 물리적 작업 영역에 맞추기 |
전체 매개변수 목록
| 필드 | 유형 | 기본값 | 설명 |
|---|---|---|---|
center | vec3 | (0,0,0) | 마운트 공간 내 초기 버블 중심 |
shape | 모양 | {sphere, r=0.05} | 데드존 SDF 형상 |
velocity_zone_width | float | 0.03 | 유량 제어 쉘의 폭 (m) |
max_velocity | float | 1.0 | 최대 항행 속도 (m/s) |
velocity_ease | 문자열 | "linear" | 거리→속도 이징 |
reset_velocity_on_entry | bool | true | 커서가 속도 영역에 다시 진입할 때 누적 속도를 0으로 초기화합니다 |
bump_width | float | 0.003 | 표면의 돌기 (m) |
bump_stiffness | float | 500.0 | 표면 요철의 탄성 계수 |
spring_inner | float | 4.0 | 버블 센터의 봄 |
spring_surface | float | 7.0 | 수면 위의 봄 |
spring_outer | float | 12.0 | 외곽의 봄 |
wall_stiffness | float | 700.0 | 외곽 경계를 넘어 단단한 벽에 부딪히다 |
damping_inner | float | 0.2 | 중앙부의 감쇠 |
damping_surface | float | 0.7 | 표면에서의 감쇠 |
damping_outer | float | 5.0 | 외부 경계에서의 감쇠 |
rotation_enabled | bool | false | 작업 공간 회전을 탐색 방향에 적용합니다 |
scale_enabled | bool | false | 작업 공간 배율을 이동 속도에 적용합니다 |
center_mode | 열거형 | "auto_follow" | "auto_follow" / "fixed" / "track_cursor" |
center_drift_speed | float | 0.03 | 표류 속도 auto_follow 속도 (m/s) |
workspace_bounded | bool | false | 버블의 중심을 장치 작업 영역에 고정합니다 |
workspace_transition_speed | float | 1.2 | 초기 클램프 전환 속도 |
workspace_transition_ease | 문자열 | "quadratic_in_out" | 초기 클램프 전환의 완화 |
stop_at_collision | bool | false | 충돌 방향으로의 이동을 차단 |
collision_threshold | float | 0.001 | 충돌을 감지하기 위한 외부 힘 임계값 (N) |
collision_inflate_scale | float | 2.0 | 충돌 시 속도 구역 폭에 적용되는 배율 |
avatar_boundary_enabled | bool | false | 아바타 경계 고정 활성화 |
avatar_boundary | 모양 | {sphere, r=0.1} | 아바타 위치 제약 조건을 위한 SDF 형상 |
검증 규칙
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0spring_inner ≤ spring_surface ≤ spring_outerdamping_inner ≤ damping_surface ≤ damping_outercollision_threshold > 0,collision_inflate_scale ≥ 1.0- 모든 속도 값은 0 이상입니다
A POST 또는 configure.navigation 유효하지 않은 매개변수가 포함된 요청은 거부되며,
invalid-value 이벤트가 발생하더라도 이전 구성은 계속 유효합니다.
이벤트
| 행사명 | 해고된 시점 |
|---|---|
navigation-started | 기기에서 내비게이션이 활성화되었습니다 |
navigation-updated | 이미 활성화된 상태에서 탐색 설정이 업데이트됩니다 |
navigation-stopped | 탐색이 중지되었습니다(명시적 비활성화, DELETE, 또는 세션 종료 시) |
invalid-value | 검증 과정에서 내비게이션 구성이 거부되었습니다 |
알려진 제한 사항
- 비일정한 크기 + 회전: 둘 다
rotation_enabled그리고scale_enabled이 기능이 켜져 있으면 속도 방향이 약간 부정확합니다. 스케일 축에는 회전 효과가 적용되지 않기 때문입니다. - 작업 영역 경계 전환: 부드러운 클램프백 전환은 초기화 시에만 실행됩니다. 정상적인 사용 중에 버블의 중심이 작업 영역 밖으로 벗어나면, 이완 효과 없이 클램프가 즉시 적용됩니다.
- 기기별 크기 조정: 버블 크기(반지름, 영역 너비)는 기기의 물리적 배율에 따라 조정되지 않습니다. Minverse Inverse3 동일한 절대 크기를 Inverse3 , 기기마다 다르게 느껴질 수 있습니다.