Foheart Unity3d Plugin

APACHE-2.0
by FOHEART

Unity3D Plugin for FOHEART Motion Capture Suits

( Crawled 13 minutes ago )
+

Official Unity3D Plugin for FOHEART Mocap Suits

前言

此手册介绍实时数据流驱动Unity3D模型运动,如果您对于硬件设备或者MotionVenus软件的使用有问题,请参看MotionVenus软件安装目录下的Help文件夹下的《FOHEART C1驱动安装与软件使用手册》.pdf。 “MotionVenus”如没有特别说明,均指“FOHEART MotionVenus”。如果对该软件有任何问题可直接电子邮件反馈给我们:[email protected]

一、下载插件包

方法一:打开官网 http://www.foheart.com/resource.html 下载Unity3D插件。
方法二:git clone本库到硬盘任意位置即可。
下载后我们可以得到以下文件:

由于版本更新原因,可能文件不同。

二、文件简介

在文件目录中,其中FHMCScript是插件的代码部分,Template中是示例模型,DefaltActor.xml是示例模型的配置文件。

2.1 FHMCScript主要文件简介

  1. NetFrameDataReceiver.cs用于接收来自MotionVenus软件的网络数据流,需要将其安置在场景当中的一个单独的永久物体上(2D、3D物体均可),例如新建一个3D Object->Cube,命名为NetworkReceiverNetFrameDataReceiver.cs拖动到它之上。在整个运行过程中,不要对NetworkReceiver再进行其它操作,以免出现不可预料的网络问题。
  2. FoheartModel.cs用于控制模型运动。将其拖动到需要控制运动的类人体模型之上即可。
  3. ActorFrameData.cs是数据解析文件,不需要进行操作。
  4. 其他 .cs文件是一些定制功能的脚本文件。

    2.2 配置文件xml

    这个配置文件决定了网络数据中骨骼数据与用户骨骼模型骨骼的绑定关系,它决定了人体骨骼的旋转和位移,正常情况下,我们需要自己编写这个配置文件,配置方法参照DefaltActor.xml的配置方法。
    配置文件中的ConnectId 是骨骼的索引编号,name是这个位置控制的模型骨骼的名称,X Y Z为骨骼初始旋转顺序,XR YR ZRT_Pose下骨骼的本地旋转角度值。

<bone ConnectId = "0" name = "Hips" X="-Y" Y="-X" Z="-Z" XR="-90.0" YR="0.0" ZR="90.0"></bone<

默认的编号对应的人体骨骼关系是:

索引名称备注
0Spine或Hips类人模型的根节点,控制整个人体的位移和根关节点的旋转
1Spine1相当于人体L3~L5段骨骼
2Spine2相当于人体T12~L2段骨骼
3Spine3相当于人体T8~T11段骨骼
4Spine4相当于人体T1~T7段骨骼
5Neck
6Head
7RightShoulder
8RightArm
9RightForeArm
10RightHand
11LeftShoulder
12LeftArm
13LeftForeArm
14LeftHand
15RightUpLeg
16RightLeg
17RightFoot
18RightToeBase
19LeftUpLeg
20LeftLeg
21LeftFoot
22LeftToeBase

需要将模型的对应骨骼名称填写在xml文件的name栏中,即可对这段骨骼进行旋转控制。

2.3 非标准骨骼绑定

  1. 如果模型的骨骼数目大于23段,比如背部骨骼有5段如何操作?
    需要将背部骨骼中的某两段合为一段控制,由于在Unity3D中旋转父骨骼会带动它所有的子节点旋转,所以只需要将父骨骼的名称填到xml文件中即可,最后要保证所有骨骼数目小于等于23段。
  2. 如果模型的骨骼数目小于23段,比如背部骨骼只有2段如何操作?
    在这种情况下需要去掉xml文件中不需要的索引,但是必须要留下Hips或Spine节点,因为这个节点还控制整个模型的位置,如果去掉整个模型就不会运动。例如以下:

<bone ConnectId="0" name="Hips X="-Y" Y="-X" Z="-Z" XR="-90.0" YR="0.0" ZR="90.0"></bone>

<bone ConnectId="3" name="Spine1" X="Z" Y="Y" Z="-X" XR="0.0" YR="0.0" ZR="0.0"></bone>

