주요 콘텐츠로 건너뛰기
버전: 3.5.x

탐색

내비게이션 모듈을 사용하면 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 │
└──────────────────────────────────────────┘
구역커서 위치행동
사각지대거품 속이동 기능은 없습니다. 조명 감쇠가 적용됩니다. 장면을 자유롭게 조작할 수 있습니다.
속도 제한 구간표면과 외곽 경계 사이에서거리-속도 곡선을 따라 커서가 가리키는 방향으로 작업 영역이 이동합니다.
벽 구역외곽 경계를 지나단단한 스프링이 커서를 안쪽으로 밀어 넣으면 이동 속도가 포화 상태에 이릅니다.

세 구역 전체에 스프링-댐퍼 방식의 햅틱 힘이 가해지므로, 표면과 드리프트 쉘, 그리고 외벽을 모두 느낄 수 있습니다.


빠른 시작 — 버블 탐색 활성화

네비게이션은 영구적인 일회성 구성입니다. 한 번 전송하면 사용자가 명시적으로 중지하거나, 서비스를 다시 시작하거나, 세션을 종료할 때까지 활성 상태로 유지됩니다.

시작 (최소 — 기본 둥근 사각형 버블)

{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "bubble" }
}
}
]
}

중지

{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "disabled" }
}
}
]
}

기타 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_modecenter_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), 거품이 커서 위치에 정확히 생성됩니다.
falseposition좌표계의 절대점 — 데이터가 유입될 때 마운트 공간으로 변환되고, 유출될 때 다시 애플리케이션 공간으로 변환되므로 왕복 값이 일치합니다.

그 후 센터가 어떻게 움직이는지

follow 그리고 speed 버블이 활성화된 후 틱별 동작을 제어합니다:

followspeed행동이전의 대응 항목
false (기본값)무시하다중심점은 초기화된 위치에 고정됩니다 — 고정 중심점.center_mode: "fixed"
true> 0중앙이 커서 쪽으로 이동합니다 speed 커서가 내부에 있는 동안 m/s.center_mode: "auto_follow" (와 함께) center_drift_speed)
true0.0매 초마다 커서 위치로 즉시 이동합니다 — 순간 이동 같은 느낌입니다.center_mode: "track_cursor"
3.5 버전에서 기본값이 변경되었습니다

이제 기본 중앙 정렬 동작은 다음과 같습니다. 수정됨 (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.enabledtrue (기본값), 버블의 중심은 충돌력의 방향으로 이동하지 않으므로, 사용자가 작업 공간을 단단한 벽 쪽으로 끌어당기는 것을 방지합니다.

충돌 감지의 용도 히스테리시스 임계값 주변에서 깜빡임을 방지하려면: 충돌이 활성화되면 다음까지 활성화된 상태로 유지됩니다. |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_width0.03 m유량 조절 쉘의 두께
max_velocity0.5 분/초최대 항해 속도
velocity_ease"quadratic_in"거리 → 속도 이징 곡선
center.followfalse센터가 커서를 추적하는지 여부
center.speed0.02 분/초속도가 follow = true

전체 매개변수 목록

필드유형기본값설명
center.positionvec3(0, 0, 0)초기 중심 — 다음 상황에서 커서의 오프셋 relative = true, 앱 공간의 절대 좌표가 false
center.relativebooltruetrue: position 커서로부터의 오프셋입니다. false: 경계에서 마운트 공간으로 변환된 앱 공간의 절대 위치
center.followboolfalsefalse: 중심은 초기화된 위치에 고정됩니다. true: 커서를 중앙에 맞춘다
center.speedfloat0.02다음 조건에서의 표류 속도 (m/s) follow = true; 0.0 매 틱마다 커서에 맞춰 이동합니다
shape모양{rounded_box, r=0.01, b=(0.05,0.02,0.03)}데드존 SDF 형상
velocity_zone_widthfloat0.03유량 제어 쉘의 폭 (m)
max_velocityfloat0.5최대 항행 속도 (m/s)
velocity_ease문자열"quadratic_in"거리 → 속도 이징
reset_velocity_on_entrybooltrue커서가 속도 영역에 다시 진입할 때 누적 속도를 0으로 초기화합니다
bump_widthfloat0.005표면의 돌기 (m)
bump_stiffnessfloat200.0표면 요철의 탄성 계수
spring_innerfloat0.0버블 센터의 봄
spring_surfacefloat10.0수면 위의 봄
spring_outerfloat15.0외곽의 봄
wall_stiffnessfloat700.0외곽 경계를 넘어 단단한 벽에 부딪히다
damping_innerfloat0.1중앙부의 감쇠
damping_surfacefloat4.0표면에서의 감쇠
damping_outerfloat7.0외부 경계에서의 감쇠
rotation_enabledboolfalse작업 공간 회전을 탐색 방향에 적용합니다
scale_enabledboolfalse작업 공간 배율을 이동 속도에 적용합니다
collision_detection.enabledbooltrue충돌 방향으로의 이동을 차단
collision_detection.force_thresholdfloat1.0충돌에 입력할 외력 크기 (N)
collision_detection.inflate_ratiofloat2.0충돌 시 속도 구역 폭에 적용되는 배율 (1.0 이상이어야 함)
collision_detection.exit_ratiofloat0.7히스테리시스 비율 — 충돌 상태가 지속되는 시간 |ext_force| < force_threshold × exit_ratio. 범위 (0, 1]; 1.0 히스테리시스 비활성화
3.5 버전에서 숨겨진 필드

3.5 JSON 스키마에서는 두 개의 기능 그룹이 제외되었으며, 이들의 구현은 3.6 버전에 맞춰 재구성되었습니다:

  • 아바타 경계 클램핑: 필드 avatar_boundary_enabled, avatar_boundaryavatar_boundary_hysteresis.
  • 작업 공간 경계: 필드 workspace_bounded, workspace_transition_speedworkspace_transition_ease.

틱 코드는 기본값을 사용하면 여전히 컴파일되고 실행되지만, 클라이언트는 HTTP나 WebSocket을 통해 해당 필드를 읽거나 쓰지 못합니다. 3.6 버전에서는 아바타 경계(avatar boundary)가 최상위 레벨로 반환됩니다. bounds 전체 배치 변환이 적용된 버블 객체의 피어; 센터 지터 분석이 완료되면 작업 공간 경계값이 반환됩니다.

검증 규칙

  • velocity_zone_width > 0
  • 0 ≤ bump_width < velocity_zone_width
  • max_velocity > 0
  • bump_stiffness ≥ 0
  • spring_inner ≥ 0 그리고 spring_inner ≤ spring_surface ≤ spring_outer
  • wall_stiffness ≥ 0
  • damping_inner ≥ 0 그리고 damping_inner ≤ damping_surface ≤ damping_outer
  • collision_detection.force_threshold > 0
  • collision_detection.inflate_ratio ≥ 1.0
  • collision_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 , 기기마다 다르게 느껴질 수 있습니다.