Violet+ Live Capture Suite
(来自于 Bilibili @亢体造梦)
本项目尝试使用 Java 对现有实时角色捕捉软件的核心功能进行复刻与实现。项目以实时角色预览、人脸捕捉、骨骼可视化和角色动作驱动为主要目标,在分析原软件功能结构的基础上,重新设计软件界面与程序架构,并使用 Java 完成核心功能实现。
与简单的界面模仿不同,本项目重点关注实时捕捉数据从输入、处理到角色驱动的完整流程,并通过自制角色模型进行实际测试。
项目的重点并非简单复制原软件的界面,而是通过 Java 将“摄像头输入—捕捉数据处理—骨骼控制—角色实时渲染”这一完整流程进行重新实现,并通过实际角色模型验证程序的可行性。
一、项目背景
在传统动画制作过程中,角色的表情和动作通常需要通过人工制作关键帧完成。虽然这种方式具有较高的控制精度,但制作成本较高,也不适合需要实时互动的直播场景。
实时角色捕捉则可以通过摄像头等输入设备获取用户的面部以及身体运动信息,并将这些数据实时转换为角色的动作。
例如,当用户向左侧歪头时,角色可以同步产生类似的头部运动;当用户眨眼或者改变嘴部状态时,角色也可以根据捕捉结果产生相应的表情变化。
而在本人制作者看过来源于 Bilibili @方块人就不能变可爱吗,同时经过了由原作者 @亢体造梦 制作的 Violet+ Live Capture Suite 的研发后,有了动作 / 面部 捕捉的独立制作的想法。
二、项目初心
本项目从原作的模样开发,一切所有权归 @亢体造梦 所有。
在如今我们可爱的狼萌萌已经“失联”了一年多后,本制作者「星丶白羽莲」一直都在想要保持着对狼萌萌的热爱,从原本的二创制作,Live2D 的动漫形象创建,再到现在已经对面部捕捉有了想法,为了能够实现赛博狼萌萌来临时弥补消失已久的原主。
而目前至今后本制作者均不会对本项目对外开放。
第一,紫罗兰面部捕捉并非由我从头而来,原创必须受到著作权保护;
第二,创作是初心是为了狼萌萌而制作,属于为爱发电。
三、人脸骨骼系统
人脸骨骼是本项目比较重要的一部分。
如果仅仅将摄像头画面显示出来,那么软件本身并不能完成角色驱动。因此需要在角色与捕捉数据之间建立一个中间层。
本项目采用骨骼节点的方式描述角色面部结构。
实际程序中,每一个节点都可以拥有自己的位置、旋转以及父节点信息。
例如:
Head
└── Face
├── LeftEye
├── RightEye
├── Nose
└── Mouth
通过这种父子关系,可以让上层骨骼的变化自动影响下层骨骼。
例如头部发生旋转时,眼睛、嘴部等面部节点也可以跟随头部产生相应变化。
四、角色动作驱动
为了验证系统的实际效果,项目使用本制作人所模仿制作的 Minecraft 狼萌萌 official 模型。
角色本身拥有独立的头部、面部以及身体结构。
在捕捉过程中,角色不会始终保持完全相同的姿势。
例如用户发生轻微的头部倾斜时,角色会产生对应的倾斜效果;用户改变视线或者面部状态时,角色的眼部和面部也会产生相应变化。
这种测试方式能够更加直观地证明角色并不是单纯播放一张静态图片,而是在运行过程中受到捕捉数据影响。
五、实时运行状态监控
实时捕捉程序对性能具有一定要求。
如果捕捉和渲染速度过低,即使功能正确,也会导致角色动作出现明显延迟。
因此软件在运行过程中提供基础性能信息,包括:
| 参数 | 作用 |
|---|---|
| FPS | 当前画面更新速度 |
| 分辨率 | 当前输入画面分辨率 |
| 骨骼数量 | 当前启用的骨骼节点数量 |
| 当前帧 | 当前处理的帧序号 |
| 摄像头状态 | 当前输入设备连接状态 |
通过这些数据,可以在开发过程中快速判断程序是否出现性能问题,从而逐步定位性能瓶颈。
六、实用 Java 前,用 Python 开发
在正式开发 Violet+ Live Capture Suite 之前,项目首先使用 Python 对实时动作捕捉功能进行了原型验证。
选择 Python 的主要原因是其开发效率较高,并且拥有较为丰富的计算机视觉、图像处理和机器学习相关库,可以快速完成摄像头读取、人脸特征检测以及动作参数提取等功能。
但是,当程序进入持续实时捕捉状态后,Python 版本逐渐出现了明显的性能问题。
在 Python 原型中,当单帧处理任务增加后,容易出现以下现象:
- FPS 降低;
- 画面出现间歇性卡顿;
- 角色动作存在延迟;
- 摄像头画面与角色动作不同步;
- CPU 占用较高时,界面响应速度下降。
尤其是在同时进行摄像头读取、图像处理、动作计算和界面刷新时,如果这些任务集中在同一个执行流程中,就容易造成某一帧处理时间过长。
例如:
正常情况:
Frame 1 → 处理 → 显示
Frame 2 → 处理 → 显示
Frame 3 → 处理 → 显示
Frame 4 → 处理 → 显示
异常情况:
Frame 1 → 处理 → 显示
Frame 2 → 人脸计算 ─────────→ 显示
Frame 3 → 等待
Frame 4 → 等待
Python 的解释执行机制以及运行时管理会带来一定额外开销,同时 Python 中常见的 GUI、图像处理和模型推理任务如果组织不合理,也容易互相阻塞。
另外,Python 的 GIL(Global Interpreter Lock,全局解释器锁)会限制同一进程中多个 Python 线程同时执行 Python 字节码的能力。
这对于普通程序可能问题不大,但对于实时动作捕捉来说,几十毫秒的额外延迟都可能影响使用体验。
七、选择 Java 重构制作
经过 Python 原型验证后,项目最终选择使用 Java 对软件主体进行重新实现。
选择 Java 并不是因为 Python “不能做动作捕捉”,而是希望针对本项目的实际需求,在软件工程结构和实时运行方面进行进一步优化。
Java 在桌面软件开发中具有成熟的 GUI、线程管理、文件处理以及面向对象开发能力,因此适合用于构建本项目的基础框架。
程序内部采用面向对象的方式组织角色、骨骼和捕捉数据。
捕捉模块只负责产生数据,而角色模块负责处理这些数据。
这样可以避免把摄像头处理、骨骼计算和界面代码全部写在一起。
八、当前实现效果
目前项目已经形成了较完整的程序界面,并完成了实时角色预览、角色资源加载、骨骼可视化以及运行状态显示等核心功能的设计。
软件在正常运行状态下可以关闭骨骼显示,使界面最终呈现为:
摄像头输入 → 捕捉 → 角色驱动 → 实时预览
而在开发状态下,则可以打开骨骼系统,对当前角色的面部节点进行观察。
这种设计兼顾了软件开发调试和实际使用两个场景。

评论(0)
暂无评论