implement headfree movement

This commit is contained in:
Philipp Kramer 2019-11-26 15:08:36 +01:00
parent 009368e71a
commit 6e843d76e7

View file

@ -1070,17 +1070,17 @@ public class ZEDManager : MonoBehaviour
//This won't affect whether the rig is in stereo mode, but allows the cameras to be accessed via GetLeftCamera() and GetRightCamera(). //This won't affect whether the rig is in stereo mode, but allows the cameras to be accessed via GetLeftCamera() and GetRightCamera().
if (cameraLeft == null || cameraRight == null) if (cameraLeft == null || cameraRight == null)
{ {
foreach(Camera cam in monocams) foreach (Camera cam in monocams)
{ {
ZEDRenderingPlane rendplane = cam.gameObject.GetComponent<ZEDRenderingPlane>(); ZEDRenderingPlane rendplane = cam.gameObject.GetComponent<ZEDRenderingPlane>();
if (!rendplane) continue; if (!rendplane) continue;
if(!cameraLeft && (rendplane.viewSide == ZEDRenderingPlane.ZED_CAMERA_SIDE.LEFT || rendplane.viewSide == ZEDRenderingPlane.ZED_CAMERA_SIDE.LEFT_FORCE)) if (!cameraLeft && (rendplane.viewSide == ZEDRenderingPlane.ZED_CAMERA_SIDE.LEFT || rendplane.viewSide == ZEDRenderingPlane.ZED_CAMERA_SIDE.LEFT_FORCE))
{ {
cameraLeft = cam; cameraLeft = cam;
camLeftTransform = cam.transform; camLeftTransform = cam.transform;
} }
else if(!cameraRight && (rendplane.viewSide == ZEDRenderingPlane.ZED_CAMERA_SIDE.RIGHT || rendplane.viewSide == ZEDRenderingPlane.ZED_CAMERA_SIDE.RIGHT_FORCE)) else if (!cameraRight && (rendplane.viewSide == ZEDRenderingPlane.ZED_CAMERA_SIDE.RIGHT || rendplane.viewSide == ZEDRenderingPlane.ZED_CAMERA_SIDE.RIGHT_FORCE))
{ {
cameraRight = cam; cameraRight = cam;
camRightTransform = cam.transform; camRightTransform = cam.transform;
@ -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;
@ -1310,7 +1314,7 @@ public class ZEDManager : MonoBehaviour
{ {
Debug.LogError("ZEDManager on " + gameObject.name + " couldn't connect to camera: " + cameraID + Debug.LogError("ZEDManager on " + gameObject.name + " couldn't connect to camera: " + cameraID +
". Check if another ZEDManager is already connected."); ". Check if another ZEDManager is already connected.");
this.gameObject.SetActive (false); this.gameObject.SetActive(false);
return; return;
} }
initParameters.inputType = inputType; initParameters.inputType = inputType;
@ -1511,7 +1515,7 @@ public class ZEDManager : MonoBehaviour
else if (isStereoRig && !UnityEngine.XR.XRDevice.isPresent) //Using stereo rig, but no VR headset. else if (isStereoRig && !UnityEngine.XR.XRDevice.isPresent) //Using stereo rig, but no VR headset.
{ {
//When no VR HMD is available, simply put the origin at the left camera. //When no VR HMD is available, simply put the origin at the left camera.
if(camLeftTransform) camLeftTransform.localPosition = Vector3.zero; if (camLeftTransform) camLeftTransform.localPosition = Vector3.zero;
if (camLeftTransform) camLeftTransform.localRotation = Quaternion.identity; if (camLeftTransform) camLeftTransform.localRotation = Quaternion.identity;
if (camRightTransform) camRightTransform.localPosition = rightCameraOffset; //Space the eyes apart. if (camRightTransform) camRightTransform.localPosition = rightCameraOffset; //Space the eyes apart.
if (camRightTransform) camRightTransform.localRotation = Quaternion.identity; if (camRightTransform) camRightTransform.localRotation = Quaternion.identity;
@ -1560,7 +1564,7 @@ public class ZEDManager : MonoBehaviour
if (renderingPath != ZEDRenderingMode.FORWARD && renderingPath != ZEDRenderingMode.DEFERRED) if (renderingPath != ZEDRenderingMode.FORWARD && renderingPath != ZEDRenderingMode.DEFERRED)
{ {
Debug.LogError("[ZED Plugin] Only Forward and Deferred Shading rendering path are supported"); Debug.LogError("[ZED Plugin] Only Forward and Deferred Shading rendering path are supported");
if(cameraLeft) cameraLeft.renderingPath = RenderingPath.Forward; if (cameraLeft) cameraLeft.renderingPath = RenderingPath.Forward;
if (cameraRight) cameraRight.renderingPath = RenderingPath.Forward; if (cameraRight) cameraRight.renderingPath = RenderingPath.Forward;
} }
@ -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;