跳转至主要内容

导航

“导航”模块使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超越外部边界一根硬弹簧将光标推回气泡中,同时限制了导航速度。

在这三个区域中,都存在一种触觉弹簧-减震力——您可以感受到表面、漂移壳体以及外壁。


快速入门——启用气泡导航​

导航设置为永久性的一次性配置——只需发送一次,它就会一直保持有效,直到您明确终止该设置、重启服务或关闭会话为止。

起始(简约版——标准款,带圆角的矩形)​

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

结束​

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

其他 HTTP 路由​

MethodePfadZweck
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_easeGefü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) 气泡会正好出现在光标位置。
falseposition ist ein 应用空间中的绝对点 – 该值在进入装配室时进行换算,在离开时又换算回应用室,从而确保往返换算后的数值一致。

随后质心是如何运动的​

follow und speed 一旦气泡处于活动状态,便会按每个时钟周期控制行为:

followspeed行为迄今为止的等效值
false (标准)被忽略中心点始终位于其初始化时的位置——固定中心点。center_mode: "fixed"
true> 0中心点随之漂移 speed 当光标位于该区域内时,以m/s为单位朝光标方向移动。center_mode: "auto_follow" (mit center_drift_speed)
true0.0每拍时中心点都会跳到光标位置——有种瞬间传送的感觉。center_mode: "track_cursor"
版本 3.5 中更改了默认值

中心点的默认行为现在是 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.enabled auf简体中文(大陆) 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_width0.03 m控制外壳的厚度
max_velocity0.5 m/s最大航行速度
velocity_ease"quadratic_in"距离与速度的衰减曲线
center.followfalse中心点是否跟随光标移动
center.speed0.02 m/s漂移率,当……时 follow = true

完整参数列表​

费尔德Typ标准描述
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用于速度调节的壳体宽度(米)
max_velocityfloat0.5最大航行速度(米/秒)
velocity_ease字符串"quadratic_in"从距离到速度的平滑过渡
reset_velocity_on_entrybooltrue当光标再次进入该速度区域时,将累积速度重置为零
bump_widthfloat0.005表面触觉凸起(米)
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 禁用滞后效应
Felder 在 3.5 版本中被隐藏

JSON 3.5 版本的规范中未包含两个功能组,而其 在 3.6版本中的实现正在进行修订:

  • 在“阿凡达”边界处的卡顿: 字段 avatar_boundary_enabled, avatar_boundary und avatar_boundary_hysteresis.
  • 工作空间的限制: 字段 workspace_bounded, workspace_transition_speed und workspace_transition_ease.

Tick 代码仍将使用默认值进行编译和执行,但客户端既无法通过 HTTP 也无法通过 WebSocket 读取或写入这些字段。在 3.6 版本中,Avatar 限制将作为同级顶级元素回归 bounds 在气泡对象旁边恢复,并带有完整的定位变换;一旦完成对中心点抖动的检查,工作空间的边界便会恢复。

验证规则​

  • velocity_zone_width > 0
  • 0 ≤ bump_width < velocity_zone_width
  • max_velocity > 0
  • bump_stiffness ≥ 0
  • spring_inner ≥ 0 und spring_inner ≤ spring_surface ≤ spring_outer
  • wall_stiffness ≥ 0
  • damping_inner ≥ 0 und 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

Ein POST oder简体中文(大陆) configure.navigation 如果参数无效,则会被拒绝,并返回一个 invalid-value- 事件被触发;之前的配置仍保持有效。


事件​

事件名称在以下情况下触发
navigation-started将在设备上启用导航
navigation-updated导航配置正在更新,而此时导航功能已处于激活状态
navigation-stopped导航即将结束(显式停用, DELETE (或会议结束)
invalid-value导航配置因验证失败而被拒绝

已知的限制​

  • 3.5 版本中隐藏了“工作区限制”和“虚拟角色边界”功能:这两个功能组在 JSON 架构中均未出现,而 3.6 版本中将对其进行修订。请参阅上文“参数参考”部分中的说明。
  • 缩放与旋转不均匀: wenn rotation_enabled und scale_enabled 如果两者都启用,速度方向会略有偏差——旋转不会应用于缩放轴。
  • 按设备进行尺寸缩放:气泡大小(半径、区域宽度)不会根据设备的物理缩放因子进行缩放——MInverse 和Inverse3 使用相同的绝对尺寸,但在不同设备上的显示效果可能有所不同。