Leap Motion Using Unity3D——环岛跑车篇

Leap Motion Using Unity3D——环岛跑车篇

 一. Leap Motion简介

        Leap Motion作为一款体感传感器,通过立体视觉捕捉红外图像信息并产生手掌在三维空间中的相关信息。下面会结合示例来说明Leap Motion采集的模型数据在跑车游戏中的应用。翻译来自Pierre Semaan的博客“Leap Enabling the Unity3D Car Tutorial”,然后对有关联的代码和操作注意事项加以说明。

二. 软件要求

1. Unity3D

        官方给的选择为Unity 5 Pro或者Unity 5 Free,不过笔者用的是Unity 4.6;

2. 跑车教程

        在Unity3D的资源商店中搜索”Car Tutorial“,然后在Unity3D中免费下载并导入资源即可;

3. Leap SDK

        在Leap Motion的官网上下载最新版本的SDK。如果下载不了或者回到前一个界面,可以尝试换浏览器下载。

4. Leap Motion输入脚本

        选用Pierre Semaan提供的pxLeapInput.cs。

三. 操作步骤

1. 创建新的工程

        新建Unity3D工程时,导入Car Tutorial.unitypackage包。

2. 确保CompleteScene场景正常工作

        CompleteScene场景存放在Scenes文件夹下,双击打开场景后可以俯视看到环形跑道。不过由于Unity 3版本的跑车游戏转到Unity 5后提示shader有问题,于是岛外的背景颜色看起来有些违和。运行游戏,按上下左右键可以控制跑车则说明游戏正常。

3. 复制CompleteScene

CompleteScene复制后重命名为LeapCompleteScene,这样可以备份源文件并开始大胆地实验。

4. 在Assets目录下创建Plugins文件夹

5. 复制Leap文件至Plugins文件夹和游戏文件的根目录下

复制Leap.dll和LeapCSharp.dll至游戏文件夹的根目录下,注意两个文件是有不同操作系统的版本。然后复制LeapCSharp.NET3.5.dll至Plugins文件夹下。

6. 复制LeapUnityExtensions.cs至Plugins文件夹

        下载LeapUnityExtensions.cs然后复制进Plugins文件夹。

7. 复制pxsLeapInput.cs至Plugins文件夹

        下载pxsLeapinput.cs文件并复制到Plugins文件夹。脚本必须在Plugins文件夹下因为后面我们需要在javascript脚本中参考它,并且它需要 先编译这样javascript引擎才能看见它。
a)(可选)检查pxsLeapInput.cs脚本
    它是一个单例并且包含易于从最近的Update中获取图像帧和手的属性。关键函数为GetHandAxisPrivate:
private static float GetHandAxisPrivate(string axisName, bool scaled)
{
	// Call Update so you can get the latest frame and hand
	Update();
	float ret = 0.0F;
	if (m_Hand != null)
	{
		Vector3 PalmPosition = new Vector3(0,0,0);
		Vector3 PalmNormal = new Vector3(0,0,0);
		Vector3 PalmDirection = new Vector3(0,0,0);
		if (scaled == true)
		{
			PalmPosition = m_Hand.PalmPosition.ToUnityTranslated();
			PalmNormal = m_Hand.PalmNormal.ToUnity();				
			PalmDirection = m_Hand.Direction.ToUnity();
		}
		else
		{
			PalmPosition = m_Hand.PalmPosition.ToUnity();
			PalmNormal = m_Hand.PalmPosition.ToUnity();
			PalmDirection = m_Hand.Direction.ToUnity();
		}
		switch (axisName)
		{
		case "Horizontal":
			ret = PalmPosition.x ;
			break;
		case "Vertical":
			ret = PalmPosition.y;
			break;
		case "Depth":
			ret = PalmPosition.z ;
			break;
		case "Rotation":
			ret = -2 * PalmNormal.x ;
			break;
		case "Tilt":
			ret = PalmNormal.z ;
			break;
		case "HorizontalDirection":
			ret = PalmDirection.x ;
			break;
		case "VericalDirection":
			ret = PalmDirection.y ;
			break;
		default:
			break;
		}
	}
	if (scaled == true)
	{
		if (ret > 1) {ret = 1;}
		if (ret < -1) {ret = -1;}
	}
	return ret;
}
        pxLeapInput被定义为一个静态类;定义了一个Leap名称空间中的空Controller对象m_Controller,空Frame对象m_Frame和空Hand对象m_Hand。
        构造函数中用new创建了一个Controller对象,如果创建失败,则返回Errors字符串提示。
        定义Frame函数返回m_Frame,定义Hand函数返回m_Hand。
        在Update函数中,首先判断m_Controller是否创建成功,如果创建成功,则将当前帧传给上一帧(这句没起作用),用Frame函数返回当前帧m_Frame;如果当前帧不为空,则说明检测到手,将当前帧的类中的Hands数组中索引为0的部分赋值给m_Hand(说明只是用到单手控制)。
        在GetHandAxisPrivate函数中,函数输入包括轴的名称axisName(字符串)和缩放标志位scaled(布尔型)。首先调用Update函数获取当前帧和当前帧中索引为0的手;如果布尔型变量scaled值为真,则掌心位置使用ToUnityTranslated函数获取,掌心方向量和掌心方向用ToUnity函数获取,否则掌心位置用ToUnity获取。