在这里首先去掉了1 2 4这三段骨骼,因为模型中没有这三段骨骼,因此也就相当于用标准模型的T8~T11段骨骼运动代替了模型的Spine1段骨骼运动,当然也可以使用索引1或2(如果模型的Spine1段骨骼比较靠下接近胯部)或4(如果模型的Spine1段骨骼比较靠上接近颈部),需要根据实际情况而定。

三、插件使用流程

下面是使动捕数据流在Unity3D中驱动任意模型的具体步骤:

  1. 新建一个Unity工程,或是使用你自己的工程。
  2. 将FHMCScript文件夹拷贝到工程目录的Assets目录下,将DefaltActor.xml 拷贝到工程根目录下。
  3. 创建一个任意一个2D或3D物体,命名为NetworkReceiver,设置scale为0.1,去掉Mesh Renderer使之基本不可见。
  1. 将NetFrameDataReceiver.cs 拖放到NetworkReceiver上,在其Inspector中会显示下面属性:

UDP Port的设定需要与MotionVenus中的设定相同,如果在MotionVenus中没有设置远程地址,可以在IP地址栏中输入远程地址的IP,在端口中输入远程地址的端口,然后点击添加按钮,这个地址就被添加到了发送列表。

Position、Euler、Quat的设定需要与MotionVenus中的转发规则设置中位移、欧拉角、四元数的选择保持一致,例如:

  1. 将Template文件夹中的FoActorRig.fbx拖放到场景中,并且添加FoheartModel.cs为Component,最终显示如下:

其中ActorName需要与MotionVenus中对应的人物套装编号一致,例如:

而ConfigName需要与工程根目录里的xml配置文件名称一致。
然后选择NetworkReceiver,将ActorList中Size设为1,点击Element 0右侧选择按钮,在弹出的窗口中选择刚才设置好的FoActorRig。

设置完成之后如下:

如果在MotionVenus中连接有多套设备,在这里只需要将Size设为设备数目,然后依次选择设备需要绑定的Model,例如下面为添加了两个Model:

  1. 穿戴并完成校准动作,此时模型在MotionVenus中就可以正常的运动起来了。

四、模型绑定

由于在建模过程中使用的3D建模软件不同,或者在建模过程中没有使用软件推荐的骨骼系统,就会造成骨骼坐标系的不统一,这里的工作就是将任意旋转任意坐标系朝向的骨骼系统使用动捕数据流驱动。

4.1 默认数据流格式

MotionVenus使用下面格式的数据流输出人物的姿态位置信息:

4.2 默认坐标系定义

在MotionVenus中的坐标系定义如下:

即在T-Pose时所有骨骼的坐标轴定义都为左手边为x轴(红色轴),上方为z轴(蓝色轴),身体后方为y轴(绿色轴),数据流输出的是骨骼在世界坐标系(右手坐标系)中的旋转,骨骼位移也是在世界坐标系中的位移。

4.3 旋转转换

在Unity3D中的坐标系为左手坐标系,例如上图中的手,如果同样沿y轴旋转90度,则左侧手转向屏幕外,而右侧手转向屏幕里,其它两个轴也存在相同的问题,这样会造成同一段骨骼在MotionVenus中的旋转和U3D中的旋转现象不一致,在这里我们需要手动纠正这种不同坐标系造成的旋转错误。
以左胳膊为例,选择显示左胳膊的Local坐标系。例如胳膊在U3D中沿+x轴旋转,在U3D中为+x,而在MotionVenus中要想达到同样效果也为+x(因为左右手旋转规则不同);在U3D中沿+y轴旋转,在MotionVenus中要想达到同样效果为沿-y轴旋转;z轴的规则也相同。

所以在FoheartModel.cs中applyBoneRotations函数中,对左胳膊的旋转设置为:

在v1.2.8中的设置:
if (BoneR.Key == 12)
{
Quaternion convQuatApply = new Quaternion (BV.x, -BV.y, -BV.z, BV.w);
BoneT.localRotation = convQuatApply;
}
现在的设置,直接改配置文件:

<bone ConnectId = "12" name = "LeftArm" X="X" Y="-Y" Z="-Z" XR="0.0" YR="0.0" ZR="0.0"></bone>

其它所有段骨骼的设置均遵守相同方法。

五、注意事项

插件使用时,需要注意以下地方:

  1. 在模型绑定过程中,需要首先将模型调整到标准的T姿势,并且人物正面朝着Unity的Z轴正方向。
  2. 使用Unity的过程中MotionVenus不可最小化。