OVRComposition.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using UnityEngine;
  2. using System.Collections;
  3. #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
  4. public abstract class OVRComposition {
  5. public abstract OVRManager.CompositionMethod CompositionMethod();
  6. public abstract void Update(Camera mainCamera);
  7. public abstract void Cleanup();
  8. public virtual void RecenterPose() { }
  9. protected bool usingLastAttachedNodePose = false;
  10. protected OVRPose lastAttachedNodePose = new OVRPose(); // Sometimes the attach node pose is not readable (lose tracking, low battery, etc.) Use the last pose instead when it happens
  11. internal OVRPose ComputeCameraWorldSpacePose(OVRPlugin.CameraExtrinsics extrinsics)
  12. {
  13. OVRPose worldSpacePose = new OVRPose();
  14. OVRPose trackingSpacePose = new OVRPose();
  15. OVRPose cameraTrackingSpacePose = extrinsics.RelativePose.ToOVRPose();
  16. trackingSpacePose = cameraTrackingSpacePose;
  17. if (extrinsics.AttachedToNode != OVRPlugin.Node.None && OVRPlugin.GetNodePresent(extrinsics.AttachedToNode))
  18. {
  19. if (usingLastAttachedNodePose)
  20. {
  21. Debug.Log("The camera attached node get tracked");
  22. usingLastAttachedNodePose = false;
  23. }
  24. OVRPose attachedNodePose = OVRPlugin.GetNodePose(extrinsics.AttachedToNode, OVRPlugin.Step.Render).ToOVRPose();
  25. lastAttachedNodePose = attachedNodePose;
  26. trackingSpacePose = attachedNodePose * trackingSpacePose;
  27. }
  28. else
  29. {
  30. if (extrinsics.AttachedToNode != OVRPlugin.Node.None)
  31. {
  32. if (!usingLastAttachedNodePose)
  33. {
  34. Debug.LogWarning("The camera attached node could not be tracked, using the last pose");
  35. usingLastAttachedNodePose = true;
  36. }
  37. trackingSpacePose = lastAttachedNodePose * trackingSpacePose;
  38. }
  39. }
  40. worldSpacePose = OVRExtensions.ToWorldSpacePose(trackingSpacePose);
  41. return worldSpacePose;
  42. }
  43. }
  44. #endif