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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/nicolelili1/article/details/73695235

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


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


3、点击Model,添加一个Collider



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


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



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<SteamVR_TrackedObject>();
        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<Rigidbody>().velocity = Vector3.zero;
            //重置角速度
            sphere.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
        }
    }

}


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



6、松开扳机时松开物体




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


抛出去之前小球的位置:


抛出去之后小球的位置


















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



一、视野中找不到手柄


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

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

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



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




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


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

解决办法:

点击Controller,在Inspector面板找到Origin


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



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



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

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

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

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


解决方法:

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



正确的做法是:

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


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



model不添加collider和rigidbody组件


展开阅读全文

没有更多推荐了,返回首页