Steam VR虚拟现实手柄交互

版权声明:请尊重原劳动成果 https://blog.csdn.net/qq_39646949/article/details/86355472

Steam VR虚拟现实手柄交互功能总结
1、使用硬件。
HTC VIVE
高端VR头显(配合电脑使用)
Vive头戴式设备×1、三合一连接线×1、音频线×1、耳塞式耳机×1、面部衬垫×2、清洁布×1、串流盒×1、电源适配器×1HDMI连接线×1、固定贴片×1、Vive操控手柄×2、电源适配器×2、挂绳×2、Micro-USB数据线×2、激光定位器×2、电源适配器×2、安装工具包×1、同步数据线×1、安装U盘(16GB)、
2、使用插件。
SteamVR_Unity_Toolkit+SteamVR Plugin;
3、行走区域设置。
3.1偷懒,个人喜欢010_CameraRig_TerrainTeleporting里面的[CameraRig]。
在这里插入图片描述
3.2复制一个出来,到新场景去。
3.3新场景外加一个plan,带有碰撞器,就可以自由在场景里面来回行走了。
4、类似手柄抓取物体等交互功能,配置场景里面都有相应的案例,可以对照着修改,不过我更喜欢弄点自己开发的东西。
5、VR手柄震动
public SteamVR_TrackedObject tracker;//左手柄;
private SteamVR_Controller.Device device
{
get
{
return (SteamVR_Controller.Input((int)tracker.index));
}
}
bool IsShock = false; //布尔型变量IsShock
public void StartShake()
{
IsShock = false; //每次按下,IsShock为false,才能保证手柄震动
StartCoroutine(“Shock”, 0.5f); //开启协程Shock(),第二个参数0.5f 即为协程Shock()的形参
}
//定义了一个协程
IEnumerator Shock(float durationTime)
{
//Invoke函数,表示durationTime秒后,执行StopShock函数;
Invoke(“StopShock”, durationTime);
//协程一直使得手柄产生震动,直到布尔型变量IsShock为false;
while (!IsShock)
{
device.TriggerHapticPulse(1500);
yield return new WaitForEndOfFrame();
}
}

public void StopShock()
{
    IsShock = true; //关闭手柄的震动
}

5、VR手柄抓取物体
public GameObject wuTi;
void Update ()
{
//抓取物体
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger) == true)
{
wuTi.transform.parent = this.transform;
wuTi.GetComponent().useGravity = false;
}
//物体掉落
if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger) == true)
{
wuTi.transform.parent = null;
wuTi.GetComponent().useGravity = true;
wuTi.GetComponent().isKinematic = false;
}
}
}
5、VR手柄圆盘分成左、右、左下、右下4象限。
void Update()
{
if (StartRound)
{
Round();
}
}
public void Round()
{
#region 触摸
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Touchpad))
{
Vector2 cc = device.GetAxis();
float angle = VectorAngle(new Vector2(1, 0), cc);
//下
if (angle > 45 && angle < 135)
{
//Debug.Log(“下”);
}
//上
else if (angle < -45 && angle > -135)
{
//Debug.Log(“上”);
}
//左
else if ((angle < 180 && angle > 135) || (angle < -135 && angle > -180))
{
//Debug.Log(“左”);
}
//右
else if ((angle > 0 && angle < 45) || (angle > -45 && angle < 0))
{
//Debug.Log(“右”);
}

    }
    if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Touchpad))
    {
        Debug.Log("抬起");
    }
        #endregion

        #region 按下
        if (device.GetPress(SteamVR_Controller.ButtonMask.Touchpad))
    {
        Vector2 cc = device.GetAxis();
        float angle = VectorAngle(new Vector2(1, 0), cc);
        //下    
        if (angle > 45 && angle < 135)
        {
                      //Debug.Log("下");         
        }
        //上      
        else if (angle < -45 && angle > -135)
        {
            //Debug.Log("上");    
        }
        //左      
        else if ((angle < 180 && angle > 135) || (angle < -135 && angle > -180))
        {
            //Debug.Log("左");    
        }
        //右      
        else if ((angle > 0 && angle < 45) || (angle > -45 && angle < 0))
        {
            //Debug.Log("右");    
        }
    }
    #endregion
}
/// 根据在圆盘才按下的位置,返回一个角度值    
float VectorAngle(Vector2 from, Vector2 to)
{
    float angle;
    Vector3 cross = Vector3.Cross(from, to);
    angle = Vector2.Angle(from, to);
    return cross.z > 0 ? -angle : angle;
}

6、VR手柄发射线,与UI交互。
public LineRenderer Line;
void Update ()
{
Ray ray = new Ray(transform.position,transform.forward);
RaycastHit hit;
if (Physics.Raycast(ray,out hit))
{
Line.SetVertexCount(2);
Line.SetPositions(new Vector3[] { transform.position,hit.point});
if (hit.collider.name == “XXX”)
{
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger) == true)
{
}
if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger) == true)
{
}
}
}

7、VR物体高亮
7.1推荐一款插件,HighlightingSystem,非常实用,而且简单好用。
7.2一个HighlightingEffect需要挂载在摄像机上面,用来渲染,一个 HighlightableObject脚本用来显示边缘发光,哪一个物体需要边缘发光,就可以把该脚本挂载在那一个物体上面,然后调用里面的方法就可以实现了。
public class Test : MonoBehaviour
{
public HighlightableObject ho;
void Start()
{
ho.FlashingOn(Color.red, Color.blue);
}
}
就这样就可以实现从red到blue闪烁的效果

8、VR手柄模型变成诸如双手、灭火器等模型
8.1将双手、灭火器等模型放在Controller (left)、Controller (right)层级下即可,让他们和Model都处于同一级。
8.2记得将Model隐藏。

9、VR手柄交互还有好多精彩的内容,比如说如何模拟搬动现实的操作台把手,控制机器运转等,总之,虚拟现实行业发展如何,很大程度上还得看VR有关系列硬件发展如何,精彩内容后续再添加,今天先写到这里,Good Night,Sweet Dream!

猜你喜欢

转载自blog.csdn.net/qq_39646949/article/details/86355472