前言
本学期的综合课程设计,要求进行运动可视化或者风格迁移二选一,其实这俩都挺有意思的,尤其是后者,听说之前关闭了很久的Crypko又有迹象了,但是我又想把这两者和实际的游戏结合起来,后者感觉更难一点,所以就选择了前者
需求分析
采用unity对运动数据进行可视化
例子:
主要内容
- Unity读取bvh运动数据
- 3D图形特效模拟
关于Bvh
格式Bvh文件格式解析
用到的库
- UniVRM
- BvhImporterExporter
VRM文档不过我感觉这个文档跟没有似的
总结
简单来说,Bvh
格式存储了骨架信息
和存储动画信息的数据块
,我需要从给定的Bvh
格式中读取动作数据并获取骨骼动画,简单的话直接添加粒子特效组件
去播放这些动作
进阶的话可以用摄像头进行人体动作识别,然后转化为动作数据,再用模型对动作进行播放
高阶的话我想了一个:人形态和车形态的粒子,人形态用动作识别进行操纵,然后特定动作切换车形态(比如拿起手机),然后用手机当方向盘(陀螺仪),控制车的动作,感觉应该挺有沉浸感,不过我应该是做不出来了
简易效果
首先尝试把小绿人变成粒子人
先在关节处添加个个粒子效果看看
然后关闭Target
上的SkinMeshRenderer
组件,再给全身都添加上粒子效果,适当调整粒子的参数
变成粒子人之后
但是现在的粒子人是在运行之后添加粒子组件的,而且Edit模式下Target
只有一个根节点,没有骨骼,所以接下来要把这些粒子变成动态生成的骨骼
源码分析
运行PoseTransfer
场景
首先绿色人物是跟随白色人物做动作
然后分析源码,查看是怎么加载模型并播放动作的
查看有关按钮的组件
看RuntimeBvhLoader
这个脚本
可以得知是这一段代码加载bvh
数据并生成了GameObject
根据这一段也可以看出,生成的新模型m_dst
的Source
属性会绑定为m_context
定位到Source
对应的脚本,可以发现Update
里会先获取到Source
的动作数据,再使用HumanPoseHandler
类对模型动作进行更新
然后根据文件名BvBone
以及其中内容,可知这个类是用来给读取的Bvh
数据生成骨骼的,不过暂时没什么用,我们得对Target
进行修改
然后看Target
上面的HumanBuilderTest
,里面的Add
方法用来添加骨骼
然后尝试动态生成粒子,首先在场景中添加一个带有粒子组件的物体
然后在SkeletonBuilder
类里面里写一个方法
public void setParticle () {
foreach (Transform bone in m_skeleton.Values) {
//添加粒子效果
bone.gameObject.AddComponent<ParticleSystem> ();
UnityEditorInternal.ComponentUtility.CopyComponent (GameObject.Find ("Particle").GetComponent<ParticleSystem> ());
UnityEditorInternal.ComponentUtility.PasteComponentValues (bone.gameObject.GetComponent<ParticleSystem> ());
}
//取消SkinnedMeshRenderer
m_root.GetComponent<SkinnedMeshRenderer> ().enabled = false;
}
最后在BuildSkeleton
里面调用即可
private void BuildSkeleton (Transform root) {
try {
//省略代码
builder.setParticle();
} finally {
}
}
这样就可以在一开始产生一个Tpose的粒子人了,导入运动数据后也会同步运动
之后再研究怎么样玩出花来