implement headfree movement
This commit is contained in:
parent
009368e71a
commit
6e843d76e7
1 changed files with 122 additions and 11 deletions
|
@ -1094,6 +1094,8 @@ public class ZEDManager : MonoBehaviour
|
||||||
if (camLeftTransform.transform.parent != null)
|
if (camLeftTransform.transform.parent != null)
|
||||||
{
|
{
|
||||||
zedRigRoot = camLeftTransform.parent; //Make the camera's parent object (Camera_eyes in the ZED_Rig_Stereo prefab) the new zedRigRoot to be tracked.
|
zedRigRoot = camLeftTransform.parent; //Make the camera's parent object (Camera_eyes in the ZED_Rig_Stereo prefab) the new zedRigRoot to be tracked.
|
||||||
|
|
||||||
|
Debug.Log("set camLeftTransform.position");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UnityEngine.XR.XRDevice.isPresent)
|
if (UnityEngine.XR.XRDevice.isPresent)
|
||||||
|
@ -1119,8 +1121,10 @@ public class ZEDManager : MonoBehaviour
|
||||||
cameraLeft = caml;
|
cameraLeft = caml;
|
||||||
|
|
||||||
if (camLeftTransform.transform.parent != null)
|
if (camLeftTransform.transform.parent != null)
|
||||||
|
{
|
||||||
zedRigRoot = camLeftTransform.parent;
|
zedRigRoot = camLeftTransform.parent;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
zedRigRoot = transform;
|
zedRigRoot = transform;
|
||||||
|
@ -1831,6 +1835,9 @@ public class ZEDManager : MonoBehaviour
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the tracking position from the ZED and updates zedRigRoot's position. Also updates the AR tracking if enabled.
|
/// Gets the tracking position from the ZED and updates zedRigRoot's position. Also updates the AR tracking if enabled.
|
||||||
/// Only called in Live (not SVO playback) mode. Called in Update().
|
/// Only called in Live (not SVO playback) mode. Called in Update().
|
||||||
|
@ -1854,7 +1861,8 @@ public class ZEDManager : MonoBehaviour
|
||||||
AdjustZEDRigCameraPosition(); //Re-apply the ZED's offset from the VR headset.
|
AdjustZEDRigCameraPosition(); //Re-apply the ZED's offset from the VR headset.
|
||||||
calibrationHasChanged = false;
|
calibrationHasChanged = false;
|
||||||
}
|
}
|
||||||
|
//(Mod)
|
||||||
|
/*
|
||||||
arRig.ExtractLatencyPose(imageTimeStamp); //Find what HMD's pose was at ZED image's timestamp for latency compensation.
|
arRig.ExtractLatencyPose(imageTimeStamp); //Find what HMD's pose was at ZED image's timestamp for latency compensation.
|
||||||
arRig.AdjustTrackingAR(zedPosition, zedOrientation, out r, out v, setIMUPriorInAR);
|
arRig.AdjustTrackingAR(zedPosition, zedOrientation, out r, out v, setIMUPriorInAR);
|
||||||
zedRigRoot.localRotation = r;
|
zedRigRoot.localRotation = r;
|
||||||
|
@ -1864,6 +1872,91 @@ public class ZEDManager : MonoBehaviour
|
||||||
ZEDSyncRotation = r;
|
ZEDSyncRotation = r;
|
||||||
HMDSyncPosition = arRig.LatencyPose().translation;
|
HMDSyncPosition = arRig.LatencyPose().translation;
|
||||||
HMDSyncRotation = arRig.LatencyPose().rotation;
|
HMDSyncRotation = arRig.LatencyPose().rotation;
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Rotate Image plane with zed rotation
|
||||||
|
r = zedOrientation;
|
||||||
|
|
||||||
|
|
||||||
|
zedRigDisplayer.transform.localRotation = r; //(Mod) zedRigDisplayer should move/rotate the image plane
|
||||||
|
//zedRigDisplayer.transform.localEulerAngles = new Vector3(r.x,r.y,0);
|
||||||
|
//TODO: rotation von hmd soll zedRigDisplayer weiterhin beeinflussen (r.z nicht übernehmen evtl?)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//camLeft.transform.SetParent(zedRigDisplayer.transform); //(Mod)
|
||||||
|
//camLeftTransform gets overwritten by hmd transform
|
||||||
|
|
||||||
|
|
||||||
|
//move cams(within camRig) along with zedRig (test, immitates behaviour with cams parent set to zedRigDisplayer)
|
||||||
|
//camRigDisplayer.transform.rotation = zedRigDisplayer.transform.rotation;
|
||||||
|
//camRigDisplayer.transform.position = zedRigDisplayer.transform.position;
|
||||||
|
|
||||||
|
//hmd: camRigDisplayer.transform.eulerAngles.z = pitch
|
||||||
|
//hmd: camRigDisplayer.transform.eulerAngles.y = yaw
|
||||||
|
//hmd: camRigDisplayer.transform.eulerAngles.x = roll
|
||||||
|
//zed roll = z
|
||||||
|
|
||||||
|
//camLeft.transform <- Rotation des HMD
|
||||||
|
//zedRigDisplayer.transform <- rotation der ZED (durch zeile oben, fuer umwandlung in euler von quaternion)
|
||||||
|
//camRigDisplayer.transform <- Rotation des HMD (Parent, rotiert nicht mit hmd mit)
|
||||||
|
|
||||||
|
//camRigDisplayer.transform.eulerAngles = new Vector3(0,0,0);
|
||||||
|
//Transform rotAxis = camRigDisplayer.transform; //axis to rotate around
|
||||||
|
//rotAxis.Rotate(camLeftTransform.eulerAngles); //match camera direction
|
||||||
|
|
||||||
|
|
||||||
|
/*GameObject emptyGO = new GameObject();
|
||||||
|
Transform u = emptyGO.transform;
|
||||||
|
u.position = new Vector3(0,0,1); //rotation axis
|
||||||
|
u.Rotate(zedRigDisplayer.transform.eulerAngles); //rotate so that vector above matches rotation direction of zedRigDisplayers coordinate system
|
||||||
|
*/
|
||||||
|
|
||||||
|
//camRigDisplayer.transform = camRigDisplayer.transform.rotateAroundVector(u, zedOrientation.z) //TODO
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Transform u = rotationTransformhelper.transform;
|
||||||
|
//rotationTransformhelper.transform.position = camLeft.transform.position; //copy data
|
||||||
|
//rotationTransformhelper.transform.rotation = camLeft.transform.rotation; //copy data
|
||||||
|
///rotationTransformhelper.transform.position = camLeft.transform.localPosition; //copy data
|
||||||
|
///rotationTransformhelper.transform.rotation = camLeft.transform.localRotation; //copy data
|
||||||
|
//Debug.Log(new Vector3(0, 0, zedRigDisplayer.transform.eulerAngles.z));
|
||||||
|
///rotationTransformhelper.transform.Rotate(new Vector3(0, 0, zedRigDisplayer.transform.localEulerAngles.z));
|
||||||
|
|
||||||
|
///rotationTransformhelper.transform.Rotate(-camLeft.transform.localEulerAngles);//rotate back
|
||||||
|
//var newrot = zedRigDisplayer.transform.eulerAngles - rotationTransformhelper.transform.eulerAngles;
|
||||||
|
//camRigDisplayer.transform.eulerAngles = newrot;
|
||||||
|
//camRigDisplayer.transform.eulerAngles = rotationTransformhelper.transform.eulerAngles;
|
||||||
|
|
||||||
|
//TODO: das hier geht auch noch nicht, rotation noch etwas komisch. ggf weil rotationspunkt von camLeft/Right nicht im ursprung ist?
|
||||||
|
|
||||||
|
|
||||||
|
///camRigDisplayer.transform.eulerAngles = rotationTransformhelper.transform.eulerAngles; //get cam rotation
|
||||||
|
///camRigDisplayer.transform.position = zedRigDisplayer.transform.position;
|
||||||
|
|
||||||
|
|
||||||
|
// # Versuch Z Rotation der ZED transformiert auf Rotation des camRig uebertragen #
|
||||||
|
//rotationTransformhelper.transform.rotation = zedRigDisplayer.transform.localRotation;
|
||||||
|
//rotationTransformhelper.transform.localEulerAngles = new Vector3(-zedRigDisplayer.transform.eulerAngles.x, -zedRigDisplayer.transform.eulerAngles.y, 0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Vector3 zedDirection = new Vector3(0, 0, 1); //Create Vector towars Z+
|
||||||
|
zedDirection = zedRigDisplayer.transform.rotation * zedDirection; //rotate vector by zedRigRotation (vector should point towards +Z of zedRigDisplayer)
|
||||||
|
camRigDisplayer.transform.localRotation = Quaternion.AngleAxis(zedRigDisplayer.transform.localEulerAngles.z, zedDirection); //rotate only around zedDirection.z with respect to original coordinate system
|
||||||
|
|
||||||
|
//same for camera Z rotation compensation
|
||||||
|
Vector3 hmdDirection = new Vector3(0, 0, 1); //Create Vector towars Z+
|
||||||
|
hmdDirection = camLeft.transform.rotation * hmdDirection; //rotate vector by cam (HMD) (vector should point towards +Z of HMD)
|
||||||
|
camRigDisplayer.transform.rotation *= Quaternion.AngleAxis(-camLeft.transform.localEulerAngles.z, hmdDirection); //compensate only around hmd.z with respect to original coordinate system
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//zedRigRoot.localRotation = r;
|
||||||
|
//zedRigRoot.localPosition = v;
|
||||||
}
|
}
|
||||||
else //Not AR pass-through mode.
|
else //Not AR pass-through mode.
|
||||||
{
|
{
|
||||||
|
@ -1894,6 +1987,12 @@ public class ZEDManager : MonoBehaviour
|
||||||
arRig.CollectPose(); //Save headset pose with current timestamp.
|
arRig.CollectPose(); //Save headset pose with current timestamp.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector3 rotatePointAroundAxis(Vector3 point, float angle, Vector3 axis)
|
||||||
|
{
|
||||||
|
Quaternion q = Quaternion.AngleAxis(angle, axis);
|
||||||
|
return q * point; //Note: q must be first (point * q wouldn't compile)
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates images, collects HMD poses for latency correction, and applies tracking.
|
/// Updates images, collects HMD poses for latency correction, and applies tracking.
|
||||||
/// Called by Unity each frame.
|
/// Called by Unity each frame.
|
||||||
|
@ -2089,6 +2188,9 @@ public class ZEDManager : MonoBehaviour
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[HideInInspector]
|
[HideInInspector]
|
||||||
public GameObject zedRigDisplayer;
|
public GameObject zedRigDisplayer;
|
||||||
|
public GameObject camRigDisplayer; //(Mod)
|
||||||
|
public GameObject rotationTransformhelper;//(Mod):
|
||||||
|
public GameObject camLeft;//(Mod);
|
||||||
private ZEDMixedRealityPlugin arRig;
|
private ZEDMixedRealityPlugin arRig;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a GameObject to display the ZED in an headset (ZED-M Only).
|
/// Create a GameObject to display the ZED in an headset (ZED-M Only).
|
||||||
|
@ -2102,6 +2204,10 @@ public class ZEDManager : MonoBehaviour
|
||||||
zedRigDisplayer = new GameObject("ZEDRigDisplayer");
|
zedRigDisplayer = new GameObject("ZEDRigDisplayer");
|
||||||
arRig = zedRigDisplayer.AddComponent<ZEDMixedRealityPlugin>();
|
arRig = zedRigDisplayer.AddComponent<ZEDMixedRealityPlugin>();
|
||||||
|
|
||||||
|
camRigDisplayer = new GameObject("camRigDisplayer"); //(Mod)
|
||||||
|
rotationTransformhelper = new GameObject("rotationTransformhelper"); //(Mod)
|
||||||
|
//rotationTransformhelper.transform.SetParent(zedRigDisplayer.transform);
|
||||||
|
|
||||||
/*Screens left and right */
|
/*Screens left and right */
|
||||||
GameObject leftScreen = GameObject.CreatePrimitive(PrimitiveType.Quad);
|
GameObject leftScreen = GameObject.CreatePrimitive(PrimitiveType.Quad);
|
||||||
leftScreen.name = "Quad - Left";
|
leftScreen.name = "Quad - Left";
|
||||||
|
@ -2128,8 +2234,11 @@ public class ZEDManager : MonoBehaviour
|
||||||
rightScreen.layer = arLayer;
|
rightScreen.layer = arLayer;
|
||||||
|
|
||||||
/*Camera left and right*/
|
/*Camera left and right*/
|
||||||
GameObject camLeft = new GameObject("cameraLeft");
|
//GameObject camLeft = new GameObject("cameraLeft"); //(Mod)
|
||||||
camLeft.transform.SetParent(zedRigDisplayer.transform);
|
camLeft = new GameObject("cameraLeft");
|
||||||
|
//camLeft.transform.SetParent(zedRigDisplayer.transform); //(Mod)
|
||||||
|
camLeft.transform.SetParent(camRigDisplayer.transform); //(Mod)
|
||||||
|
|
||||||
Camera camL = camLeft.AddComponent<Camera>();
|
Camera camL = camLeft.AddComponent<Camera>();
|
||||||
camL.stereoTargetEye = StereoTargetEyeMask.Both; //Temporary setting to fix loading screen issue.
|
camL.stereoTargetEye = StereoTargetEyeMask.Both; //Temporary setting to fix loading screen issue.
|
||||||
camL.renderingPath = RenderingPath.Forward;//Minimal overhead
|
camL.renderingPath = RenderingPath.Forward;//Minimal overhead
|
||||||
|
@ -2141,7 +2250,9 @@ public class ZEDManager : MonoBehaviour
|
||||||
camL.depth = camLeftTransform.GetComponent<Camera>().depth;
|
camL.depth = camLeftTransform.GetComponent<Camera>().depth;
|
||||||
|
|
||||||
GameObject camRight = new GameObject("cameraRight");
|
GameObject camRight = new GameObject("cameraRight");
|
||||||
camRight.transform.SetParent(zedRigDisplayer.transform);
|
//camRight.transform.SetParent(zedRigDisplayer.transform); //(Mod)
|
||||||
|
camRight.transform.SetParent(camRigDisplayer.transform); //(Mod)
|
||||||
|
|
||||||
Camera camR = camRight.AddComponent<Camera>();
|
Camera camR = camRight.AddComponent<Camera>();
|
||||||
camR.renderingPath = RenderingPath.Forward;//Minimal overhead
|
camR.renderingPath = RenderingPath.Forward;//Minimal overhead
|
||||||
camR.clearFlags = CameraClearFlags.Color;
|
camR.clearFlags = CameraClearFlags.Color;
|
||||||
|
|
Loading…
Reference in a new issue