(1)如果轴名称为”水平“,则返回掌心位置的x轴值;
(2)如果轴名称为”垂直“,则返回掌心位置的y轴值;
(3)如果轴名称为”深度“,则返回掌心位置的z轴值;
(4)如果轴名称为”旋转“,则返回掌心法向量的x轴值的-2倍;
(5)如果轴名称为”倾斜“,则返回掌心法向量的z轴值;
(6)如果轴名称为”水平方向“,则返回掌心方向的x轴值;
(7)如果轴名称为”垂直方向“,则返回掌心方向的y轴值。

        如果scaled为真,将轴值截断至-1到1之间。

8. 在Car.js中调用pxsLeapInput

        GetHandAxis函数调用GetHandAxisPrivate函数时,scaled值置为真,所以返回值为1且掌心位置调用ToUnityTranslated函数。为了用Leap Motion输入覆盖键盘输入,需要在GetInput函数中修改。
if(LeapEnabled == true){
	throttle = pxsLeapInput.GetHandAxis("Depth") * forwardScale;
	steer = pxsLeapInput.GetHandAxis("Rotation");
	print("Throttle: " + throttle.ToString() + "Steer: " + steer.ToString());
}
else{
	throttle = Input.GetAxis("Vertical");
	steer = Input.GetAxis("Horizontal");
}
        和GetAxis类似,GetHandAxis的返回值变化范围为[-1,1]。同时为了避免直接覆盖键盘控制,添加LeapEnabled标志位选择Leap Motion输入是否使能。为了调整前进速度,添加forwardScale变量避免跑车加减速过快或过慢带来的不适。
public var LeapEnabled : boolean = false; 
public var forwardScale : float = 0.4;

9. 使能Leap Motion输入

       scaled变量创建时默认值为假,所以需要将Car物体右侧对应的脚本Car.js下的公有变量scaled打勾(置为真)。运行游戏即可用Leap Motion控制游戏。游戏操作的正确方式为:手心和手背以手臂为轴逆时针旋转为左转,反之顺时针旋转为右转,旋转时的静态角度代表跑车转动的幅值。手掌置于Leap Motion前方则第一视角与车头前进的方向相同,反之置于后方则第一视角与车头前进的方向相反(车尾前进,车体后退)。

10. Leap Motion输入介绍

        为了更好地用Leap Motion控制游戏,至少要知道我们用什么样的手势运动替换掉了水平轴和垂直轴的输入。所以,下面简单介绍用到的帧和手的数据结构以及手的数据结构对应的手的属性。
(1)数值单位
        距离:毫米;时间:毫秒;速度:毫米/秒;角度:弧度。
(2)帧
        帧的基本实体包括Hand,fingers和tools。controller.frame()获取当前帧;controller.frame(n)获取上n帧;frame.id()获取当前帧的整数型ID;Leap::Listener类中检测新帧到来的回调函数为onFrame(controller);frame.hand(id),frame.finger(id)和frame.tool(id)为获取当前ID的手,手指和工具数据。
(3)手
        获取手的方向时也用到x,y和z轴坐标,虽然经过ToUnity函数的转换(不清楚什么意思),但是我猜得到的还是roll,pitch和yaw值。不过用到手的方向时还是调用官方提供的roll(),pitch()和yaw()比较妥。手掌和手指的位置是相对于Leap Motion中心的全局坐标系的位置,每个地方有不同的RPY方向。有时虽然调用的函数相同,但继承函数所在的基类的对象不同,比如direction函数。P.S.下图为C++中的函数,仅供说明使用。

