输入、计算与输出
简体中文 | English
一条流程把来源连接到一个或多个目标。在流程页选择来源并添加输出;需要融合、平滑或其他换算时,再加入计算。每条绑定分别保存目标、范围和发送节奏。网页版适合手动/脚本流程,桌面工作台提供全部来源类型。
| 想完成的事 | 看这里 |
|---|---|
| 立即打开控制页 | WebSensa |
| 先试通一条流程 | 录一条手动轨道 |
| 选择来源或添加计算 | 来源与计算 |
| 连接设备或应用 | 输出设置 |
| 接收网站/播放器发给设备的命令 | 协议输入、虚拟设备与桥工具 |
| 同时驱动多个目标 | 多输出示例 |
| 下载并再次使用轨迹 | 录制与回放 |
| 保存整套设置 | 保存方案 |
输入:OSC/定位、手动、脚本、外部协议、反馈或回放
↓
计算:组合、平滑、触发、换算,按需要添加
↓
输出:设备、OSC 参数、应用或录制文件
例如,先将两个触碰区域合成为“接触强度”,再分别用于设备振动、DG-LAB 通道和 Avatar 发光。每条输出按自己的范围解释这一结果。计算信号 · 工作台指南

先录一条手动轨道
- 打开“流程”,添加“录制”输出,保留默认 Funscript 格式。
- 在连接中选择“手动 → L0”,轨道名称填
L0,输入和输出范围均设为 0~1,再“保存输出”。 - 启用这个输出并确认连接。在“控制”应用“手动”,启用输入,调整 L0 并“发送一次”;多次调整可形成一条变化轨迹。
- 关闭输入,当前片段完成后点击“下载录制”,或“载入脚本播放器”。载入后先保持暂停;应用脚本方式并启用输入后再播放。
这条流程同时展示了来源、换算、输出与重放。接下来可把来源换为 OSC 或计算信号,或给同一结果增加其他输出。
选择来源与计算
手动、OSC、脚本和协议保留各自的快捷输入方式;“组合”让多种来源共同参与输出绑定。先准备并保存设置,再应用所需输入方式,最后启用输入。
| 来源 | 可以读取的内容 | 使用例子 |
|---|---|---|
| OSC 参数 | 明确路径与来源的数值 | 触碰程度、开关或档位 |
| 定位测量 | 有效的位置、距离、姿态、速度或 Shader 轴向/缩放 | 两个根点间距、局部运动速率 |
| 手动 | 手动轴的当前设置 | 为所有效果提供可随时调整的总强度 |
| 脚本 | 当前脚本轨迹与播放指标 | 基础节奏或动作轨迹 |
| 协议输入 | 已连接来源的通道轨迹、目标、强度或旋转速度/方向 | 网站/播放器 → Sensa → OSR,或参与明确计算 |
| 设备反馈 | 已连接输出提供的状态和读数 | DG-LAB APP 按钮、设备强度或压力读数 |
| 录制回放 | 已载入的 funscript 轨道或诊断信号 | 重现一次交互,并调整计算方式 |
| 固定数值/计算信号 | 常量或已保存的具名结果 | 比例系数、多个输出共用的中间计算 |
Shader 的方向和缩放可作为定位指标参与流程:在计算或输出绑定中选择“定位测量”(SensaPoint),再选择 RightX/Y/Z、ForwardX/Y/Z 或 AvatarScale。这些指标随完整测量包更新,并沿用空间输入许可和失效检查;OSC 参数页可用于观察原始报告。
空间计算把位置与方向组合成有明确含义的读数:两点距离、带正负方向的平面深度、偏离中心的距离,以及方向夹角。平面可以用参考点与法线定义,也可以用参考点与两条轴定义;“跟随移动平面”模板读取 Unity 生成的标记,随骨骼运动更新方向。XYZ 成组选择,结果保存后照常连接到输出。
给计算起一个便于辨认的名称,例如“接触强度”,在输出连接中即可反复选择。位置、速度和强度各用符合实际含义的量程;输出连接再把结果换算成目标需要的范围。计算示例 · 定位单位
添加输出与绑定
- 点击“添加输出”,选择方式并填写地址或设备。
- 打开“输入到输出的连接”,选择直接来源或已保存的计算。
- 填写目标参数,以及输入、输出范围,再“保存输出”。
- 启用输出并确认连接,在“控制”应用所需输入方式,最后启用输入。
| 输出方式 | 连接与目标 | 适合的内容 |
|---|---|---|
| TCode 串口/UDP/TCP | 端口或网络地址,以及轴配置 | 位置、旋转、振动和辅助轴 |
| Intiface | Central 地址与设备特征,或显式 IntifaceFeatures 映射 | 已声明的位置、振动、旋转与其他功能;范围与方向 |
| Handy/Lovense/Autoblow/VacuGlide | API 地址、连接 key/设备 ID、来源轴与相应能力 | 位置与时长、强度/速度或同步脚本;语义与限制 |
| OSC 参数 | IP、端口、参数地址和 Float/Int/Bool 类型 | Avatar 参数或其他 OSC 应用 |
| DG-LAB | WebSocket 中继、配对 APP、设备与通道 | 临时强度、波形任务及状态反馈 |
| HTTP JSON/WebSocket JSON | 接收 JSON 的服务地址 | 外部面板、插件或自制服务 |
| MQTT | Broker、端口与主题 | 自动化服务或订阅应用 |
| MIDI CC | 系统 MIDI 输出端口、通道与控制器 | 应用音量、声像或其他 MIDI 控制 |
| 录制 | 文件名称、格式与要记录的信号 | 脚本播放、轨迹编辑和信号诊断 |
TCode 的绑定目标是十二轴中的一条轴,数值使用 0~1,再由该输出的轴配置设置实际范围和运动方式。Intiface 默认绑定目标为 L0 和该输出配置的振动轴;配置 IntifaceFeatures 后,还可选择映射实际使用的 SourceAxis 及旋转 DirectionAxis。只有默认轴或映射引用的轴可用,按真实设备能力发送;旋转方向值至少 0.5 为顺时针。
外部协议的直接动作路径保留每通道到达时长。需要计算或多输出时,在来源选择“协议输入”,路径为 来源ID/通道ID,例如 website/L0;也可读取 /target、旋转 /speed 或 /clockwise。标量绑定采用自己的发送频率,不能当作原始定时命令的无损转发。关闭来源直接映射后,再为需要的目标建立绑定,避免同一动作被两条路径重复驱动。可运行配置和客户端示例
输入范围描述来源,输出范围决定响应。例如把 0–1 换算为 MIDI 0–127,0.5 就是约一半量程。备用值决定必需来源失效时绑定发送什么,可以是零强度、false 或参数默认值;在位置轴上,它是一个位置目标。关闭输入/输出或急停使用设备停止指令。
OSC、网络、MIDI、录制和动作轴绑定提供三种发送方式:“数值变化时发送”适合状态和缓慢变化的读数,可设置最小变化量;“按固定频率发送”适合需要定期更新的目标;“正向触发时发送”在换算后的信号变为正值时交付一次动作。这些绑定可设 1~100 Hz 的发送频率,共用来源的输出可以各自采用合适的节奏。事件按顺序交付,状态发送保留最新数值。需要接收开、关两种状态的目标,使用状态发送方式。DG-LAB 按任务时长自动安排发送与续接,操作见下文。
同一个结果连接多个输出
例如建立一个“相乘”计算:一项为实际 OSC 触碰值,另一项为“手动 → L0”总强度;两项都使用 0~1。将它保存后,各输出选择这个计算作为来源:
| 输出 | 目标与量程 | 使用结果 |
|---|---|---|
| OSC 参数 | /avatar/parameters/SensaFeedbackIntensity,Float,0~1 |
供 Avatar 已配置的发光或其他效果使用 |
| DG-LAB | Intensity,0~1,并设置通道上限 |
按当前交互强度调整通道任务 |
| 录制 | 轨道 L0,0~1 |
保存同一效果的 funscript 轨迹 |
保存各输出后,在“控制 → 组合”应用输入方式,启用所需输出并确认连接,最后启用输入。每条连接独立显示原始值、换算结果和有效状态;它们各自使用目标需要的量程与发送方式。
回写 VRChat OSC
添加“OSC 参数”输出,勾选“回写到 VRChat OSC”,使用 VRChat 的接收地址与端口,通常是 127.0.0.1:9000。填写当前 Avatar 已配置为可写的参数地址与类型,例如:
| 目标示例 | 类型 | 来源用途 |
|---|---|---|
/avatar/parameters/SensaFeedbackIntensity |
Float | 以 0~1 表示效果强度,供 Avatar 发光、颜色或形变动画使用 |
/avatar/parameters/SensaFeedbackActive |
Bool | 表示某个效果当前是否生效 |
/avatar/parameters/SensaFeedbackMode |
Int | 选择 Avatar 已配置的效果档位 |
Avatar 的 OSC 配置决定输入地址与预期类型,配套的表达参数和动画负责呈现效果。测量参数与反馈参数分别命名,便于读写依赖检查和排查循环。按当前 Avatar 核对目标后,再检查范围与发送节奏。VRChat 官方 Avatar 参数接口
Sensa 原有 OSC Hub 继续用于转发收到的消息;OSC 参数输出根据绑定结果生成消息。OGB 心跳则继续维护 Avatar 的参数发布条件。接收、转发与心跳
连接 DG-LAB
DG-LAB 输出采用 DG-LAB 4 APP 的 WebSocket V4 接口。选择官方中继或自己部署的 V4 中继,连接后用本地生成的配对二维码或配对链接接入 APP。APP 上报设备后,选择实际设备与 A/B 通道;设备选择同时记录 APP 标识与设备标识,便于区分多个 APP 中的设备。
先保持通道强度上限为 0,完成配对和设备选择,再按需要设置上限。Intensity 把绑定结果限制到 0~1,再乘以该通道的用户上限;Pulse 发送已配置的波形帧。临时强度与波形分别配置,任务持续时间为 100~1000 ms,持续效果通过短任务续接。
Intensity 可选“跟随输入”,由后端按当前强度续接短时任务;“触发一次”在换算结果变为正值时发送一次临时强度任务。Pulse 可选“持续播放”,达到 0.5 时按 100 ms 波形帧的当前进度连续续接;“触发一次”在达到 0.5 时发送一次波形任务,回落后可再次触发。COYOTE_030 可选择 Sensa 生成的平稳、渐变和交替基础效果,也可以在高级设置中逐行填写自定义帧。
配对、设备选择和输出启用分步进行。尚未选择设备时保持中继与 APP 配对,保存同一中继的绑定或通道设置也保留连接。连接中断后通过连接按钮重新连接;检查设备、通道和任务状态后,再启用输入。郊狼 3.0 的临时强度与波形绑定分别停止,自定义帧按对应设备协议处理。全局停止会清理待发任务,并向仍连接的目标发送停止操作。反馈数据按设备实际提供的能力作为新输入。
DG-LAB 4 APP、V4 网络协议和郊狼硬件型号分别表示应用、通信与设备版本。可用设备和反馈以 APP 实际上报为准。官方 DGLAB KIT · 官方 WebSocket 中继
其他应用与 MIDI
HTTP JSON 与 WebSocket JSON 的消息包含 address、value、type、signalId、unit、coordinateFrame 和 timestampMs,MQTT 按选定主题发布同类 JSON。接收应用根据配置的地址解释数值。
MIDI 使用操作系统可用的输出端口。在端口列表中刷新并选择目标,将地址填写为 CC/通道/控制器:通道为 1~16,控制器为 0~127,发送值也为 0~127。例如,CC/1/1 发送第 1 通道的第 1 控制器。Windows、macOS 使用系统 MIDI 服务;Linux 需要 ALSA 及可用的音序器,包括 /dev/snd/seq。
录制与观察
控制页也提供快捷的 L0 录制面板。

