/****************************************************************************
* Copyright 2019 Nreal Techonology Limited. All rights reserved.
*
* This file is part of NRSDK.
*
* https://www.nreal.ai/
*
*****************************************************************************/
namespace NRKernal
{
#if UNITY_EDITOR
using UnityEngine;
public class NREmulatorHeadPose : MonoBehaviour
{
private GameObject m_CameraTarget;
/// regular speed.
public float HeadMoveSpeed = 1.0f;
/// How sensitive it with mouse.
public float HeadRotateSpeed = 1.0f;
public Pose headPose { get; private set; }
private float m_HeadRotationLerpSpeed = 5f;
private void Start()
{
DontDestroyOnLoad(this);
if (m_CameraTarget == null)
{
m_CameraTarget = new GameObject("NREmulatorCameraTarget");
m_CameraTarget.transform.position = Vector3.zero;
m_CameraTarget.transform.rotation = Quaternion.identity;
DontDestroyOnLoad(m_CameraTarget);
}
NRHMDPoseTracker.OnChangeTrackingMode += OnChangeTrackingMode;
}
private void OnChangeTrackingMode(NRHMDPoseTracker.TrackingType origin, NRHMDPoseTracker.TrackingType target)
{
m_CameraTarget.transform.position = Vector3.zero;
m_CameraTarget.transform.rotation = Quaternion.identity;
headPose = Pose.identity;
}
private void Update()
{
if (!Input.GetKey(KeyCode.LeftShift) && !Input.GetKey(KeyCode.RightShift))
{
UpdateHeadPosByInput();
}
}
void UpdateHeadPosByInput()
{
var trackMode = NRSessionManager.Instance.NRHMDPoseTracker.TrackingMode;
if (trackMode == NRHMDPoseTracker.TrackingType.Tracking0Dof)
return;
Vector3 pos = m_CameraTarget.transform.position;
Quaternion q = m_CameraTarget.transform.rotation;
if (Input.GetKey(KeyCode.Space))
{
float mouse_x = Input.GetAxis("Mouse X") * HeadRotateSpeed;
float mouse_y = Input.GetAxis("Mouse Y") * HeadRotateSpeed;
Vector3 mouseMove = new Vector3(m_CameraTarget.transform.eulerAngles.x - mouse_y, m_CameraTarget.transform.eulerAngles.y + mouse_x, 0);
q = Quaternion.Euler(mouseMove);
}
if (trackMode == NRHMDPoseTracker.TrackingType.Tracking0DofStable)
{
q = Quaternion.Slerp(q, Quaternion.identity, m_HeadRotationLerpSpeed * Time.deltaTime);
}
else if (trackMode == NRHMDPoseTracker.TrackingType.Tracking6Dof)
{
Vector3 p = GetBaseInput();
p = p * HeadMoveSpeed * Time.deltaTime;
pos += p;
}
m_CameraTarget.transform.position = pos;
m_CameraTarget.transform.rotation = q;
headPose = new Pose(pos, q);
}
private Vector3 GetBaseInput()
{
Vector3 p_Velocity = new Vector3();
if (Input.GetKey(KeyCode.W))
{
p_Velocity += m_CameraTarget.transform.forward.normalized;
}
if (Input.GetKey(KeyCode.S))
{
p_Velocity += -m_CameraTarget.transform.forward.normalized;
}
if (Input.GetKey(KeyCode.A))
{
p_Velocity += -m_CameraTarget.transform.right.normalized;
}
if (Input.GetKey(KeyCode.D))
{
p_Velocity += m_CameraTarget.transform.right.normalized;
}
return p_Velocity;
}
}
#endif
}