Вопросы преобразования матрицы в VR

У меня проблема с преобразованием матрицы в 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 ] но эффекта нет.

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 * modelview а также m_mat4ProjectionRight * m_mat4eyePosRight * modelview для левого и правого глаза соответственно. Для рендеринга на мониторе вы можете создать свой собственный усеченный контур и умножить его на матрицу вида модели. Следующий веб-сайт является хорошим справочным пособием по созданию матрицы проекции: http://www.songho.ca/opengl/gl_projectionmatrix.html

Другие вопросы по тегам