Вопросы преобразования матрицы в 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