当前位置:网站首页>[转]SteamVR 1.x️一、实现手与物体交互——基于[CameraRig]
[转]SteamVR 1.x️一、实现手与物体交互——基于[CameraRig]
2023-01-19 15:24:15【小小姑娘很大】
目录
* 实现目标:
手柄碰触盒子时,扣动扳机键,拿起盒子(Cube)。松开扳机键,放下盒子
a、获取手柄引用
b、手柄与Box的碰撞检测
c、获取按钮事件
d、抓取:Box作为手柄transform的子物体,失去rigibody相关属性
e、松开:Box的parent为空,重新获取自身rigibody相关属性
* 实现步骤
1、导入SteamVR SDK
2、删掉原Camera,拖入[CameraRig]、新建盒子、地面
可调整头部大小:[CameraRig]——SteamVR_PlayArea——Size
3、获取手柄引用
该脚本挂在右手上,即Controller (right)

private SteamVR_TrackedObject trackedObject;
private SteamVR_Controller.Device device;
// Use this for initialization
void Start () {
trackedObject = GetComponent<SteamVR_TrackedObject>();
device = SteamVR_Controller.Input((int)trackedObject.index);
}
4、手柄与Box的碰撞检测
给两个Controller添加Sphere Collider,Collider并稍微缩小到合适大小,勾选Is Trigger,给盒子添加Rigidbody

private void OnTriggerEnter(Collider other){ }
private void OnTriggerExit(Collider other){ }
5、获取按钮事件
void Update () {
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad)){ }
if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger)){ }
}
6、手柄震动
device.TriggerHapticPulse(700);7、抓取和松开事件的实现
改变cube的父物体对象,改变cube是否使用重力和动力学Is Kinematic
Is Kinematic:是否开启动力学,开启则游戏不再受物理引擎影响,只受transform影响
全代码展示:
using UnityEngine;
public class MyController: MonoBehaviour {
SteamVR_TrackedObject trackedObject;
SteamVR_Controller.Device device;
//获取到的碰撞到的box
GameObject interactBox;
// Use this for initialization
void Start()
{
trackedObject = GetComponent<SteamVR_TrackedObject>();
device = SteamVR_Controller.Input((int)trackedObject.index);
}
void Update()
{
//按下Trigger键
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
{
if (interactBox != null)
{
interactBox.transform.parent = transform;
interactBox.GetComponent<Rigidbody>().useGravity = false;
interactBox.GetComponent<Rigidbody>().isKinematic = true;
}
}
//松开Trigger键
if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))
{
if (interactBox != null)
{
interactBox.transform.parent = transform.parent.parent;
interactBox.GetComponent<Rigidbody>().useGravity = true;
interactBox.GetComponent<Rigidbody>().isKinematic = false;
interactBox = null;
}
}
}
void OnTriggerEnter(Collider other)
{
interactBox = other.transform.gameObject;
}
void OnTriggerExit(Collider other)
{
interactBox = null;
}
void OnTriggerStay(Collider other)
{
if (device != null)
{
//触发震动
device.TriggerHapticPulse(700);
}
}
}
大
边栏推荐
猜你喜欢
随机推荐
- uni-app 178添加背景提示音(二)
- uni-app 181查看好友朋友圈完善(二)
- uni-app 180查看好友朋友圈完善(一)
- uni-app 176添加背景提示音(一)
- uni-app 175app端兼容处理(二)
- 关于双碳中的一些单位换算
- OpenMP 环境变量使用总结
- TiCDC 源码阅读(三)TiCDC 集群工作过程解析
- OpenMP 环境变量使用总结
- Inside OpenStack Technology
- MapReduce 实验:二次排序
- scrapy框架利用crawlspider全站爬取招聘信息
- scrapy爬虫框架全栈爬取招聘所有数据3000多条记录
- scrapy爬虫框架介绍与实战
- MeterSphere使用beanshell全局断言解决引用JSONObject问题
- 多种汉语方言语音落地应用,微软智能语音解锁更多交互场景
- 超越TensorFlow?Yann LeCun:“Why? PyTorch. That's why.”
- CTA-敏感行为-AppOps方案
- 年金保险排名前十的保险是哪个,安全吗
- 支付宝的年金保险值得入手吗?安全吗?
- 负电压是怎么产生的原理分析
- 迟滞比较器Hysteresiswindow和comparator(窗口比较器)原理
- 残留物与电子PCBA 的可靠性和三防漆涂敷前后可能导致电路板出现故障的变量
- 京东探索研究院 | 2023年十大科技趋势
- A variety of Chinese dialect voice landing applications, Microsoft's intelligent voice unlocks more interactive scenarios
- Is Alipay's annuity insurance worth buying?is it safe?
- Which is the top ten insurance for annuity insurance? Is it safe?
- Use MeterSphere beanshell global assertion reference JSONObject solution
- CNN+LSTM+Attention实现时间序列预测(PyTorch版)
- WebView加载heml代码简单应用
- CTA-Sensitive Behavior-AppOps Solution
- Beyond TensorFlow?Yann LeCun: "Why? PyTorch. That's why."
- 蜻蜓安全工作台程序编排简要说明
- WSL2安装systemd方法
- 安信证券开户安全吗?佣金是万几?
- 大智慧在上面开户安全吗?谁能告诉我一下
- 从合并石子学区间DP
- Golang的基本数据类型-基本使用
- 线扫相机DALSA--卡间同步
- 海康visionmaster-图像Bitmap和CmvdImage互转的方法



