htc vive 中SteamVR Plugins入门之抓取物体、投掷

1、创建一个项目,删除掉maincamera,导入SteamVR的包,将teamVR拖进Hierarchy中,创建一个Planne和Sphere,将CameraRig拖动到Hierarchy视图中,SteamVR不用拖动,会自动生成

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第1张图片

2、调整小球的大小和位置,给小球添加一个Rigidbody,然后设置mass和drag

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第2张图片

3、点击Model,添加一个Collider

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第3张图片

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第4张图片

3、Edit-->Project Settings-->Time

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第5张图片

4、File --> Project Settings --> Physics

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第6张图片


5、抓取并投掷的脚本,将该脚本分别挂载到左右手柄的controller上就可以运行

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(SteamVR_TrackedObject))]

public class PickUp : MonoBehaviour {

    //追踪的手柄
    SteamVR_TrackedObject trackedObj;
    //获取输入事件
    SteamVR_Controller.Device device;
    public Transform sphere;

    // Use this for initialization
    void Start () {
        trackedObj = GetComponent();
        Debug.Log("Start....................................."+trackedObj.name);
    }
	
	// Update is called once per frame
	void Update () {
        //获取扳机键类型
        device = SteamVR_Controller.Input((int)trackedObj.index);
      
     }

 

    private void OnTriggerStay(Collider collider)
    {
        Debug.Log("OnTriggerStay.....................................");

        //抓取物体
        //触摸中
        if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger))
        {
            // 不受重力影响
            collider.attachedRigidbody.isKinematic = true;
            //将物体设置到父级上
            collider.gameObject.transform.SetParent(gameObject.transform);
            Debug.Log("GetTouch.....................................");
        }


        //松开物体
        if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger))
        {
            Debug.Log("GetTouchUp.....................................");
            // 受重力影响
            collider.attachedRigidbody.isKinematic = false;
            //将父级置为空
            collider.gameObject.transform.SetParent(null);
            //投掷物体
            tossObject(collider.attachedRigidbody);
        }
    }

    //物体投掷
    void tossObject(Rigidbody rigidbody)
    {
        //如果是起始位置,则设置为起始位置,否则设置为父类
        Transform origin = trackedObj.origin ? trackedObj.origin : trackedObj.transform.parent;

        //如果起始位置部位空
        if(origin != null)
        {
            //将局部坐标转换成世界坐标
            rigidbody.velocity = origin.TransformVector((device.velocity));
            rigidbody.angularVelocity = origin.TransformVector((device.angularVelocity));
        }
        else
        {
            //设置速度
            rigidbody.velocity = device.velocity;
            //设置角速度
            rigidbody.angularVelocity = device.angularVelocity;
        }
    }


    //重置小球
    private void Reset()
    {
        //扣动扳机键
        if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Touchpad))
        {
            //重置位置
            sphere.transform.position = Vector3.zero;
            //重置速度
            sphere.GetComponent().velocity = Vector3.zero;
            //重置角速度
            sphere.GetComponent().angularVelocity = Vector3.zero;
        }
    }

}


5、扣动手柄的扳机的时候抓住小球

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第7张图片

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第8张图片

6、松开扳机时松开物体

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第9张图片

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第10张图片


7、当松开扳机的同时投掷物体

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第11张图片

抛出去之前小球的位置:

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第12张图片

抛出去之后小球的位置

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第13张图片

















参考资料:http://www.taikr.com/course/432/task/8518/show#



一、视野中找不到手柄

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第14张图片

原因:1、手柄被隐藏掉了,没有激活

2、在unity5.6以上的版本需要添加Camera(eye)中添加两个脚本Steam VR_Update Poses和Steam VR_Camera

解决办法:选中手柄,勾选左右手柄Controller和Model前面的复选框

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第15张图片

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第16张图片

分别在搜索框中搜索“SteamVR_UpdatePoses”和“SteamVR_Camera”脚本,并添加给Camera(eye),再次运行手柄就可以被渲染上了

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第17张图片



二、其中一个手柄一直接触不到小球

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第18张图片

原因:Steam VR_Tracked Object中的Origin没有置为none

解决办法:

点击Controller,在Inspector面板找到Origin

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第19张图片

点击右侧的小圆圈,在弹出的窗口中选择“None”

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第20张图片

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第21张图片

再次运行就可以看到手柄可以正常使用了

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第22张图片


三、手柄接触小球后,OnTriggerStay函数没有被调用

原因:collider添加的位置有误。该方法被调用的前提:

  1. 确保两个物体都有碰撞器,且有一个勾选了触发器

  2. 确保至少有一个物体有刚体


解决方法:

原来脚本挂载的位置在model上,位置不对,正确设置小球和手柄后,创建的抓取物体的脚本挂载到Controller上就可以了:

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第23张图片


正确的做法是:

小球添加一个Collider,但是isTrigger没有勾选,并且添加一个rigidbody

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第24张图片

左右手柄的controller分别添加一个collider,并且勾选中trigger

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第25张图片

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第26张图片

model不添加collider和rigidbody组件

htc vive 中SteamVR Plugins入门之抓取物体、投掷_第27张图片

你可能感兴趣的:(htc vive 中SteamVR Plugins入门之抓取物体、投掷)