HTC VIVE开发笔记(一)使用SteamVR插件进行基本的交互
2017-10-29 15:08
351 查看
1、获取手柄的引用:目前没有区分左右手柄
private SteamVR_TrackedObject trackedobj;
private SteamVR_Controller.Device device;
trackedobj = GetComponent<SteamVR_TrackedObject>();
device = SteamVR_Controller.Input((int)trackedobj.index);
之后应该是可以通过判断这个index来判断是哪一个手柄吧。SteamVR中把所有可以追踪的设备都保存在了这个TrackedObject类里,通过GetComponet方法,就能获取到当前追踪到的物体,并获取到手柄的输入(在Update方法中进行,这样才能一直更新,否则如果是在Start方法中获取的输入,就只有第一次保存的device可以来与物体进行交互)。之后的操作都是基于这个device来做了。
2、获取touch pad的坐标
device.GetAxis().x
device.GetAxis().y
3、监听Trigger有没有被按下,或松开
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))GetPressDown方法将返回一个布尔值,同理,松开为,GetPressUp.
ButtonMask这里也就类似键盘的判断了,可以修改为手柄上不同按键的名称,来进行相应的判断和处理。
4、用手柄抓取和松开Cube的流程
首先要给手柄和要抓取的物体都加上一个Collider。将手柄的Collider的isTrigger勾上,这时候其实手柄并不是一个碰撞体了,感觉就有点像是一个虚的东西,只是作为一个监听触发事件的物体。
遇到一个很愚蠢的问题,就是如何来调整Collider的大小,因为在Scene下面看不见手柄的模型,那么我是这么做的,开始play,然后看到手柄后暂停游戏,回到Scene模式下,并根据手柄大小调节Collider,记录一下参数。然后停止游戏,把参数改了。就酱。
然后来看看用到的一些函数。
private void OnTriggerEnter(Collider other)
当碰撞体other进入到了当前的Trigger里时,这个Enter方法被调用。这里要把这个collider的transform.gameObject保存下来。
interactBox = other.transform.gameObject;
TODO:弄清楚Collider.transform.gameObject和Collider.gameObject有啥区别,为啥不能直接保存other.gameObject
当碰撞体离开Trigger时(OnTriggerExit),把interactBox清空。
进行抓取操作,并使得抓取到的物体绑在手柄下,跟着手柄的变化而变化。就是要把这个collider节点绑在父节点(手柄)下。
//获取trigger键是否按下
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
{
Debug.Log("Trigger down");
if (interactBox != null)
{
interactBox.transform.parent = transform;
Rigidbody rig = interactBox.GetComponent<Rigidbody>();
rig.useGravity = false;
rig.isKinematic = true;
}
}
//获取trigger键是否松开
if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))
{
Debug.Log("Trigger up");
interactBox.transform.parent = null;
Rigidbody rig = interactBox.GetComponent<Rigidbody>();
rig.useGravity = true;
rig.isKinematic = false;
}因为是Unity新手,一开始不太理解,这里的transform为什么就是手柄的transform。。因为这个脚本是绑在手柄下面的,相当于就是一个类吧,transform就是其中的一个成员,就可以直接这么访问了。
通过interactBox.transform.parent = transform;将碰撞到的物体的变换矩阵绑到父节点的变换矩阵下。接着修改一些刚体的参数。
通过今天的学习,对Unity以及Htc vive的开发又熟悉了一点。
private SteamVR_TrackedObject trackedobj;
private SteamVR_Controller.Device device;
trackedobj = GetComponent<SteamVR_TrackedObject>();
device = SteamVR_Controller.Input((int)trackedobj.index);
之后应该是可以通过判断这个index来判断是哪一个手柄吧。SteamVR中把所有可以追踪的设备都保存在了这个TrackedObject类里,通过GetComponet方法,就能获取到当前追踪到的物体,并获取到手柄的输入(在Update方法中进行,这样才能一直更新,否则如果是在Start方法中获取的输入,就只有第一次保存的device可以来与物体进行交互)。之后的操作都是基于这个device来做了。
2、获取touch pad的坐标
device.GetAxis().x
device.GetAxis().y
3、监听Trigger有没有被按下,或松开
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))GetPressDown方法将返回一个布尔值,同理,松开为,GetPressUp.
ButtonMask这里也就类似键盘的判断了,可以修改为手柄上不同按键的名称,来进行相应的判断和处理。
4、用手柄抓取和松开Cube的流程
首先要给手柄和要抓取的物体都加上一个Collider。将手柄的Collider的isTrigger勾上,这时候其实手柄并不是一个碰撞体了,感觉就有点像是一个虚的东西,只是作为一个监听触发事件的物体。
遇到一个很愚蠢的问题,就是如何来调整Collider的大小,因为在Scene下面看不见手柄的模型,那么我是这么做的,开始play,然后看到手柄后暂停游戏,回到Scene模式下,并根据手柄大小调节Collider,记录一下参数。然后停止游戏,把参数改了。就酱。
然后来看看用到的一些函数。
private void OnTriggerEnter(Collider other)
当碰撞体other进入到了当前的Trigger里时,这个Enter方法被调用。这里要把这个collider的transform.gameObject保存下来。
interactBox = other.transform.gameObject;
TODO:弄清楚Collider.transform.gameObject和Collider.gameObject有啥区别,为啥不能直接保存other.gameObject
当碰撞体离开Trigger时(OnTriggerExit),把interactBox清空。
进行抓取操作,并使得抓取到的物体绑在手柄下,跟着手柄的变化而变化。就是要把这个collider节点绑在父节点(手柄)下。
//获取trigger键是否按下
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
{
Debug.Log("Trigger down");
if (interactBox != null)
{
interactBox.transform.parent = transform;
Rigidbody rig = interactBox.GetComponent<Rigidbody>();
rig.useGravity = false;
rig.isKinematic = true;
}
}
//获取trigger键是否松开
if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))
{
Debug.Log("Trigger up");
interactBox.transform.parent = null;
Rigidbody rig = interactBox.GetComponent<Rigidbody>();
rig.useGravity = true;
rig.isKinematic = false;
}因为是Unity新手,一开始不太理解,这里的transform为什么就是手柄的transform。。因为这个脚本是绑在手柄下面的,相当于就是一个类吧,transform就是其中的一个成员,就可以直接这么访问了。
通过interactBox.transform.parent = transform;将碰撞到的物体的变换矩阵绑到父节点的变换矩阵下。接着修改一些刚体的参数。
通过今天的学习,对Unity以及Htc vive的开发又熟悉了一点。
相关文章推荐
- HTC VIVE开发笔记(四)Interaction System插件手柄交互基础
- 使用VBA进行WPS插件开发[用VB开发]
- 微软企业库4.1学习笔记(十四)缓存模块2 使用缓存模块进行开发
- 使用TextMate进行Ruby On Rails开发推荐插件
- accp6.0 《使用javascript增强交互效果》学习笔记ch6 表单基本验证技术
- wpf中使用MVVM模式进行开发,View与ViewModule的交互个人总结
- SVN最新可视化版本库安装和Eclipse中使用SVN插件进行团队开发
- 使用VS2008进行3DS Max2010 SDK插件开发(环境配置)
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的基本操作
- (android 互联网开发)2 访问https接口,进行数据交互(已在实际项目中使用)
- 三步实现Eclipse中使用SVN插件进行团队开发和SVN最新可视化版本库安装
- 使用Eclipse插件EGit进行Git代码托管和协同开发教程
- 在Eclipse中使用RDT插件进行Ruby开发(1)
- 微软企业库4.1学习笔记(十四)缓存模块2 使用缓存模块进行开发
- 微软企业库4.1学习笔记(十四)缓存模块2 使用缓存模块进行开发
- 在Eclipse中使用RDT插件进行Ruby开发(3)
- 使用VS进行3DS MAX SDK插件开发之一---- 配置入门及Sample篇
- SVN最新可视化版本库安装和Eclipse中使用SVN插件进行团队开发
- 使用MMTools进行音频开发笔记(一)
- 如何在Eclipse中使用Ruby开发工具(RDT)插件进行Ruby开发