结语

        本篇主要描述如果用Leap Motion的输入来替换键盘的方向键,并没有深入Unity3D生成的游戏的代码,不过应该很多人会比笔者更了解Unity3D。鼠标和键盘对于二维平面操作要优于Leap Motion,因为Leap Motion在控制时很难令其中一维坐标保持不变,对于手来说很容易疲惫;而且二维操作在空中显然费力不讨好;但是对于三维平面操作,鼠标和键盘一定要结合起来用才行,Leap Motion只是提供了一种更加自然的操作方式。所以,在虚拟环境中绘制手模型,并以人眼为反馈作三维空间操作是可选的比较合理又自然的交互方式。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你好!要使用 Leap Motion 控制 Unity3D 模型,需要进行以下步骤: 1. 下载并安装 Leap Motion SDK,官方网站为:https://developer.leapmotion.com/sdk-leap-motion-controller/ 2. 在 Unity3D 中创建一个新项目。 3. 在 Unity3D 中导入 Leap Motion SDK。在 Unity3D 菜单栏中选择 Assets -> Import Package -> Custom Package,选择下载好的 Leap Motion SDK,点击 Import。 4. 创建一个空的 GameObject,并将 LeapHandController.cs 组件添加到它上面。 5. 在 Unity3D 中创建一个可移动的模型(例如一个球)。 6. 将 Leap Motion 势与模型控制器相连接。例如,当掌向上移动时,模型也向上移动。 7. 进行测试并调整模型控制器以实现更好的控制效果。 希望这些步骤能够帮助你完成 Leap Motion 控制 Unity3D 模型的任务! ### 回答2: Leap Motion是一种新型的势识别设备,可以跟踪人类部的运动。它可以让我们通过控制应用程序,游戏或模型等内容。在Unity3D中,我们可以将Leap Motion集成到场景中,以实现控制3D模型的效果。 首先,我们需要在Unity3D中安装Leap Motion SDK插件并导入我们想要使用的模型。然后,我们需要创建一个新的场景,将插件放置到场景中,并将其与Leap Motion设备连接。 随着Leap Motion设备的逐渐普及,越来越多的开发者开始使用它来实现控制3D模型。与传统的按键和鼠标控制方式相比,Leap Motion可提供更自然、更直观的交互方式。它可以识别多种势,如指移动、指握拳、势旋转、掌张开等等。通过合理地利用Leap Motion设备,我们可以实现更高效的用户体验。 然而,在使用Leap Motion进行控制时也有一些挑战。例如,用户的势可能存在较大的误差,需要进行预处理和处理以确保正确的交互响应。此外,用户可能存在势识别的困难,需要进行适当的训练和指导。 在实际开发过程中,我们可以通过官方提供的文档、示例和开发者社区进行学习和交流,以进一步了解如何使用Leap Motion控制Unity3D模型。无疑,Leap Motion可以为Unity3D开发者提供更多创新的机会,让我们拭目以待未来的发展。 ### 回答3: Leap Motion 是一款独具特色的人体工程学产品,能够通过传感器实现部及指的动作捕捉。而 Unity3D 是一款游戏引擎,能够让开发者创建出具有游戏性能力的应用程序,包括游戏和 VR 等领域。那么,如何将 Leap Motion 应用到 Unity3D 中,实现控制游戏模型呢? 首先,需要引入 Leap Motion SDK,并导入 Leap Motion 的插件。然后,通过调用 Leap Motion 提供的 API,可以获得部及指的数据信息,进而应用到游戏场景中。 其次,需要编写脚本,来实现控制游戏模型,例如移动、缩放、旋转等操作。比如,在控制旋转时,可以将指的旋转角度映射到游戏物体的旋转角度。 在应用 Leap Motion 控制 Unity3D 模型时,需要注意以下几点: 1. 必须保证 Leap Motion 传感器能够捕捉到势数据,并调整好传感器的摆放角度,以保证传感器能够准确地捕捉到势数据。 2. 需要通过调整脚本中的参数,来实现控制的精度和敏感度,以便让用户更加流畅地控制游戏模型。 3. 对于不同类型的游戏模型,需要编写不同的控制代码,以适应不同的游戏场景。 总之,Leap Motion 控制 Unity3D 模型的应用,可以给用户带来更加直观、丰富的游戏体验。随着技术的不断发展,我们可以期待 Leap MotionUnity3D 之间更多的结合,带来更好的用户体验和应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值