您的位置:首页 > 移动开发 > Unity3D

【Hello World向】突破次元界限!运用LeapMotion+Unity实现和IL酱的互动

2014-09-06 05:17 363 查看
最近入了个LeapMotion开始学习VR技术,记录下第一个Hello World向的VR Project.

--------------------成果--------------------

点击打开链接

--------------------使用工具--------------------

引擎:Unity 4.5 Pro

控制器开发包:Leap Motion SDK

模型:あいえるたん

模型转换器:MMD4Mecanim 20140830

动画控制器:UnityChan

插件:HeadLook Control

--------------------预备前的知识笔记--------------------

游戏引擎方面使用的是用的比较顺手的Unity,因为考虑到以后要实现在手机上跑,所以最近开始使用Pro版本。

LeapMotion

LeapMotion 使用的是2个光学传感器和红外线来追踪手,手指以及手型工具的。150度视野范围,有效距离大约为1英寸到2英尺。另外要记住的是LeapMotion使用的是右手笛卡尔坐标系。当光线追踪不到手指的时候(例如翻转手面),LeapMotion内置的虚拟手模型能够根据最后的位置推测出手指的姿势和位置。 最近的V2开发者包已经可以实现手指关节的识别定位,认识许多手势。

MMD4Mecanim

模型使用的是IL酱,格式为PMD格式。Unity本身不支持这种格式,于是用到了Noraさん的MMD4Mecanim 模型转换器。
MMD4Mecanim能够转换所有MMD模型的PMD格式文件,而且VMD动作文件也支持转换。

--------------------开始--------------------

1. 新建新工程,导入HandLook Controller包;MMD4Mecanim包;あいえるたん文件夹;(或者其他MMD模型文件夹,包括贴图文件和pmd文件) UnityChan人物包(需要其中的动画组件); LeapMotion SDK中的 Plugins文件夹直接拖进Unity;(仅支持Unity Pro,免费版会显示licence Error,免费版的操作请参照:For
Unity Standard (free license))

2. 然后就是将人物转换为Unity可支持的fbx格式,具体步骤在MMD4Mecanim说明文档中有图文解释。为了不让人物成T字形僵尸状,拖入UnityChan的动画文件,附到你要使用的模型的动画控制器上(如图)。另外在人物上我们还要添加MMD4Mecanim的一个脚本,叫做:MMD4MecanimModel。



3. 将LeapMotion文件夹中的预设物体HandController拖入Hierarchy。调整位置和范围大小。另外把选择手的模型(本例中选择RiggedRightHand手模型)(如图)



4. 至此,基本设置完毕,但是如果你开始用手去触碰IL酱的话,你会发现她一点反应都没有。那是因为人物模型上各部分还没有添加上碰撞体,而且还要手动打开人物的物理引擎,MMD4Mecanim支持Bullet Physics物理引擎(世界著名开源物理引擎之一)。点击人物,在我们刚添加的MMD4MecanimModel脚本中的Physics,将引擎选择为 Bullet Physics。点击 Process 生成碰撞体。另外把Join Local World 的钩去掉。(如图)



5. 另外因为MMD4Mecanim的特殊性,还需要在我们运用到的RigidHand手模型上添加上脚本MMD4MecanimRigidBody(如图)。现在点击播放,接触人物应该会让人物的头发或者衣服飘动起来了。



6. 到现在差不多已经把这个工程完结了,但是人物完全没有互动的意思嘛,怎么能叫做VR呢。所以为了补足,我们还需要让她对我们的接触有所反应,接下来主要是要做:1. 接触到头部后,会把眼睛眯起来,并且会看向手部。

7. 首先要知道,人物通过MMD4Mecanim导入后,角色的脸部表情控制是通过MMD4Mecanim的Morph来实现的。在开始游戏后,可以试着拖拉这些拖动条来看看有什么变化。(如图)



8. 为了能用代码动态的控制这些参数,MMD4Mecanim运用了一个叫MMD4MecanimMorphHelper的脚本,把它附给人物物体,另外我们需要创建一个新脚本来向这个脚本传输数值。新建一个脚本TouchHair,敲上以下代码:

using UnityEngine;

using System.Collections;

public class TouchHair : MonoBehaviour {

public GameObject airo;

private Animator airoAnim;

private MMD4MecanimMorphHelper airoMorph;

private float timeCount;

private bool touch;

void Start () {

airoAnim = airo.GetComponent<Animator>();

airoMorph = airo.GetComponent<MMD4MecanimMorphHelper> ();

timeCount = 0.0f;

touch = false;

}

// Update is called once per frame

void Update () {

if(touch){

timeCount = timeCount + Time.deltaTime;

if(timeCount > 2.0f){

airoMorph.morphName = "";

airoMorph.morphWeight = 0f;

timeCount = 0.0f;

touch = false;

}

}else{

airoMorph.morphName = "";

airoMorph.morphWeight = 0f;

timeCount = 0.0f;

}

print (timeCount);

}

void OnTriggerEnter(Collider col){

airoMorph.morphSpeed = 0.5f;

airoMorph.morphName = "笑い";

airoMorph.morphWeight = 1.0f;

touch = true;

}

void OnTriggerExit(Collider col){

touch = false;

}

}

9. OK,我们姑且把这个脚本完成了,我们需要把这个脚本附给头部,让头部的碰撞体检测到手进入后(OnTriggerEnter),执行相应代码。首先找到 Coll.6.joint_head物体(如图),添加一个胶囊碰撞体,钩上Is Trigger。 添加上刚才我们创建的TouchHair脚本,并且把人物物体拖进Airo框。



10. 最后一步,我们需要让角色能一直看着我们的手(如果想在手碰到头之后看着手,可以试着把HeadLookController脚本给disenable,在接触后enable它)。我们需要在人物身上添加脚本HeadLookController,设置参数如下图



11. OK,设置完毕。

--------------------注意事项--------------------

本例中简写了许多‘为什么这个样做’的表述,另外因为只是记录性而非教学性的博文,所以是在制作完成品上进行回忆说明。

--------------------接下来的阶段--------------------

接下来是准备实现能够和人物进行对话,实现对答,初步大纲已列好。

--------------------参考文献--------------------

Leap motionとMMD4Mecanimでいろいろ触る

Unity+OculusRift+LeapMotionで3Dキャラクターに触れる

LeapMotionを使って画面の中のミクを撫でてみたよ

--------------------工具链接--------------------

MMD4Mecanim

あいえるたん

Head Look Controller

--------------------更新--------------------

因为CSDN博客需要审核缘故,已将博客搬到自己的博客网站:http://imlewis.com/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: