2016-08-12 9 views
1

У меня проблема с матричным преобразованием в OpenVR api.вопросы матрицы преобразования в VR

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, как правильно отредактировать rendermodel? Я пробовал использовать 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

+0

Привет, спасибо за ваш ответ. Сначала перед интеграцией openvr у меня уже есть матрица камеры из мира для просмотра. Таким образом, задача интеграции заключается в поддержке матрицы вращения hmd; вторая задача - поддерживать рендеринг двух контроллеров в игре. – user2240897

+0

@ user2240897 В этом случае обычно вы используете компонент позиции матрицы вашей камеры в качестве источника вашего пространства HMD. Для рендеринга контроллеров просто обратитесь к образцу кода. – yhc