导航
使用导航模块,Inverse3 ,您可以通过光标在应用程序的工作区中移动。这有时也被称为“速率控制移动”或“游戏手柄式漂移”。 光标在到达物理工作区边缘时,不会撞上坚硬的墙壁,而是进入一个“软壳”区域——该区域内,光标与虚拟中心的距离会被转换为推动整个工作区滑动的速度。 光标被推得越远,场景滚动得就越快。
目前主要(也是唯一)的支持功能是“气泡导航”(Bubble Navigation)。气泡的形状 使用 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 │
└──────────────────────────────────────────┘
| 区域 | 光标位置 | 动作 |
|---|---|---|
| 死区(不感带) | 泡沫的内部 | 不会进行导航。会施加轻微的阻尼。您可以自由操作场景。 |
| 限速区 | 表面与外侧边界之间 | 根据从距离到速度的曲线,工作区将朝光标方向移动。 |
| 壁区 | 位于外侧边界之外的位置 | 硬弹簧将光标向内推回,导航速度达到上限后便不再增加。 |
在所有三个区域中,弹簧-减震器式的触觉力都在起作用,您可以感受到表面、漂移壳体以及外侧壁。
快速入门 — 启用气泡导航
导航设置为永久性的一次性设置。一旦发送,该设置将保持有效,直到您明确停止该设置、重新启动服务或关闭会话为止。
开始(最小配置 — 默认的圆角矩形气泡)
- 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 端点
| 方法 | 通关 | 用途 |
|---|---|---|
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 会对超过该值的来自外部的光标力作出反应:
- 限速区将暂时 膨胀 将(最多
collision_detection.inflate_ratio倍的velocity_zone_width(……)。这样,用户就能有足够的余地来避开障碍物。 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 m/s | 导航的最高速度 |
velocity_ease | "quadratic_in" | 从距离到速度的缓和曲线 |
center.follow | false | 中心是否跟随光标移动 |
center.speed | 0.02 m/s | 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 时的跟随速度(m/s)。0.0 在这种情况下,会每 tick 一次将光标定位到该位置 |
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 | 导航最大速度(m/s) |
velocity_ease | 字符串 | "quadratic_in" | 从距离到速度的缓入效果 |
reset_velocity_on_entry | bool | true | 当光标再次进入限速区时,将累计速度清零 |
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 将保持冲突状态,直到……为止。范围为 (0, 1]。1.0 以禁用磁滞效应 |
在针对 3.6 版本重新设计实现期间,以下两个功能组已被从 3.5 版的 JSON 模式中移除:
- 《阿凡达:边界》的夹具:
avatar_boundary_enabled、avatar_boundary、avatar_boundary_hysteresis的各个字段。 - 工作区的边界:
workspace_bounded、workspace_transition_speed、workspace_transition_ease的各个字段。
tick 处理代码仍会继续编译并使用默认值执行,但客户端无法通过 HTTP 或 WebSocket 读写这些字段。在 3.6 版本中,化身边界与具有完整布局变换的 bubble 对象处于同一层级的顶级 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 使用相同的绝对尺寸,因此在不同设备上的显示效果可能会有所不同。