设置头像
只有连接机械臂的电脑需要安装软件和预制件。虚拟空间中的其他用户不需要, 他们只需要一个标准的类 DPS 灯光。
如果他们已经有标准的类 DPS 灯光(例如 SPS),就可以直接控制你的机械臂,无需进行任何额外设置。
请根据你的平台或应用程序,选择以下其中一个部分:
- 使用 Modular Avatar 的 VRChat Avatars SDK
- 使用 VRCFury 的 VRChat Avatars SDK
- Resonite
- ChilloutVR
- 使用 Basis 框架构建的应用程序
使用 Modular Avatar 的 VRChat Avatars SDK
如果你有 Modular Avatar,推荐使用此方法。如果你没有 Modular Avatar,但有 VRCFury,请参阅下方的另一部分。
你必须至少拥有这两者之一。
另外,SPS 灯光也是类 DPS 灯光。它们可以与此位置系统配合使用。
在头像中:
- 在 Project 标签页中,打开 Packages/Alleyway - Position System/Prefabs/ 文件夹。
- 将 PositionSystem-VRC-MA 预制件添加到你的头像根部。

你可以进一步自定义设置,以下步骤为可选:
- 你可以缩放 System 对象。黄色杆的长度大致相当于机械臂的总行程。
- 如果你想更改菜单位置,
(prefab)/System中有一个 MA Menu Installer 组件。 - 默认情况下,校准原点位于右手。
- 你可以使用位于
(prefab)/System/HandRoot的 Armature Link 组件将其切换到左手。 - 应该将其设为惯用手还是非惯用手并没有明确答案。我个人将其设置在惯用手上。
- 其子对象 HandPalmDown 会悬浮在你的手掌下方,距离手部大约两只手的距离。
- 你可以使用位于
如果你使用会合并网格的头像优化工具,请排除此对象:
(prefab)/System/CalibrationConstraint/LocalOnly-Toggled/Parent-ReferenceScale/Parent-Rescaled/PStoEP-Encoder- 这个网格很特殊,不得被转换或简化。
使用 VRCFury 的 VRChat Avatars SDK
我自己的项目不使用 VRCFury,对它的组件也不够熟悉。尽管如此,我还是参照 Modular Avatar 预制件, 使用等效的组件尝试制作了 VRCFury 预制件。
但是,我无法保证 VRCFury 预制件的设置是正确的。
另外,SPS 灯光也是类 DPS 灯光。它们可以与此位置系统配合使用。
在头像中:
- 在 Project 标签页中,打开 Packages/Alleyway - Position System/Prefabs/ 文件夹。
- 将 PositionSystem-VRC-VRCFury 预制件添加到你的头像根部。

你可以进一步自定义设置,以下步骤为可选:
- 你可以缩放 System 对象。黄色杆的长度大致相当于机械臂的总行程。
- 如果你想更改菜单位置,
(prefab)/System中有一个 Full Controller 组件。 - 默认情况下,校准原点位于右手。
- 你可以使用位于
(prefab)/System/HandRoot的 Armature Link 组件将其切换到左手。 - 应该将其设为惯用手还是非惯用手并没有明确答案。我个人将其设置在惯用手上。
- 其子对象 HandPalmDown 会悬浮在你的手掌下方,距离手部大约两只手的距离。
- 你可以使用位于
如果你使用会合并网格的头像优化工具,请排除此对象:
(prefab)/System/CalibrationConstraint/LocalOnly-Toggled/Parent-ReferenceScale/Parent-Rescaled/PStoEP-Encoder- 这个网格很特殊,不得被转换或简化。
VRChat Worlds SDK
🚫 我们不建议将着色器数据编码系统集成到世界中。
这是因为用户可能需要自定义着色器材质,以修复头显内的对齐问题。
目前不支持世界。不过,请考虑以下几点:
类 DPS 灯光并不局限于头像。如果你希望由世界来控制机械臂,或许可以 使用相同的类 DPS 灯光设置。
此外,我们支持 WebSocket; 如果你在为自己制作世界,也可以编写一个向 WebSocket 提交命令的日志解析器。
Resonite
Resonite 支持 WebSocket,可用于提取位置和法线。
在一个对象中创建 WebsocketClient 组件。使用 Websocket Text Message Sender 节点发送文本消息。
- 我们会在端口 56247 上开放一个 WebSocket,地址为
ws://localhost:56247/ws - 文本消息字符串的格式需要符合 WebSocket 文档中的规定。
- 传入给定坐标空间中的位置(例如本地变换或全局变换)。
- 传入与位置处于同一坐标空间的方向(例如 Up 或 Forward 方向之类)。
- 你也可以选择传入一个切线(例如 Up 或 Forward 方向之类),它应与方向垂直。我们目前尚未使用该信息,但将来可能会用它来控制扭转。
使用软件时,你需要启用 WebSocket 服务,因为它默认是关闭的。
目前我们没有提供可直接使用的 ProtoFlux 物品。请参考下图了解一种可行的实现方式。
既然你在读这段内容,你对 ProtoFlux 的了解可能比我更深,所以如果你发现这张蓝图中有明显错误, 请不要照搬。
例如,这应该只在连接机械臂的电脑上运行,但这张图目前并没有加以限制。
ChilloutVR
将 ChilloutVR 预制件添加到头像上有些困难,你需要将你的基础动画控制器与我们的动画控制器合并, 而我不知道如何干净利落地完成这一步。
可能会出现问题,所以如果你要尝试,请做好心理准备。
已尝试性地添加了一个预制件。
- 在 Project 标签页中,打开 Packages/Alleyway - Position System/Prefabs/ 文件夹。
- 将 PositionSystem-ChilloutVR 预制件添加到你的头像根部。
- 它必须位于头像根部。不要重命名预制件对象。动画依赖于它。

