前言

本学期的综合课程设计,要求进行运动可视化或者风格迁移二选一,其实这俩都挺有意思的,尤其是后者,听说之前关闭了很久的Crypko又有迹象了,但是我又想把这两者和实际的游戏结合起来,后者感觉更难一点,所以就选择了前者

需求分析

采用unity对运动数据进行可视化

例子:

主要内容

  • Unity读取bvh运动数据
  • 3D图形特效模拟

关于Bvh格式Bvh文件格式解析

用到的库

  • UniVRM
  • BvhImporterExporter

VRM文档不过我感觉这个文档跟没有似的

总结

简单来说,Bvh格式存储了骨架信息和存储动画信息的数据块,我需要从给定的Bvh格式中读取动作数据并获取骨骼动画,简单的话直接添加粒子特效组件去播放这些动作

进阶的话可以用摄像头进行人体动作识别,然后转化为动作数据,再用模型对动作进行播放

高阶的话我想了一个:人形态和车形态的粒子,人形态用动作识别进行操纵,然后特定动作切换车形态(比如拿起手机),然后用手机当方向盘(陀螺仪),控制车的动作,感觉应该挺有沉浸感,不过我应该是做不出来了

简易效果

首先尝试把小绿人变成粒子人

先在关节处添加个个粒子效果看看

然后关闭Target上的SkinMeshRenderer组件,再给全身都添加上粒子效果,适当调整粒子的参数

变成粒子人之后

但是现在的粒子人是在运行之后添加粒子组件的,而且Edit模式下Target只有一个根节点,没有骨骼,所以接下来要把这些粒子变成动态生成的骨骼

源码分析

运行PoseTransfer场景

首先绿色人物是跟随白色人物做动作

然后分析源码,查看是怎么加载模型并播放动作的

查看有关按钮的组件

RuntimeBvhLoader这个脚本

可以得知是这一段代码加载bvh数据并生成了GameObject

根据这一段也可以看出,生成的新模型m_dstSource属性会绑定为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的粒子人了,导入运动数据后也会同步运动

之后再研究怎么样玩出花来

Last modification:March 16th, 2021 at 11:10 pm