탐색
‘내비게이션’ 모듈을 사용하면 커서 Inverse3 가 애플리케이션의 작업 공간을 이동할 수 있게 해줍니다. — 이를 ‘속도 제어 이동’ 또는 ‘게임패드 방식의 드리프트’라고도 부릅니다. 물리적 작업 공간의 경계에 있는 단단한 벽에 부딪히는 대신, 커서는 유연한 쉘 안으로 들어가며, 가상 중심점으로부터의 거리에 따라 속도가 결정되어 작업 공간 전체가 미끄러지듯 이동합니다. 커서를 멀리 밀수록 장면이 더 빠르게 스크롤됩니다.
주요 기능(그리고 현재 유일한 기능)은 버블 탐색입니다. 버블의 모양은 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 경로
| 방법 | Chemin | 역할 |
|---|---|---|
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 }
}
}
타원체 — X/Z 방향이 Y 방향보다 더 크다
수평 방향의 편차가 수직 방향의 편차보다 더 유연해야 할 때 사용합니다:
{
"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 et center_drift_speed.
{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}
센터의 앵커리지
position et relative 활성화 시 중심점의 초기 위치를 제어합니다:
relative | 의미론 position |
|---|---|
true (기본값) | position 는 커서와의 편차 — 초기 중심은 cursor + position. 기본값을 사용하면 (0, 0, 0), 거품이 커서 위치에 정확히 나타납니다. |
false | position 는 응용 공간 내의 절대점 — 입력 시에는 마운트 공간으로 변환되고, 출력 시에는 다시 애플리케이션 공간으로 변환되므로, 왕복 처리 후의 값들이 일치하게 됩니다. |
중심점의 후속 이동
follow et speed 버블이 활성화된 후 매 사이클마다 동작을 제어합니다:
follow | speed | 행동 | 이전 등가어 |
|---|---|---|---|
false (기본값) | 무시했다 | 중심점은 초기 위치에 그대로 머무릅니다 — 고정 중심점. | center_mode: "fixed" |
true | > 0 | 센터는 슬라이더 쪽으로 다음과 같은 속도로 이동합니다. speed (m/s) 커서가 그 범위 내에 있는 동안. | center_mode: "auto_follow" (avec center_drift_speed) |
true | 0.0 | 센터는 매 사이클마다 커서 위치에 고정됩니다 — 순간이동 효과. | center_mode: "track_cursor" |
센터의 기본 동작은 이제 다음과 같습니다. fixe (follow = false). 이전 버전들은
기본 커서로 전환되었는데 (auto_follow). 설정하십시오 center.follow = true
이전 드리프트 동작을 복원하려면, 다음을 조정하십시오. center.speed 이전 값과 일치하도록
de center_drift_speed.
Lorsque follow = true 커서가 바깥쪽 경계를 넘어가면, 중심은
값이 무엇이든 상관없이 커서를 따라갑니다. speed, 그 주위에 거품을 유지하고
커서가 빠져나가지 못하게 하기 위해서입니다.
충돌에 대한 대응
거품은 커서에 가해지는 외부 힘 중 허용치를 초과하는 힘에 반응합니다. collision_detection.force_threshold :
- 속도 제한 구역 확대된다 일시적으로 (~까지
collision_detection.inflate_ratiofoisvelocity_zone_width) 사용자가 장애물을 피할 수 있는 여지를 더 많이 확보할 수 있도록 하기 위해서입니다. - Lorsque
collision_detection.enabledvauttrue(기본 설정에서) 버블의 중심은 충돌 힘의 방향으로 이동하지 않으므로, 사용자가 작업 공간을 단단한 벽에 부딪히게 하는 것을 방지합니다.
충돌 감지 기능은 다음을 사용합니다.히스테리시스 임계값 주변의 깜빡임을 방지하려면:
충돌이 활성화되면, 다음이 발생할 때까지 활성화된 상태로 유지됩니다. |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 | 커서가 속도 영역에 다시 들어올 때 누적 속도를 초기화합니다. |
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 히스테리시스를 비활성화합니다 |
JSON 3.5 스키마에서는 두 가지 기능 그룹이 제외되었으며, 해당 기능들의 구현은 3.6 버전을 위해 재구성되고 있습니다:
- 아바타의 국경 점령 : 들판
avatar_boundary_enabled,avatar_boundaryetavatar_boundary_hysteresis. - 작업 영역의 경계 설정 : 들판
workspace_bounded,workspace_transition_speedetworkspace_transition_ease.
틱 코드는 여전히 기본값으로 컴파일되고 실행되지만, 클라이언트는 HTTP나 WebSocket을 통해 해당 필드를 읽거나 쓸 수 없습니다. 3.6 버전에서는 아바타의 경계가 다음과 같은 형태로 다시 등장할 예정입니다. bounds 1단계로, ‘버블’ 객체와 동일한 수준이며, 배치 변환이 완전히 적용된 상태입니다. 중심 지그 분석이 완료되면 작업 영역의 경계가 다시 설정됩니다.
검증 규칙
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0bump_stiffness ≥ 0spring_inner ≥ 0etspring_inner ≤ spring_surface ≤ spring_outerwall_stiffness ≥ 0damping_inner ≥ 0etdamping_inner ≤ damping_surface ≤ damping_outercollision_detection.force_threshold > 0collision_detection.inflate_ratio ≥ 1.0collision_detection.exit_ratiodans(0, 1]center.speed ≥ 0
Un POST ou configure.navigation 무효한 매개변수가 포함된 요청은 거부되며, 이벤트가 invalid-value 이 메시지가 전송되면, 이전 구성은 계속 유효합니다.
행사
| 행사명 | 다음과 같은 경우 트리거됩니다. |
|---|---|
navigation-started | 이 기기에서 탐색 기능이 활성화되어 있습니다. |
navigation-updated | 이미 활성화된 상태인 탐색 구성이 업데이트됩니다. |
navigation-stopped | 탐색이 중지되었습니다(명시적으로 비활성화됨, DELETE (또는 로그아웃) |
invalid-value | 검증 과정에서 탐색 구성이 거부되었습니다. |
알려진 한계
- 3.5 버전에서 작업 공간 구분 및 아바타 경계선이 숨겨져 있습니다. 이 두 가지 기능 그룹은 3.6 버전을 위해 개편 중인 관계로 JSON 스키마에서 제외되어 있습니다. 위의 ‘매개변수 참조’ 섹션에 있는 참고 사항을 참조하십시오.
- 비균일한 크기 조정 + 회전 : lorsque
rotation_enabledetscale_enabled두 가지가 모두 활성화된 경우, 회전 효과가 크기 조정 축에 적용되지 않기 때문에 속도 방향이 약간 부정확해집니다. - 기기별 크기 조정: 버블의 크기(반지름, 영역 너비)는 기기의 물리적 배율에 따라 조정되지 않습니다. MInverse 와 Inverse3 는 동일한 절대 크기를 사용하므로, 각 사이트에서 버블 크기가 다르게 보일 수 있습니다.