탐색
내비게이션 모듈을 사용하면 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 라우팅
| 방법 | 경로 | 용도 |
|---|---|---|
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 와 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 이때, 기포가 반응합니다:
- 속도 제한 구역은 일시적으로팽창(최대
velocity_zone_width의collision_detection.inflate_ratio배), 사용자가 장애물을 피할 때 더 넓은 조작 공간을 확보할 수 있도록 하기 위함입니다. - 그때
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 | follow = true 시점의 표류 속도(미터/초);0.0 각 주기마다 커서에 직접 표시 |
shape | 모양 | {rounded_box, r=0.01, b=(0.05,0.02,0.03)} | 데드존(SDF) 형상 |
velocity_zone_width | float | 0.03 | 속도 제어 하우징의 폭 (미터) |
max_velocity | float | 0.5 | 최대 항해 속도 (미터/초) |
velocity_ease | 문자열 | "quadratic_in" | 거리-속도 완화 함수 |
reset_velocity_on_entry | bool | true | 커서가 속도 구간에 다시 진입하면 누적 속도를 0으로 초기화합니다. |
bump_width | float | 0.005 | 표면의 촉각 돌기 폭 (미터) |
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 | 충돌에 필요한 외력의 크기 (뉴턴) |
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_boundary와avatar_boundary_hysteresis。 - 작업 공간 경계 제약 조건: 필드
workspace_bounded、workspace_transition_speed와workspace_transition_ease。
tick 코드는 여전히 기본값으로 컴파일되어 실행되지만, 클라이언트는 HTTP나 WebSocket을 통해 해당 필드를 읽거나 쓸 수 없습니다. 3.6 버전에서는 아바타 경계가 버블 객체와 동급인 최상위 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
잘못된 매개변수를 사용한 POST 또는 configure.navigation 요청이 거부되고, 다음이 트리거됩니다. invalid-value 사건; 이전 설정은 그대로 유지됩니다.
사건
| 사건명 | 발동 조건 |
|---|---|
navigation-started | 기기의 내비게이션이 활성화되었습니다. |
navigation-updated | 내비게이션이 활성화된 상태에서 구성이 업데이트되었습니다. |
navigation-stopped | 탐색이 중지되었습니다(명시적으로 비활성화됨,DELETE (요청 또는 세션 종료) |
invalid-value | 내비게이션 구성이 검증을 통과하지 못해 거부되었습니다. |
알려진 제한 사항
- 3.5에 숨겨진 작업 공간 경계와 아바타 경계: 이 두 가지 기능은 3.6 버전을 위해 재설계 중이므로 JSON 모드에서는 모두 존재하지 않습니다. 상단의 ‘매개변수 참조’에 있는 설명을 참조하십시오.
- 비균일 확대/축소 + 회전:그때
rotation_enabled와scale_enabled두 기능을 동시에 사용하면 속도 방향에 약간의 오차가 발생합니다. 즉, 회전 효과가 확대/축소 축에는 적용되지 않습니다. - 기기 크기에 따라 크기 조정: 기포 크기(반지름, 영역 너비)는 기기의 물리적 확대/축소 비율에 따라 조정되지 않습니다.MInverse 와 Inverse3 는 동일한 절대 크기를 사용하므로, 두 사이트의 사용감이 다를 수 있습니다.