如果你想解包预制件:
- 解包预制件。
- 将 HandRoot 和 NeckRoot 对象分别移动到你的手部骨骼和颈部骨骼。
- 应该将 HandRoot 分配给惯用手还是非惯用手并没有明确答案。我个人将其设置在惯用手上。
- 其子对象 HandPalmDown 会悬浮在你的手掌下方,距离手部大约两只手的距离。
- 将它们的本地位置设为零。
如果你想在不解包预制件的情况下完成此操作,请改为执行以下步骤:
- 将 HandRoot 和 NeckRoot 对象的副本分别创建到你的手部骨骼和颈部骨骼上。
- 应该将 HandRoot 分配给惯用手还是非惯用手并没有明确答案。我个人将其设置在惯用手上。
- 其子对象 HandPalmDown 会悬浮在你的手掌下方,距离手部大约两只手的距离。
- 将它们的本地位置设为零。
- 在预制件中,找到
(prefab)/System/CalibrationConstraint。 - 在 Position Constraint 组件中,将约束源重新指定为你新的 HandRoot 对象。
- 在 Aim Constraint 组件中,将约束源重新指定为你新的 NeckRoot 对象。
设置你的动画控制器:
- 在 Project 视图中,进入
Packages/Alleyway - Position System/Internal/App-ChilloutVR/AbsolutePaths/ - 打开
PositionSystem-Animator-CVR-Absolute.controller动画控制器资源文件, - 将其中的两个层复制到你自己的动画控制器中,包括参数和参数的值 (TODO:这要怎么做???)。
设置你的 CVR Avatar 组件:
- 在 Advanced Settings 中:
- 添加一个名为 Enabled 的 Float 类型 Toggle,用于切换参数
PStoEP_Enabled - 添加一个名为 Enabled and Visible 的 Float 类型 Toggle,用于切换参数
PStoEP_EnabledAndVisible - 添加一个名为 Bring to Hand 的 Float 类型 Toggle,用于切换参数
PStoEP_BringToHand
- 添加一个名为 Enabled 的 Float 类型 Toggle,用于切换参数
可选:
- 你可以缩放 System 对象。黄色杆的长度大致相当于机械臂的总行程。
以下内容可以帮助你了解如何转换这个预制件。
对象结构:
- 将
(prefab)/System/HandRoot重新设为你其中一只手的子对象,这只手将用于校准原点。- 应该将其设为惯用手还是非惯用手并没有明确答案。我个人将其设置在惯用手上。
- 其子对象 HandPalmDown 会悬浮在你的手掌下方,距离手部大约两只手的距离。
- 将
(prefab)/System/NeckRoot重新设为你颈部骨骼的子对象。
组件操作/动画:
- 使用该着色器的编码器网格只需对拥有连接机械臂的电脑的人可见(头像穿戴者, 或生成该物品的用户)。
- 有一些约束已被转换为 Unity 系统,并附带相应的动画。ChilloutVR 中的动画逻辑有所不同,因为它使用的是世界对象预制件技巧。
如果你可以修改 ChilloutVR,也可以考虑使用 WebSocket。
使用 Basis 框架构建的应用程序
由于 Basis 项目允许修改,最简单的方法是不使用通过屏幕像素进行的数据提取。
请改用 WebSocket。
