VR第一天

1 使用准备

在这里插入图片描述
注意:删除主相机,添加 VR 相机 [CameraBig]
1.更换手柄模型
a.将模型设置为Controller(left/right)的子物体,并且调节大小。
b.如果不需要手柄模型,可以将Model屏蔽掉。

2 监听手柄事件

2.1 StreamVR 原生方式

1.StreamVR 原生方式:
获取手柄上的Object组件,用于获取设备索引
根据索引获取到设备的引用
监听设别的按钮状态
通过GetTouch GetPress实现
按钮种类:
TouchPad:圆盘
Trigger:扳机
ApplicationMenu:菜单
Grip:两侧按钮

2.2 VRKT插件方式

手柄挂载VRTK_ControllerEvents组件,用于监听手柄按钮事件

 i. GetComponent<VRTK_ControllerEvents>().TouchpadAxisChanged += new ControllerInteractionEventHandler(OnTouchpadAxisChanged);

3 实现功能

3.1 物品拾取

1.设为子物体方式
通过固定关节(Fixed Joint)实现
2 VRTK
a. 手柄添加VRTK_ControllerEvents 监听事件
b. VRTK_Interact Grab 拾取功能
c. 被拾取物体挂载 VRTK_Interactable Object 组件 并且勾选Is Gradable 选项

3.2 移动

1.Translate
2.瞬移
1VRTK_ControllerEvents 监听事件
直线: VRTK_SimplePointer
贝泽尔曲线: VRTK_Bezier Pointer
2给瞬移对象Camera添加 VRTK_Basic TelePort 没有高低差变化
VRTK_Height Adjust Teleport 有高低差变化

3.3 UI控制

a. Canvas RenderMode 为 World
b. 画布的Scale调节为0.03
c. 手柄挂载脚本
VRTK_ControllerEvents
VRTK_SimplePonter
VRTK_UIPointer

4 实例应用

4.1 拾取物品 抛出物品 移动

    //放在ControllerLeft 上
    public class SteamVRCtrlListener : MonoBehaviour
    {
      private  SteamVR_TrackedObject  tObje;             //获取组件,提供索引
      private  FixedJoint joint;                                        //固定关节
      public  Transform  eyeCamera;
      void Start()
      {tObje = GetComponent<SteamVR_TrackedObject>();
       joint   = GetComponent<FixedJoint>();
      }
      void Update()
      {
       var dev = SteamVR_Controller.Input( (int) tObject.index  ); //根据索引获取设备
   
       //GetTouch 既可以监听触摸也可以监听按下
       //if ( dev.GetTouch ( SteamVR_Controller.ButtonMask.Touchpad )   ) 
       //{ debug.log(dev.GetAxis()  + "触摸圆盘"  ); }

       //GetPress  只监听按下
       //if ( dev.GetPress ( SteamVR_Controller.ButtonMask.Trigger )  )
       //{ Debug.log("按下扳机")  }

       if ( dev.GetPressUp( SteamVR_Controller.Button.Grip  ) )   //两侧按钮   抛出物品方法
       {
            if ( grabObj  != null )
             {
                  //grabObj.SetParent ( null )   方法1
                  joint.ConnectedBody = null    方法2
                  
                  grabObj.GetComponent<Rigidbody>().useGravity  = true;  //添加重力,并添加向前力
                  grabObj.GetComponent<Rigidbody>().AddForce( transform.forward *50, ForceMode.Impulse )
                  grabObj = null;  //手里置为空
             }
        }
 
       if ( dev.GetTouch( SteamVR_Controller.Button.Touchpad  ) )    //移动位置
       {
            float  x  = dev.GetAxis().x;
            float  y  = dev.GetAxis().y;
            Vector3  dirForward  = new Vector3( eyeCamera.forward.x, 0, eyecamera.z );
            transform.parent.Translate( dirForward * 10 * Time.deltaTime * y, Space.World);
             Vector3 dirRight      =  new Vector3( eyeCamera.right.x, 0, eyeCamera.right.z);
            tran slate(dirRight * 10 * Time.deltaTime * x,Space.World);
      }
     }
     Transform  graObj = null;
     void  OnTriggerStay( Collider  c)                        //拾取物品的2种方法
     {   
           if (grabObj != null) return;                       //如果手里有东西,不能抓取
           var dev  = SteamVR_Controller.Input ( (int) tobj.index  );
           if( dev.GetPressDown ( SteamVr_Controller.ButtonMask.Grip) )
           {
                  c.GetComponent<Rigibody>().useGravity = false;     //重力效果取消
                  // c.transform.SetParent ( tranform);              //方法1  父子层级方式
                  joint.connectedBody = c.GetComponent<Rigibody>();  //方法2 connectedBody
                  grabObj = c.transform;
 
           }
     }  
   }

4.2 射线移动

   public class ARCTel :MonoBehaviour
   {
     public SeamVR_TrackedObject  obj;
     public  LineRender line;
     private Ray ray;
     private RaycastHit hit;
   void Update()
   {
    var dev = SteamVR_Controller.Input( (int)obj.index )
    if ( dev.GetPress ( SteamVR_Controller.ButtonMask.Touchpad ))
    {
       line.enable = true;
       ray = new Ray(transform.position,  transform.forward);  //从手柄向前发射一条射线 ray
       if (Physics.Raycast(ray, out hit)) 
            {
                //绘制lineRender
                line.SetPosition(0, transform.position);
                line.SetPosition(1, hit.point);
            }
       else {
                line.SetPosition(0, transform.position);
                line.SetPosition(1, transform.forward * 100);
            }
    }
    if ( dev.GetPressUp(SteamVR_Controller.ButtonMask.Touchpad ) )
    {
       line.enabled = false;   //鼠标抬起,光线隐藏
       transform.parent.position = hit.point;   //移动父类,也就是Camera
    }
}
}

4.3 手柄按钮的监听

   public class VRTKCtrlListener : MonoBehaviour 
   {
    void  Start()
    {
     GetComponent<VRTK_ControllerEvents >().TouchpadAxisChanged +=
       new ControllerInteractionEventHandler ( OnTouchpadAxisChanged );
    }
    private void OnTouchpadAxisChanged ( object sender, ControllerInteractionEventArgs e )
    {
       Debug.Log(e.touchpadAxis);
    }
   }

4.4 开关门的实现

VRTK实现
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值