先选择想保留的来源,再添加“录制”输出。推荐先使用 Funscript,得到可以播放和编辑的轨迹。
- 添加连接,选择来源与轨道名称,输出范围设为 0~1,保存并启用录制输出。
- 应用所需输入方式并启用输入,完成要录下的交互。
- 关闭输入或停用录制输出,使当前片段完成,再从文件列表下载。
| 之后想做什么 | 使用入口 |
|---|---|
| 把轨迹作为脚本播放 | 点击“载入脚本播放器”,准备好后应用“脚本”、启用输入并播放 |
| 用轨迹继续参与计算 | 在“录制回放”载入文件,再在来源中选择它 |
| 分析原始信号与无效区间 | 录制格式选择 JSON Lines/CSV |
Funscript 格式与兼容
“录制”输出默认生成 funscript,便于在脚本播放器或编辑器中使用。每条绑定选择自己的来源、轨道名称和换算范围;换算结果限制到 0~1,再四舍五入为 pos 的 0~100 整数。at 使用毫秒,每个连续有效片段从 0 开始计时。例如:
{"version":"1.0","inverted":false,"range":100,"actions":[{"at":0,"pos":20},{"at":1000,"pos":80}]}
这条轨迹用一秒从 20% 移动到 80%。funscript 是广泛支持的时间—位置脚本约定;Sensa 导出 version: "1.0"、inverted: false、range: 100。载入时会应用 inverted: true 的位置反向,实际设备行程继续由输出轴配置设置。原作者格式说明 · JSON Schema
在“轨道名称”中填写明确的轴名时,Sensa 使用 MultiFunPlayer 推荐的文件后缀。同一录制使用共同的文件名前缀,例如 L0 保存为 session.funscript,R0 保存为 session.twist.funscript。也可填写自定义名称,生成带轨道名的独立文件,再在播放器中选择它对应的轴。
| 轨道轴 | 文件名后缀 |
|---|---|
| L0 | .funscript |
| L1/L2 | .surge.funscript/.sway.funscript |
| R0/R1/R2 | .twist.funscript/.roll.funscript/.pitch.funscript |
| V0 | .vib.funscript |
| A0/A1/A2 | .valve.funscript/.suck.funscript/.lube.funscript |
这些后缀对应 MultiFunPlayer 的通用轴及 TCode v0.3 推荐命名;播放器也支持为各轴手动载入文件。MultiFunPlayer 一手说明
输入失效时结束当前片段,恢复后生成下一片段,例如 session-part02.twist.funscript。文件列表显示轨道、片段序号及它在原录制中的起点偏移;各文件内仍从 0 ms 开始,便于独立重放,按起点偏移可对齐原时间线。活动片段显示“录制中”;完成后可下载或点击“载入脚本播放器”。载入播放器后,单条轨迹通过“脚本 → L0”提供,输出绑定再选择所需目标轴;准备好后再启用输入并播放。L0 快捷录制也继续导出 funscript。L0 录制
一次 funscript 录制最多包含 64 条轨道、1024 个片段,所有轨道和片段合计最多 64 MiB、250000 个动作。达到上限后结束录制并保存已有的完整片段,状态会显示具体原因。
高级诊断可选择 JSON Lines/CSV,同一文件记录多条信号的相对时间、原始值、换算值、有效性、原因、来源和坐标框。“记录字段”保存为 signalId,留空时使用绑定标识。这类文件最多 64 MiB、250000 条采样,回放最多读取 64 个信号。录制文件写入程序旁的 recordings/;用 SENSA_RECORDINGS_PATH 可指定其他目录。
展开“录制回放”,点击“刷新录制列表”,选择完成的文件并“载入录制”;也可以手填文件名。载入后保持暂停。funscript 的来源路径为 录制输出标识/value,以线性插值提供 0~1 的位置;JSON Lines/CSV 的路径为 录制输出标识/信号标识,读取记录中的原始值并保留无效区间。保存目标绑定,应用组合方式并启用输入,再播放回放。支持暂停和按毫秒跳转;暂停或结束按无效输入呈现。新绑定可以继续应用自己的量程和曲线。
实时预览应沿同一条绑定核对来源、原始值、计算结果和发送目标。设备回报的状态单独展示,便于对照指令与反馈。复杂方案先使用录制或可观察的应用参数检查换算,再接入实际设备。
保存与复用整套方案
展开“保存与载入整套方案”,可将轴映射、轴配置、计算信号图和输出设置导出为 JSON,并填写便于辨认的方案名称。轴配置一并保留各轴的范围与处理设置。导入时先打开检查窗口,列出计算、映射和输出数量;应用后替换当前配置中的这些部分。
导入后的输出与输入启用状态关闭。核对目标地址、引用的轴配置、设备选择和来源路径后,再启用需要的输出。脚本文件、当前手动值和外部应用设置由本机环境提供。
页面与连接共用
同源工作台标签页共用实时连接,传递状态与控制。各页保留独立草稿和请求响应。关闭一页后其他页面继续连接;恢复挂起页面时重新接入当前状态。
共享端口与独立实例
多个协议输入通过不同路径共用 HTTP/WebSocket 监听,网络入口共用,各来源的命令与通道独立。通过绑定把一个来源送给多个目标,通过计算融合多个来源。路由示例
独立桌面实例各自保存配置。再次打开同一配置会复用持有实例;--instance <name> 开启另一套设置并协调监听端口。启动指南
配置与启停
浏览页面和编辑草稿保持当前实际状态。保存配置、更换输入方式或替换脚本时,先关闭输入并停止;确认新方案后再启用。急停覆盖所有输出,解除急停后再单独启用输入。
每条绑定根据自己的必需输入判断有效性,相关读数失效时使用该绑定的停止行为。来源和计算恢复后,后端依据当前输入启用状态决定是否继续。设备连接与输入启用分别管理。
实现职责与约定见架构和输入、计算与输出决策。实际自动检查记录见浏览器验证。