Sensa使用帮助

OGB 互通与检测几何

简体中文 | English

OGB/SPS 参数描述接近、进入和触碰。根据几何含义与命名规则选择读数,校准深度或强度,再连接到 Sensa 输出。本页说明 Socket、Plug 和独立触碰区域信号,并提供上游定义。

先在参数列表找到实际来源和完整路径,再选深度或振动模板。图解中的 SPS2 · PenOthersNewRoot / PenOthersNewTip 用两路数值估算进入深浅;SPS1 · PenOthers / PenOthersClose 用深浅信号配合有效接近区域。配对时保持同来源、同实例和同 Self/Others 类别,需要时开启 Avatar 的 OGB_ENABLED 心跳。

外部 OGB 路径沿用上游名称。Sensa 自有 SPS 四点定位、Contact 直接定位和 Shader 参数见字典。在线图解可交互查看检测球与胶囊,灰色轮廓帮助辨认 Socket/Plug 的相对位置。

研究固定到 VRCFury 6bd33f4cb453df816c943a335e47f64e6a37e188、OGB v2.1.30 643aedd493ba21b0c0859ce6e57708fe408ee9c0,并核对 OGB v1.0.0 262164576721f12958409638851808aa662b87c7。OGB v1.0.0 已同时读取 PenOthersNewRoot/PenOthersNewTip 和 PenOthers;图解的 SPS1/SPS2 标签按参数几何区分,具体以 Avatar 发布的路径为准。旧消费端

图解已核对 VRCFury 1.1434.0 的 BakeHapticSocketsService.cs、VRCFuryHapticSocketBaker.cs 与 VRCFuryHapticPlugBaker.cs;这三个文件与上述固定提交一致。

Node 的 OscServices 接收 OSC/OSCQuery 并维护来源;共享 RuntimeEngine 解释 OgbDepth/OgbTouch,再经同一输出协调器路由到设备。来源标识用于把配对读数对应到同一实例,几何与单位沿用下文的上游定义。

图解采用哪些默认尺寸

每种参数使用对应的上游生成规则。Plug 长度、粗细和 Socket 自动触碰区来自 Avatar 尺寸,图解用一组明确的示例尺寸展示这些规则;滑条可改成你的实际尺寸。

场景 VRCFury 生成规则 图解初始值
SPS2 · NewRoot / NewTip 两只接收球半径均为 1 m;Plug 根标记半径 0.01 m 1 m / 0.01 m
SPS1 · PenOthers,以及 Socket Touch 接收半径 D 来自区域长度;自动长度为 Avatar 视点高度的 5%,Close 半径为 D/2.5 示例视点高 1.60 m → D=0.08 m,Close=0.032 m
Plug 侧深度、触碰与摩擦 按 Plug 的实际长度 L、半径 W 生成 示例 L=0.20 m、W=0.03 m
Socket 根标记 半径 0.001 m 0.001 m
独立 Touch Zone 默认半径 0.10 局部单位,随对象缩放 缩放 1 时为 0.10 m

Sensa 的 SPS 四点定位和 Contact 直接定位各自创建专用 Contact:接收半径为 2 个制作局部单位,目标标记半径为 0.001;制作缩放为 1 时分别对应 2 m 和 1 mm。它们使用 Sensa/SPS/… 与 Sensa/Contact/… 路径,几何配置见定位说明。上表的原生 OGB/… 参数继续使用 VRCFury 的生成尺寸。

先理解半径与数值

以下路径省略 /avatar/parameters/。Orf 是 Socket,Pen 是 Plug;原点为各自根中心,+Z 为作者的前向。Self/Others 分别筛选本 Avatar 或其他 Avatar 的匹配目标。

符号 本页含义
L Plug 生成时的世界长度
W Plug 生成时的世界半径
e min(W, 0.08 m),Plug 手触扩展
D Socket 触碰区域深度
R、r 实际 Receiver、球形 Sender 的半径
H 胶囊的完整高度,包含两端半球

Proximity 是连续 0–1 浮点值,通常随目标靠近检测中心增大;Constant 表示是否进入有效接近区域,进入时为 1,离开时为 0。每个 Proximity Receiver 独立选择 Proximity 严格大于零且最大的匹配 Sender;SDK Beta.3 在两个读数都为 1 时选取最近内部点间距更小的目标。球形接收器按 Sender 最近表面到自身中心计算接近程度。球对球模型为:

p = clamp(1 - max(0, |senderCenter - receiverCenter| - r) / R, 0, 1)
开始接触的中心距 ≈ R + r;Sender 包含接收器中心时饱和为 1。

开始检测的距离同时受接收器与目标信号形状影响。例如接收半径为 10 cm 时,还要加上球形目标的半径。胶囊和身体目标按最近表面计算。VRChat 限制缩放后的半径不超过 3 m、宽高深不超过 6 m。官方 Contacts 行为

Socket:OGB/Orf/<id>

这组参数由 VRCFury 的 OGB Haptics 构建生成,SpsForAll 自动补充目标走自己的生成分支。PenOthersNewRoot/PenOthersNewTip 和对应 Self 配对用于 SPS2;启用触摸区域后,还会生成表中的 Touch、SPS1 与 Frot 参数。

叶子参数 类型、检测对象 Receiver 几何 Sensa 自动解释
FrotOthers 近接;他人 Socket 根标签 中心 +0.05·Z,球 R=0.1 m;需要触摸区 靠近或擦过时的强度,OgbTouch 直接读取
PenOthers 近接;TPS_Pen_Penetrating 中心 -D·Z,球 R=D;需要触摸区 SPS1 的深浅趋势
PenOthersClose Constant;同一 Plug 标签 中心 -D/2·Z,胶囊 R=D/2.5、H=D;需要触摸区 目标进入 Socket 有效接近区时为 1
PenOthersNewRoot 近接;他人 Plug 根 Sender 根中心,球 R=1 m SPS2 根部接近值,与 NewTip 配对换算深浅
PenOthersNewTip 近接;他人 Plug 长度 Sender 根中心,球 R=1 m SPS2 长度球接近值,与 NewRoot 配对估长
PenSelfNewRoot 近接;自身 Plug 根 Sender 根中心,球 R=1 m 对应 Self 类别的 SPS2 配对
PenSelfNewTip 近接;自身 Plug 长度 Sender 根中心,球 R=1 m 对应 Self 类别的 SPS2 估长辅助值
TouchOthers 近接;他人 Head/Hand/Foot/Finger 中心 -D·Z,球 R=D;需要触摸区 触碰强度,与 TouchOthersClose 配合
TouchOthersClose Constant;对应身体标签 中心 -D/2·Z,胶囊 R=D/2.5、H=D;需要触摸区 目标进入对应触碰区时为 1
TouchSelf 近接;自身 Hand/Finger/Foot 中心 -D·Z,球 R=D;需要触摸区 触碰强度,与 TouchSelfClose 配合
TouchSelfClose Constant;对应身体标签 中心 -D/2·Z,胶囊 R=D/2.5、H=D;需要触摸区 自身目标进入对应触碰区时为 1

D 来自作者 length:组件默认值为 0,启用触碰区后按 Avatar 视点高度的 5% 自动生成。填写正值时,勾选米制直接使用,否则乘对象世界 Z 缩放。有效触碰区会生成上表对应参数;尺度转换见后文。组件默认值、Socket 生成器、D 的来源

PenSelf 是官方 OGB 消费端仍会读取的旧值,但上述现代生成器并未生成 Orf/PenSelf。使用这类历史来源时,按它实际发布的路径和作者几何校准。当前生成器支持的 Socket 叶子以表中清单为准。

Plug:OGB/Pen/<id>

叶子参数 类型、检测对象 Receiver 几何 Sensa 自动解释
FrotOthers 近接;他人 Plug 包络标签 根中心,球 R=L 贴近或擦过时的强度,结合 FrotOthersClose
FrotOthersClose Constant;他人 Plug 包络标签 中心 L/2·Z,胶囊 R=W+0.08 m、H=L 匹配目标进入有效接近区时为 1
PenOthers 近接;他人 Socket 根标签 根中心,球 R=L 深浅趋势,OgbDepth 使用原值
PenSelf 近接;自身 Socket 根标签 根中心,球 R=L 对应 Self 类别的深浅趋势
TouchOthers 近接;他人 Hand/Finger/Foot 根中心,球 R=L+e 触碰强度,结合 TouchOthersClose
TouchOthersClose Constant;同上 中心 L/2·Z,胶囊 R=W+e、H=L+2e 匹配目标进入触碰区时为 1
TouchSelf 近接;自身 Hand/Finger/Foot 根中心,球 R=L+e 触碰强度,结合 TouchSelfClose
TouchSelfClose Constant;同上 中心 L/2·Z,胶囊 R=W+e、H=L+2e 自身目标进入触碰区时为 1

