2

我对 OpenVR api 中的矩阵变换有疑问。

m_compositor->WaitGetPoses(m_rTrackedDevicePose, vr::k_unMaxTrackedDeviceCount, nullptr, 0);

在 openvr 给出的演示中:

const Matrix4 & matDeviceToTracking = m_rmat4DevicePose[ unTrackedDevice ];
        Matrix4 matMVP = GetCurrentViewProjectionMatrix( nEye ) * matDeviceToTracking;
        glUniformMatrix4fv( m_nRenderModelMatrixLocation, 1, GL_FALSE, matMVP.get() );

其中 GetCurrentViewProjectionMatrix 计算如下

Matrix4 CMainApplication::GetCurrentViewProjectionMatrix( vr::Hmd_Eye nEye )
{
    Matrix4 matMVP;
    if( nEye == vr::Eye_Left )
    {
        matMVP = m_mat4ProjectionLeft * m_mat4eyePosLeft * m_mat4HMDPose;
    }
    else if( nEye == vr::Eye_Right )
    {
        matMVP = m_mat4ProjectionRight * m_mat4eyePosRight *  m_mat4HMDPose;
    }

    return matMVP;
}

问题是:

1、matDeviceToTracking是从哪个空间变换到哪个空间的?

2,如果我已经有模型视图矩阵,并且已经可以用hmd旋转,我怎样才能正确渲染渲染模型?我尝试使用projection*modelview*m_rmat4DevicePose[ unTrackedDevice ]但没有效果。

4

1 回答 1

1

1.

在示例代码中,matDeviceToTracking是对 的引用m_rmat4DevicePose[unTrackedDevice],它是从 复制而来的TrackedDevicePose_t::mDeviceToAbsoluteTracking这是从模型空间到世界空间的模型矩阵映射。

不过,有一个陷阱。如果您包含UpdateHMDMatrixPose()示例中的函数,则此函数m_rmat4DevicePose[vr::k_unTrackedDeviceIndex_Hmd]会在更新 的值时反转m_mat4HMDPose,留下m_rmat4DevicePose[0]从世界空间到模型/HMD 视图空间的映射,与数组中的其他矩阵正好相反。

2.

如果你已经有了模型视图矩阵,那么你只需要将投影矩阵乘以它就可以得到 MVP 矩阵。要渲染到 HMD,请分别使用m_mat4ProjectionLeft * m_mat4eyePosLeft * modelviewm_mat4ProjectionRight * m_mat4eyePosRight * modelview用于左眼和右眼。为了在监视器上进行渲染,您可以生成自己的平截头体并将其乘以您的模型视图矩阵。以下网站是有关如何创建投影矩阵的很好参考:http: //www.songho.ca/opengl/gl_projectionmatrix.html

于 2016-08-12T19:26:08.073 回答