VR手柄的绘制
/*
* Author : shenjun
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
/// <summary>
/// 实现手柄的绘制
/// </summary>
[RequireComponent(typeof(SteamVR_RenderModel))]
public class HandTest : MonoBehaviour {
public enum HandType
{
LeftHand,
RightHand,
}
public HandType handType = HandType.RightHand;
uint index; // 设备索引值
SteamVR_Controller.Device controller; // 控制手柄
SteamVR_Events.Action newPosAction; // 手柄位置更新
void Awake()
{
newPosAction = SteamVR_Events.NewPosesAction(OnNewPos); // 创建位置更新对象
}
void OnEnable()
{
newPosAction.enabled = true; // 绑定位置更新回调方法
}
void OnDisable()
{
newPosAction.enabled = false; // 解除位置更新回调方法的绑定
}
IEnumerator Start()
{
while (controller == null)
{
yield return new WaitForSeconds(1.0f);
var system = OpenVR.System;
if (system != null)
{
if (handType == HandType.LeftHand)
{
index = system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
}
else
{
index = system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.RightHand);
}
if (index == OpenVR.k_unTrackedDeviceIndexInvalid)
{
continue;
}
SetDeviceIndex((int)index);
}
}
}
/// <summary>
/// 设置设备的索引
/// </summary>
/// <param name="index"></param>
private void SetDeviceIndex(int index)
{
if (controller == null)
{
controller = SteamVR_Controller.Input(index);
SteamVR_RenderModel r = GetComponent<SteamVR_RenderModel>();
if(r)
{
r.SetDeviceIndex(index);
}
}
}
/// <summary>
/// 设备位置更新
/// </summary>
/// <param name="poses"></param>
private void OnNewPos(TrackedDevicePose_t[] poses)
{
if (index == OpenVR.k_unTrackedDeviceIndexInvalid) return;
if (index >= poses.Length) return;
if(poses[index].bDeviceIsConnected && poses[index].bPoseIsValid)
{
var pos = new SteamVR_Utils.RigidTransform(poses[index].mDeviceToAbsoluteTracking);
transform.localPosition = pos.pos;
transform.localRotation = pos.rot;
}
}
}