Contact 直接定位(SDK Beta)
简体中文 | English
Contact 直接定位测量所选 Avatar 根点的米制位置,以及接触点相对速度(m/s)。添加专用球形 Sender/Receiver,查看高级 Proximity 字段,再校准所选读数。以下设置使用 VRChat Avatars SDK 3.10.6-beta.3,也支持 Beta.2 的高级接口。
已核对官方 3.10.6-beta.3 的 Editor 源码和运行时程序集,并保留 3.10.6-beta.2 的协议依据。以下说明区分 SDK 接口、Sensa 发布字段与客户端接入;各项实际运行结果见验证记录。
构建专用根点测量
- 通过 VRChat 项目工具安装配套的 Base 和 Avatars Beta 包,再安装 Sensa Unity 组件包。
- 在 Automatic SPS Setup 的根点定位方式中明确选择 Contact 直接定位(SDK Beta),或直接添加 Contact direct tracking (SDK Beta)(
SensaContactRootProbe)。 - 在 Target 选择自己 Avatar 内的骨骼/空物体 Transform、SPS Socket/Plug、Sensa Component 或原生 Contact。实例默认
Root,多个点使用不同实例名;碰撞通道留空时按实例名稳定分配。Transform、Sensa 和原生 Contact 目标可直接使用。 - 构建 Avatar。统一 NDMF 插件先于 MA 读取作者配置,生成跟随所选根点的微小球形 Sender,并在 Avatar 原点生成 Proximity Receiver;接收形状偏移为零,各轴与 Avatar 对齐,只接受专用通道上的 Self。
- 在实际客户端中按需通过生成菜单选择目标。在单一 OSC 来源下检查
Sensa/Contact/<id>/…,先在根点面板校准,再启用空间输入。
作者脚本实现 IEditorOnly,生成后移除,宿主与原生测量组件保留。构建时机、预制件选择和官方流程依据见Unity 构建指南。
Receiver 的制作半径为 2 个 Avatar 根局部单位,标记半径为 0.001。公开的 Radius 是当前世界米制半径,随 ScaleFactor 更新。缩放门控会在 Receiver 超过 SDK 的 3 m 半径上限前停用测量并清零 Sample。支持的 Avatar 根缩放为正数且均匀。
按正确坐标框读取位置与速度
Sensa 根据已安装的 SDK 启用对应的 Bool 开关:Beta.3 使用 advancedParameters,Beta.2 使用 advancedProximityParameters。Beta.3 的开关默认关闭,标记为 NotKeyable;Sensa 在构建时将其开启。Beta.3 的高级报告可用于任意 Receiver 类型;Sensa 的测量组件采用 Proximity Receiver,其中 _ProximitySpeed 描述接近值变化率。基参数名为 Proximity 时,两版都提供 Proximity_SenderType、Proximity_SenderLocalPositionX/Y/Z、Proximity_SenderVelocityX/Y/Z、Proximity_SenderVelocityMagnitude 和 Proximity_ProximitySpeed。
VRChat 官方 Contacts 说明介绍了 Receiver 的检测模式:Constant 报告匹配目标是否进入检测区,Proximity 则报告 0–1 的连续接近值。本页高级位置/速度字段按下文列出的官方安装包测量实现解释;Sensa 另外提供 Radius 与 Sample,用于覆盖范围和活动检查。图解的“OSC 参数含义与来源”和工作台参数详情均可逐项阅读测量定义、联动用法与来源。
| 要了解什么 | 对应参数 | 读数怎样理解 |
|---|---|---|
| 目标在哪里 | Proximity_SenderLocalPositionX/Y/Z |
相对接收器原点的左右、上下、前后位移,单位米;可沿选定轴校准动作范围 |
| 动作有多快、往哪边动 | Proximity_SenderVelocityX/Y/Z、Proximity_SenderVelocityMagnitude |
近似接触点处的相对速度,单位 m/s;分量保留方向,模长便于控制运动强弱 |
| 接近程度怎样变化 | Proximity、Proximity_ProximitySpeed |
接近值为 0–1,变化率为接近值/秒;便于观察进入接收范围后的靠近与退出 |
Sensa Contact 定位协议使用十二个公开字段,现有坐标、速度和预设可以直接沿用。OSC 参数字典列出了接入范围;Beta.3 的额外原生报告见下文。
SDK 还会按碰撞标签写入 _CollisionTag_<tag> Bool。组件为自己的专用标签在 FX 中声明这个状态,并在停用时清零;十二项公开 OSC 字段见参数字典。
位置描述发送形状中点相对接收形状中点的位移,再旋转到接收形状的坐标轴。运行时使用接收形状旋转的逆变换,保留物理米单位,未除以 Transform 缩放或 Receiver 半径。球形的中点就是球心,胶囊使用其形状中点。因此,Sensa 的专用零偏移 Receiver 建立 AvatarRootMeters:原点在 Avatar 根,各轴跟随根旋转,单位为物理米。SPS 四点定位和 Shader 捕获继续使用 AvatarRootLocal,其单位按制作时的 Avatar 根尺度解释。
position = inverse(receiverShapeRotation)
× (senderShapeMidpoint - receiverShapeMidpoint)
速度是 Sender 相对 Receiver 在近似接触点处的速度,包含角运动项,再旋转到 Receiver 坐标轴,单位为 m/s。形状旋转时,这个量可能与所报告中点坐标的时间导数不同。Proximity_SenderVelocityMagnitude 为其非负模长。Proximity_ProximitySpeed 是 Proximity 的带符号变化率,单位为接近值/秒;退出时,Proximity 归零可能带来短暂读数。
负的位置分量是正常坐标。Sender 静止时,速度为零仍可保持有效位置。单个专用点提供位置和速度;需要跟随骨骼的参考方向时,使用 Tracking Frame 同时测量 Origin、Forward、Right 三个标记。
SDK Beta.3 的额外报告
官方 3.10.6 发布说明解释了高级报告的扩展。启用 Advanced Parameters 后,SDK 可按 Receiver 的基参数名追加以下后缀:
| 后缀 | 含义与单位 | 怎样理解 |
|---|---|---|
_PointSeparation |
Sender 与 Receiver 最近内部点之间的世界空间距离,单位米 | 衡量两个 Contact 形状的最近靠近程度;Sensa 根点 Distance 则根据 XYZ 计算距 Avatar 原点的距离,两者各有参照 |
_SenderLossyScaleX/Y/Z |
Sender 所关联 Transform 的 lossyScale 三分量,无单位 |
读取该 Transform 包含父级影响的世界缩放,可用于观察信号形状随缩放的变化 |
“最近内部点”沿用 SDK 的形状定义,由 Sender 和 Receiver 的几何决定。选择位置联动时用 XYZ 或 Sensa Distance;使用原生 _PointSeparation 时,按实际 Contact 形状校准距离。
Beta.3 运行时程序集还显示:没有选中 Sender 时,缩放报告为 (1,1,1)、PointSeparation 为 -1;存在 Sender 时,≤0.001 m 的 PointSeparation 写为 0。读取额外报告时可先检查 _SenderType,再按这些状态解释数值。如需自行使用这些可选报告,请在 Animator 中声明对应的 Float 参数,并配置其 OSC 可见性。Sensa 生成既有的十二个公开字段,定位预设使用前述位置和速度信息。
让接收形状与参考平面跟随骨骼
原生 Contact 使用 rootTransform 作为参照;未指定时,采用组件所在 Transform。本地 position 与 rotation 共同确定形状。球心偏离骨骼原点时,骨骼转动会带动球心绕行;球心居中时,球形轮廓在转动前后保持相同。单个球的接近值适合测距离,方向可由多个已知布局的点测得。官方 Contacts · 字段定义原文
Sensa 的 Tracking Frame 为跟随平面生成 Origin、Forward、Right 三个独立 Contact 定位实例。选择 Contact 直接定位后,总共生成 6 个 Contact、36 个公开字段,位置统一采用 AvatarRootMeters。桌面以 Forward−Origin 确定当前深度方向,再计算目标的深度和侧向偏移。骨骼的旋转由标记位置变化体现;参照偏移与朝向在 Unity 中设置。创建跟随平面 · 计算示例
保持单一目标并检查活动
已核验运行时为 Proximity Receiver 选择匹配 Sender 中 Proximity 严格大于零且最大的对象。Beta.3 在两个 Sender 的 Proximity 都为 1 时,选择 PointSeparation 更小的对象,依据见上述官方发布说明。Sender 类型为:0 无选中 Sender,1 自己的 Avatar,2 其他 Avatar,3 世界 Sender。Sensa 根点方案接受类型 1;每个作者组件使用独立通道和唯一 Sender,将测量对应到所选自身根点。
原生报告未提供时间戳、序号或稳定 Sender 标识。Sensa 添加 Sample 和 Radius;Sample 目标每 50 ms 在 n/32(n=1…32)间循环,0 表示停用或失效。桌面要求同一来源与实例的十二字段齐全、数值有限、Proximity 为正、类型为 Self,且 Radius 在支持的正数范围内;位置边界随 Radius 变化并留有小量数值容差。变化后的 Sample 最多保留 1000 ms,较短的正数输入超时优先;重复相同 Sample 不延长活动有效期。
没有选中 Sender 时,SDK 写入类型 0 和零位置/速度。Contact、完整字段、活动或边界失效时,Sensa 停止相关动作。Sample 检查生产端活动;SDK 字段传递和 Sender 对应关系通过专用布置与客户端验收核对。参数字典列出全部十二个公开字段。
将身体局部动作映射为设备目标
contact-position 与 contact-speed 预设提供起始映射,将 Root 替换为实际实例并校准量程。使用 X、Y、Z 或 Distance,按校准后的方向或距 Avatar 原点的距离联动。细微局部动作可沿一轴采集希望的起点和终点,例如将根点少量前后位移映射为有限的深度范围。已有 OGB 深度信号适合其作者几何下的深浅趋势;Contact 坐标方便选择具体的动作轴。
使用 VelocityX、VelocityY、VelocityZ 或 Speed 映射运动强弱,或通过 ProximitySpeed 观察接收区内靠近/退出的强度。需要限定动作生效范围时,可另用 Touch/Close 信号作为区域条件。采集适当端点、检查预览并保存映射,再启用实验空间输入和实际 OSC 输入。校准、曲线、输出限位、输入启用与失效停止沿用现有空间流程。
位置和速度提供不同控制:静止根点可保持按位置生成的目标,速度目标则可回到校准的零速水平。在实际客户端检查方向、响应和停止,再以小输出范围确认设备响应。工作台指南 · 定位说明
安装包依据与相关 SDK 能力
以下官方发布资产及 SHA-256 用于复核来源。Beta.3 为本次接口兼容核验版本,Beta.2 保留为原协议依据:
| 安装包 | SHA-256 |
|---|---|
| com.vrchat.base-3.10.6-beta.3.zip | 5c2e392d0cb56545731a1990952f237421a2ef56d2bc3b0929bd14f28fa31d14 |
| com.vrchat.avatars-3.10.6-beta.3.zip | e5e901e7953cbd8b1e1c998b7a6c83fe419012736135d4bf4a53b7e1eb8cebb9 |
| com.vrchat.base-3.10.6-beta.2.zip | 7c6d17be89b1ffad2da8dc52eb3cdd477533f4f7957359d24351807b6aa64ff2 |
| com.vrchat.avatars-3.10.6-beta.2.zip | 22d5fbe409de4e9640a6772c5156bce1a64d1eb59a392a29d7094a786379b332 |
Beta.3 Avatars 包的 Editor/VRCSDK/SDK3A/AvatarDynamicsSetup.cs:88–104 通过 advancedParameters 绑定报告,包括新增的缩放与 PointSeparation 后缀。Beta.3 Base 运行时程序集中的 ContactReceiver.SetAdvancedParameters 确认了这些报告的默认值及 0.001 m 归零阈值。Beta.2 的同文件 88–113 及 Base 包运行时程序集 Runtime/VRCSDK/Plugins/VRC.Dynamics.dll 的 ContactReceiver.SetAdvancedProximityParameters、ShapeData.GetPointInLocalSpace、ContactManager.CalcRelativeVelocity 与 Proximity 选择任务支持上述选择规则、坐标框、单位和速度语义。安装包核验用于建立协议参考,Sensa 实际执行的检查另见验证记录。
Beta.3 的高级参数与材质报告均支持任意 Receiver 类型,_ProximitySpeed 专用于 Proximity。SDK 还提供材质/Shader 报告,可包含最多八个 Sender 项与四个 Renderer,属于独立 SDK 输出路径。Sensa 的 Contact 方案使用 Animator/OSC 参数,材质报告可留待后续接入。现有 Sensa Shader 捕获继续使用屏幕编码传输。