Plug 的 TouchOthers 检测 Hand/Finger/Foot;Socket 的 TouchOthers 在这些身体标签外,还包括 Head。Plug 生成器、标签定义

Plug 的深浅信号是 PenOthers 或 PenSelf,按原值和所需方向映射;Touch 与 Frot 分别使用表中的 Close 条件。

Sender 才决定“对方”的大小

Sender 定义接收器看到的目标形状。常见生成对象如下:

生成对象 Sender 形状、标签 用途
Plug Root 根中心球 r=0.01 m;TPS_Pen_Root SPS2 的 PenOthersNewRoot/PenSelfNewRoot
Plug Length 根中心球 r=L;TPS_Pen_Penetrating SPS2 的 NewTip 与 SPS1 的 PenOthers,均观测根中心长度球
Plug WidthHelper 根中心球 r=max(0.01 m,L-2W);TPS_Pen_Width 上游内部宽度辅助
Plug Envelope 中心 L/2·Z;胶囊 R=W、H=L;TPS_Pen_Close Plug 摩擦/独立触摸区
Socket Root 根中心球 r=0.001 m;含 TPS_Orf_Root Plug 的 PenSelf/PenOthers,以及 Socket FrotOthers
Socket Front +0.01·Z,球 r=0.001 m;TPS_Orf_Norm 等 上游方向辅助

例如 Plug/PenOthers 在中心距约 L+0.001 m 时开始产生数值。SPS1 Socket 的 PenOthers 观测根中心的 Length 球 r=L(TPS_Pen_Penetrating);SPS2 的 PenOthersNewRoot 观测 r=0.01 的根球,PenOthersNewTip 观测 r=L 的长度球。两球同心,因此数值主要随根中心距离变化。正对 Socket 靠近时,这种变化便于理解为进入深浅的趋势;侧移和倾斜时应结合图形及实际两端校准。Plug Sender、Socket Sender

其他真实参数与未支持范围

参数 实际含义 Sensa 当前行为
OGB_ENABLED Avatar 输入 bool;启用本地 Orf/Pen Haptics 显式控制开关;固定目标发真值,5 秒心跳
VFH/Version/10 当前生成器的能力标记路径 在参数列表中查看所支持的能力
旧 OGB/Pen/<id>/Version/8、OGB/Orf/<id>/Version/9、VFH/Version/9 官方 OGB 仍识别的历史能力标记 用于识别历史来源能力
VFH/Zone/Touch/<id>/Self、VFH/Zone/Touch/<id>/Others 独立 SPS Touch Zone 近接 OgbTouch 直接读取 0–1,不要求 Close
TPS_Internal/Orf/<id>/Depth_In、TPS_Internal/Pen/<id>/RootRoot 官方 OGB 消费端的原生 TPS 分支 不属于 OgbDepth 自动路径;需明确直接映射
自定义 Angle/Depth/Trigger 等 含义由实际发送方定义 按发送方说明配置 Direct 等明确映射

独立 Touch Zone 是以作者对象为中心、半径为作者 radius(默认 0.1 局部单位)的球,worldScale=false,故实际半径随对象缩放。它接受身体标签及 Plug 包络,且没有 Orf/Pen 那组 Close 门控;它也没有注册上述 OGB_ENABLED 开关。官方 OGB 的 bridge 与 Sensa OgbTouch 都读取此命名空间;Sensa 按完整实例、来源和 Self/Others 分别读取该区域的强度。Zone 生成器、默认半径、OGB 路径解析

Version 10 是上游生成器提供的能力标记。Sensa 结合路径识别来源支持的功能,动作强度读取实际 Pen、Touch 或 Frot 数值。版本标记生成、OGB 能力识别

