탐색
‘내비게이션’ 모듈을 사용하면 ‘ 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 │
└──────────────────────────────────────────┘
| 구역 | 커서 위치 | 행동 |
|---|---|---|
| 토트존 | 거품 속 | 이동 효과 없음. 부드러운 감쇠. 장면을 자유롭게 조작할 수 있습니다. |
| 속도 제한 구역 | 표면과 외곽선 사이 | ‘거리 → 속도 곡선’은 작업 영역을 커서 방향으로 이동시킵니다. |
| Wandzone | 외부 국경을 넘어 | 단단한 스프링이 커서를 풍선 안으로 밀어 넣으며, 이동 속도가 제한됩니다. |
세 구역 모두에서 촉각적인 스프링-댐퍼 힘이 작용합니다. 표면, 드리프트 쉘, 그리고 외벽을 느낄 수 있습니다.
빠른 시작 – 버블 내비게이션 활성화
탐색 설정은 영구적인 일회성 구성입니다. 한 번 전송하면, 사용자가 명시적으로 종료하거나 서비스를 다시 시작하거나 세션을 종료할 때까지 활성 상태로 유지됩니다.
시작 (최소 – 둥근 모서리의 직육면체를 갖춘 표준 블라제)
- 웹소켓
- 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 경로
| 방법 | Pfad | Zweck |
|---|---|---|
GET | /{type}/{id}/config/navigation?session=<expr> | 현재 내비게이션 설정 + 상태 |
POST | /{type}/{id}/config/navigation?session=<expr> | 탐색 시작 또는 새로 고침 |
DELETE | /{type}/{id}/config/navigation?session=<expr> | 탐색 종료 |
블래저 형태 카탈로그
버블의 사각지대는 부호 거리 함수(Signed Distance Function, 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 | Gefühl | 언제 사용하나요? |
|---|---|---|
linear | 지속적인 증가 | 예상대로, 수준이 괜찮음 |
quadratic_in | 천천히 시작하여 점차 이송 속도를 높임 | 표면 근처에서는 정밀하고, 장거리에서는 빠릅니다 |
cubic_in | 시작이 매우 더딘 편 | 매우 정밀하며, 경사가 점점 가팔라지는 긴 경로 |
sine_out | 부드럽고 빠르게 시작되며, 바깥쪽 가장자리 근처에서 완만하게 꺾인다 | 반응이 빠르며, 어느 정도 부드럽다 |
quadratic_out | 입장 시 신속하고, 장거리 이동 시 편안함 | 빠른 탭, 부드러운 슬라이딩 |
{ "velocity_ease": "quadratic_in", "max_velocity": 1.5 }
중심점의 거동
버블의 중심점은 중첩된 center- 4개의 필드로 구성된 객체 – 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" (mit center_drift_speed) |
true | 0.0 | 매 박자마다 중심점이 커서 위치로 이동합니다 – 마치 순간이동하는 듯한 느낌입니다. | center_mode: "track_cursor" |
이제 중심점의 기본 동작은 다음과 같습니다. 축제 (follow = false). 이전 버전에서는 기본적으로 중심점이 커서 방향으로 이동하도록 되어 있었습니다 (auto_follow). Setzen Sie center.follow = true, 예전의 드리프트 동작을 복원하고, 다음을 조정하십시오. center.speed 이전 값인 center_drift_speed an.
Wenn follow = true 금색 영역에서 커서가 바깥쪽 경계를 넘어가면, 중심점은 다음 사항과 관계없이 커서를 따라갑니다. speed, 그래야 방울이 계속 그를 감싸고 커서가 빠져나가지 못하게 됩니다.
충돌 거동
이 기포는 외부 커서 힘에 반응하여, collision_detection.force_threshold überschreiten:
- 속도 제한 구역 확대된다 일시적으로 중단됨 (~
collision_detection.inflate_ratio-다음 분야의velocity_zone_width), 장애물을 우회할 수 있는 여유를 더 확보할 수 있도록. - Wenn
collision_detection.enabledauftrue(기본값)이 설정되어 있으면, 기포의 중심이 충돌력의 방향으로 이동하지 않으므로 작업 영역을 단단한 벽 쪽으로 끌어당길 수 없습니다.
충돌 감지 기능은 히스테리시스, 임계값 주변에서 값이 깜빡이는 현상을 방지하기 위해: 충돌이 활성화되면, 다음 조건이 충족될 때까지 활성화된 상태를 유지합니다. |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 gilt. 영역 (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 버전에서는 아바타 제한이 동등한 최상위 요소로 다시 도입됩니다. 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 버전에서 작업 영역 제한 및 아바타 경계가 숨겨져 있습니다. 이 두 기능 그룹은 JSON 스키마에 포함되어 있지 않으며, 3.6 버전에서 재구성될 예정입니다. 위의 ‘매개변수 참조’ 섹션에 있는 참고 사항을 참조하십시오.
- 불균일한 크기 조정 + 회전: wenn
rotation_enabled그리고scale_enabled두 가지가 모두 활성화된 경우, 속도 방향이 약간 부정확해집니다. 즉, 회전이 크기 조정 축에 적용되지 않습니다. - 기기별 크기 조정: 버블 크기(반지름, 영역 너비)는 기기의 물리적 확대/축소 비율에 따라 조정되지 않습니다. MInverse 및 Inverse3 은 동일한 절대 크기를 사용하며, 이는 기기마다 다르게 느껴질 수 있습니다.