热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity3D学习笔记(三十八):VR开发

设备安装:HTCView驱动安装:Steam-SteamVR设备激活Unity开发下载安装开发包Ass
设备安装:HTC View
 
驱动安装:Steam - SteamVR

设备激活

Unity开发
下载安装开发包
Asset Store - SteamVR Plugin
SteamVRDemo1-镜头
SteamVRDemo2-交互场景
Demo1-交互基础部分
手柄按键
正面:
----系统
----触控盘(半径为1的二维坐标)
----手柄开关(单击激活,长按关闭)
侧面:
----侧面按键
背面:
----扳机键
 
场景摄像头设置
Camera添加SteamVR组件,即可完成头戴摄像机功能
按键输入设置
手部设备
代码逻辑
创建枚举类型,区分左右手柄
双手武器,需要获取另外一只手的引用
/// 
/// 手柄类型 用于初始化手柄设备
/// 
public HandType handType = HandType.LeftHand;
// 手上拿的武器是单手还是双手的
public ItemPackage.ItemPackageType itemType = ItemPackage.ItemPackageType.OneHanded;
public HandDevice otherHand = null;
/// 
/// 控制手柄的设备
/// 
public SteamVR_Controller.Device controller;
SteamVR_Controller类
通用按键(通过枚举类型和键值控制相应按键)
public bool GetPress(ulong buttonMask) { Update(); return (state.ulButtonPressed & buttonMask) != 0; }
public bool GetPressDown(ulong buttonMask) { Update(); return (state.ulButtonPressed & buttonMask) != 0 && (prevState.ulButtonPressed & buttonMask) == 0; }
public bool GetPressUp(ulong buttonMask) { Update(); return (state.ulButtonPressed & buttonMask) == 0 && (prevState.ulButtonPressed & buttonMask) != 0; }


public bool GetPress(EVRButtonId buttonId) { return GetPress(1ul <<(int)buttonId); }
public bool GetPressDown(EVRButtonId buttonId) { return GetPressDown(1ul <<(int)buttonId); }
public bool GetPressUp(EVRButtonId buttonId) { return GetPressUp(1ul <<(int)buttonId); }

触控盘(方法,枚举,轴值)

public bool GetTouch(ulong buttonMask) { Update(); return (state.ulButtonTouched & buttonMask) != 0; }
public bool GetTouchDown(ulong buttonMask) { Update(); return (state.ulButtonTouched & buttonMask) != 0 && (prevState.ulButtonTouched & buttonMask) == 0; }
public bool GetTouchUp(ulong buttonMask) { Update(); return (state.ulButtonTouched & buttonMask) == 0 && (prevState.ulButtonTouched & buttonMask) != 0; }

public bool GetTouch(EVRButtonId buttonId) { return GetTouch(1ul <<(int)buttonId); }
public bool GetTouchDown(EVRButtonId buttonId) { return GetTouchDown(1ul <<(int)buttonId); }
public bool GetTouchUp(EVRButtonId buttonId) { return GetTouchUp(1ul <<(int)buttonId); }

public Vector2 GetAxis(EVRButtonId buttOnId= EVRButtonId.k_EButton_SteamVR_Touchpad)
{
       Update();
       var axisId = (uint)buttonId - (uint)EVRButtonId.k_EButton_Axis0;
       switch (axisId)
       {
              case 0: return new Vector2(state.rAxis0.x, state.rAxis0.y);
              case 1: return new Vector2(state.rAxis1.x, state.rAxis1.y);
              case 2: return new Vector2(state.rAxis2.x, state.rAxis2.y);
              case 3: return new Vector2(state.rAxis3.x, state.rAxis3.y);
              case 4: return new Vector2(state.rAxis4.x, state.rAxis4.y);
       }
       return Vector2.zero;
}
震动方法,只有触控盘和侧面按键有
public void TriggerHapticPulse(ushort duratiOnMicroSec= 500, EVRButtonId buttOnId= EVRButtonId.k_EButton_SteamVR_Touchpad)
{
       var system = OpenVR.System;
       if (system != null)
       {
              var axisId = (uint)buttonId - (uint)EVRButtonId.k_EButton_Axis0;
              system.TriggerHapticPulse(index, axisId, (char)durationMicroSec);
       }
}

扳机键(方法,枚举,轴值)

public float hairTriggerDelta = 0.1f; // amount trigger must be pulled or released to change state
float hairTriggerLimit;
bool hairTriggerState, hairTriggerPrevState;
void UpdateHairTrigger()
{
       hairTriggerPrevState = hairTriggerState;
       var value = state.rAxis1.x; // trigger
       if (hairTriggerState)
       {
              if (value 0.0f)
                     hairTriggerState = false;
       }
       else
       {
              if (value > hairTriggerLimit + hairTriggerDelta || value >= 1.0f)
                     hairTriggerState = true;
       }
       hairTriggerLimit = hairTriggerState ? Mathf.Max(hairTriggerLimit, value) : Mathf.Min(hairTriggerLimit, value);
}
public bool GetHairTrigger() { Update(); return hairTriggerState; }
public bool GetHairTriggerDown() { Update(); return hairTriggerState && !hairTriggerPrevState; }
public bool GetHairTriggerUp() { Update(); return !hairTriggerState && hairTriggerPrevState; }
侧面按键(枚举)
 
Demo2-交互升级部分-射击
private void InputDebug()
    {
        if (cOntroller== null) return;
        // 按扳机键
        if (controller.GetPressDown(EVRButtonId.k_EButton_SteamVR_Trigger)
            || controller.GetPressDown(EVRButtonId.k_EButton_Axis1))
        {
            Debug.Log("按下扳机键");
            GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            obj.transform.localScale = Vector3.one * 0.1f;
            obj.transform.position = transform.position;
            Rigidbody rig = obj.AddComponent();
            rig.AddForce(transform.forward * 400f);
            Destroy(obj, 2f);
        }
        //if (controller.GetTouch(EVRButtonId.k_EButton_Axis0))
        //{
        //    Debug.Log("接触了触控盘");
        //}
        if (controller.GetPressDown(EVRButtonId.k_EButton_SteamVR_Touchpad)
            || controller.GetPressDown(EVRButtonId.k_EButton_Axis0))
        {
            Debug.Log("按下触控盘");
        }
        // 获得触控盘轴值 轴值在半径为1的圆上
        Vector2 touchPad = controller.GetAxis();
        if (touchPad != Vector2.zero)
        {
            Debug.Log("touchPad : " + touchPad);
            GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            obj.transform.localScale = Vector3.one * 0.01f;
            obj.transform.position = new Vector3(touchPad.x, 0, touchPad.y);
        }
        if (controller.GetPressDown(EVRButtonId.k_EButton_Grip))
        {
            Debug.Log("Grip...侧面按键被按下");
            StartCoroutine(TriggerHapticPulse());
        }
    }
 
VR界面UI
世界坐标系,画布渲染模式改成世界空间
UI都需要改成3D的

 


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文介绍了一种根据用户选择动态切换屏幕界面的方法,通过定义不同的选择块(Selection Block),实现灵活的用户交互体验。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 深入理解Shell脚本编程
    本文详细介绍了Shell脚本编程的基础概念、语法结构及其在操作系统中的应用。通过具体的示例代码,帮助读者掌握如何编写和执行Shell脚本。 ... [详细]
author-avatar
hqgj15087878726
缅甸环球国际开户:15087878726游戏网址:www.6662016.com
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有