世界尺度与 Socket 估算公式

worldScale=true 的生成请求会把位置向量、半径和高度统一除以构建时对象的 worldScale.x;false 则保留作者局部数值。D 的局部长度另乘 Z 缩放,非均匀缩放时需按实际生成结果检查尺寸。Plug/Socket 的 WorldSpace 还通过 ScaleConstraint 保持世界尺度;OGB Receiver 位于 OneSpace 下,实际世界半径还受运行时缩放影响。Receiver 转换、Sender 转换、WorldSpace 约束

在两个 Receiver 同心、半径均为 R、实际 Plug 根球半径为 r,且观察区未饱和时:

L ≈ R × (pTip - pRoot) + r
d ≈ R × (1 - pRoot) + r
径向比例 q = clamp(1 - d / L, 0, 1)

Sensa 采用生成器的 R=1、r=0.01 模型,得到 +0.01 修正。运行时缩放或自定义尺寸会使换算带有误差,因为实际 R/r 需要从作者几何确认。Root 饱和为 1 时表示 d≤r,该小范围内保持同一读数;映射时用实际对象的期望起点和终点校准。估算器

只有完整、有限的 0–1 配对且存在未饱和估长采样时才产生后续径向比例;从内部启动、长度未知时给零,需要先退出再进入。横向偏移、不同 Plug 混入、截断和逐参数异步都会影响结果。固定同一对象与来源进行校准,有助于得到稳定、容易解释的变化。

专用 Contact 直接定位(SDK Beta)

Sensa 也支持 SDK 3.10.6-beta.3 与 Beta.2 的高级 Proximity 报告,读取原生 Sender 中点位置和接触点相对速度。Sensa 使用独立的 Sensa/Contact/<id>/… 实例,由唯一通道上的自身根点 Sender 和 Avatar 根 Receiver 组成。位置是物理米制 AvatarRootMeters,速度为 m/s;运动强弱可通过 VelocityX/Y/Z、Speed 或 ProximitySpeed 校准。SPS 四点定位保留 Sensa/SPS/<id>/P0…P3+Sample,已有 OGB 路径以及上文深度/触摸模型保留其发布语义。

构建自己的根点测量时可选择此方案,明确的 Sensa/原生 Contact 根点可独立于 VRCFury 使用。身体联动可用校准位置轴跟随细微深浅趋势,并以 Touch/Close 条件确认触碰。Beta 设置、源码依据与字段语义 · 字典

Sensa 的精简入口与使用条件

深度选择一组 OgbDepth,触碰选择一组 OgbTouch。OgbDepth 优先读取 SPS2 · PenOthersNewRoot / PenOthersNewTip 配对;缺配对或尚未估长时输出零,两路缺失或均零时再使用同实例 SPS1 · PenOthers / PenOthersClose 的深浅信号。OgbTouch 按同来源、完整父路径和功能配对 Close,缺少必需 Close 给零;显式 Direct 可以读取原值。消费端选择依据、Sensa 地址解释

现代 VRCFury 把生成实例名中的斜杠替换为下划线;Sensa 也支持保留自定义嵌套父路径。所有辅助值严格留在同一来源/实例/Self 或 Others 内。输入重新启用、更换 Avatar 或重建映射时重新估长;超时按当前选用的信号计算。

Orf/Pen Haptics 需作者启用构建选项,客户端开启 OSC,并收到 OGB_ENABLED。Sensa 的 osc.ogbControl 默认关闭;启用后只向明确配置的单播 IP/localhost 和 UDP 端口发送,不猜来包端口。在 OSC 或组合方式且监听运行时每 5 秒发 true,离开/停用/正常退出向旧目标尝试发 false。在参数列表中观察 Avatar 是否开始发布读数,随后保存映射并启用设备输入。上游启用条件、官方心跳

推荐先看原始参数,再选深度或振动,并用实际对象校准。独立 Zone 通过同一个振动模板读取 VFH/Zone/Touch/<完整id>/Self 或 .../Others。完成后在实际客户端检查方向、响应与 Close 条件,再以小行程验证设备动作。

上游项目分别遵循各自许可。OGB 许可、VRCFury 许可仍分别适用。