导航
“导航”模块使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 │
└──────────────────────────────────────────┘
| 区域 | 光标位置 | 行为 |
|---|---|---|
| Totzone | 气泡内部 | 无导航。轻微缓冲。您可以自由调整场景。 |
| 限速区 | 介于表面与外边界之间 | “距离 → 速度曲线”会将工作区域向光标方向移动。 |
| Wandzone | 超越外部边界 | 一根硬弹簧将光标推回气泡中,同时限制了导航速度。 |
在这三个区域中,都存在一种触觉弹簧-减震力——您可以感受到表面、漂移壳体以及外壁。
快速入门——启用气泡导航
导航设置为永久性的一次性配置——只需发送一次,它就会一直保持有效,直到您明确终止该设置、重启服务或关闭会话为止。
起始(简约版——标准款,带圆角的矩形)
- WebSocket
- 超文本传输协定
{
"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"}'
结束
- WebSocket
- 超文本传输协定
{
"inverse3": [
{
"device_id": "04C3",
"configure": {
"navigation": { "mode": "disabled" }
}
}
]
}
curl -X DELETE "http://localhost:10001/inverse3/04C3/config/navigation?session=:0"
其他 HTTP 路由
| Methode | 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 } }
}
}
Kapsel——狭长的走廊
两个端点 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-已配置为包含四个字段的对象 – position, relative, follow, speed –;它取代了原先的扁平化布局,来自 center, center_enabled, center_mode und center_drift_speed.
{
"center": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"relative": true,
"follow": false,
"speed": 0.02
}
}
“中心”锚定于此
position und relative 在激活时控制中心点的初始位置:
relative | “Bedeutung von”的含义 position |
|---|---|
true (标准) | position ist ein 相对于光标的偏移量 – 初始中心点是 cursor + position. 在默认值下 (0, 0, 0) 气泡会正好出现在光标位置。 |
false | position ist ein 应用空间中的绝对点 – 该值在进入装配室时进行换算,在离开时又换算回应用室,从而确保往返换算后的数值一致。 |
随后质心是如何运动的
follow und 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" |
中心点的默认行为现在是 fest (follow = false). 早期版本默认会将中心点向光标方向偏移(auto_follow). 请设置 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.enabledauf简体中文(大陆)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 m/s | 最大航行速度 |
velocity_ease | "quadratic_in" | 距离与速度的衰减曲线 |
center.follow | false | 中心点是否跟随光标移动 |
center.speed | 0.02 m/s | 漂移率,当……时 follow = true |
完整参数列表
| 费尔德 | Typ | 标准 | 描述 |
|---|---|---|---|
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 | 用于速度调节的壳体宽度(米) |
max_velocity | float | 0.5 | 最大航行速度(米/秒) |
velocity_ease | 字符串 | "quadratic_in" | 从距离到速度的平滑过渡 |
reset_velocity_on_entry | bool | true | 当光标再次进入该速度区域时,将累积速度重置为零 |
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 | 导致发生碰撞的外部力值(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_boundaryundavatar_boundary_hysteresis. - 工作空间的限制: 字段
workspace_bounded,workspace_transition_speedundworkspace_transition_ease.
Tick 代码仍将使用默认值进行编译和执行,但客户端既无法通过 HTTP 也无法通过 WebSocket 读取或写入这些字段。在 3.6 版本中,Avatar 限制将作为同级顶级元素回归 bounds 在气泡对象旁边恢复,并带有完整的定位变换;一旦完成对中心点抖动的检查,工作空间的边界便会恢复。
验证规则
velocity_zone_width > 00 ≤ bump_width < velocity_zone_widthmax_velocity > 0bump_stiffness ≥ 0spring_inner ≥ 0undspring_inner ≤ spring_surface ≤ spring_outerwall_stiffness ≥ 0damping_inner ≥ 0unddamping_inner ≤ damping_surface ≤ damping_outercollision_detection.force_threshold > 0collision_detection.inflate_ratio ≥ 1.0collision_detection.exit_ratio在(0, 1]center.speed ≥ 0
Ein POST oder简体中文(大陆) configure.navigation 如果参数无效,则会被拒绝,并返回一个
invalid-value- 事件被触发;之前的配置仍保持有效。
事件
| 事件名称 | 在以下情况下触发 |
|---|---|
navigation-started | 将在设备上启用导航 |
navigation-updated | 导航配置正在更新,而此时导航功能已处于激活状态 |
navigation-stopped | 导航即将结束(显式停用, DELETE (或会议结束) |
invalid-value | 导航配置因验证失败而被拒绝 |
已知的限制
- 3.5 版本中隐藏了“工作区限制”和“虚拟角色边界”功能:这两个功能组在 JSON 架构中均未出现,而 3.6 版本中将对其进行修订。请参阅上文“参数参考”部分中的说明。
- 缩放与旋转不均匀: wenn
rotation_enabledundscale_enabled如果两者都启用,速度方向会略有偏差——旋转不会应用于缩放轴。 - 按设备进行尺寸缩放:气泡大小(半径、区域宽度)不会根据设备的物理缩放因子进行缩放——MInverse 和Inverse3 使用相同的绝对尺寸,但在不同设备上的显示效果可能有所不同。