Hello everyone.

The Mixed Reality Forums here are no longer being used or maintained.

There are a few other places we would like to direct you to for support, both from Microsoft and from the community.

The first way we want to connect with you is our mixed reality developer program, which you can sign up for at https://aka.ms/IWantMR.

For technical questions, please use Stack Overflow, and tag your questions using either hololens or windows-mixed-reality.

If you want to join in discussions, please do so in the HoloDevelopers Slack, which you can join by going to https://aka.ms/holodevelopers, or in our Microsoft Tech Communities forums at https://techcommunity.microsoft.com/t5/mixed-reality/ct-p/MicrosoftMixedReality.

And always feel free to hit us up on Twitter @MxdRealityDev.
Options

Where are the Hololens Stereo Matices in Unity?

terboterbo
edited January 2017 in Questions And Answers

Is there any way in Unity to get the stereo view and projection matrices for the Hololens? I really want to save the previous frame's view and proj matrices for various effects. I've tried everything I can think of:
1) Camera.GetStereoViewMatrix and Camera.GetStereoProjectionMatrix are always identity.
2) The camera's transform/Camera.worldToCameraMatrix and GL.GetGPUProjectionMatrix do not produce correct View-projection matrices. In fact they are always the same for both cameras.
3) I've tried Material.GetMatrix("UNITY_MATRIX_V") and Material.GetMatrix("UNITY_MATRIX_P"), which always fail, likely because they are packed in Constant Buffers (UnityShaderVariables.cginc).
4) I've tried writing a native UWP dll that manually extracts camera poses from a HolographicFrame, yet HolographicSpace::CreateForCoreWindow barfs (SEH) because Unity has already done it for the app's CoreWindow.

Am I missing something? These seems like fundamental data that should be readily available.

Best Answer

  • Options
    terboterbo
    Answer ✓

    Uhg, neither of those comments are helpful. After some experimentation, the answer is,

    For Object Drawing:

    • camera.GetStereoViewMatrix(Camera.StereoscopicEye) == UNITY_MATRIX_V.
    • GL.GetGPUProjectionMatrix(camera.GetStereoViewMatrix(Camera.StereoscopicEye) ) == UNITY_MATRIX_P.

    Note: UNITY_MATRIX_V and UNITY_MATRIX_P will be set to the proper eye depending on the camera pass.

    For Screen-space Drawing:

    • camera.GetStereoViewMatrix(Camera.StereoscopicEye) == unity_CameraProjection.

    Note: UNITY_MATRIX_P will be useless because Unity is blitting with a screen-space quad.

Answers

  • Options
    edited January 2017

    I can't say for Unity, however it is fundamental data that is readily available for DirectX C# or C++ app...

    With that being said, there must be a way to get to it in Unity, what is your custom shader logic look like? From my understanding these UNITY_MATRIX_XX are shader variables and pretty much are available in custom shaders.

    Dwight Goins
    CAO & Founder| Independent Architect | Trainer and Consultant | Sr. Enterprise Architect
    MVP | MCT | MCSD | MCPD | SharePoint TS | MS Virtual TS |Windows 8 App Store Developer | Linux Gentoo Geek | Raspberry Pi Owner | Micro .Net Developer | Kinect For Windows Device Developer
    http://dgoins.wordpress.com

  • Options

    Unity has a built in shader function that handles the two matrices. I think its called SetStereo or something similar, where it initializes the view matrix based on the instance index. As for C++, LIke Dwight said, essentially instance id is used to pull transforms for either a 0 or 1 index from the eye matrices.

    http://www.redsprocketstudio.com/
    Developer | Check out my new project blog

  • Options
    terboterbo
    Answer ✓

    Uhg, neither of those comments are helpful. After some experimentation, the answer is,

    For Object Drawing:

    • camera.GetStereoViewMatrix(Camera.StereoscopicEye) == UNITY_MATRIX_V.
    • GL.GetGPUProjectionMatrix(camera.GetStereoViewMatrix(Camera.StereoscopicEye) ) == UNITY_MATRIX_P.

    Note: UNITY_MATRIX_V and UNITY_MATRIX_P will be set to the proper eye depending on the camera pass.

    For Screen-space Drawing:

    • camera.GetStereoViewMatrix(Camera.StereoscopicEye) == unity_CameraProjection.

    Note: UNITY_MATRIX_P will be useless because Unity is blitting with a screen-space quad.

Sign In or Register to comment.