2016-08-12 2 views
1

OpenVR APIの行列変換に関する問題があります。 openvrが与えるデモに VRの変換行列の質問

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

: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; 
} 

質問で計算され

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

は:から変換matDeviceToTrackingれる空間

1、どの宇宙に?

2私は既にmodelviewマトリックスがあり、すでにhmdで回転できますが、どうすればレンダリングモデルを正しくレンダリングできますか?私はprojection*modelview*m_rmat4DevicePose[ unTrackedDevice ]を使ってみましたが効果はありません。サンプルコードで

答えて

1

matDeviceToTrackingTrackedDevicePose_t::mDeviceToAbsoluteTrackingからコピーさm_rmat4DevicePose[unTrackedDevice]への参照です。これは、モデル空間から世界の空間へのモデル行列です。

しかし、1つの落とし穴があります。サンプルからUpdateHMDMatrixPose()関数をインクルードした場合、この関数は、m_mat4HMDPoseの値を更新しながらを反転させ、をワールド空間からモデル/ HMDビュー空間にマッピングし、まったく逆に配列内の他の行列に置き換えます。

2.

すでにモデルビュー行列を持っている場合は、あなただけのMVPの行列を得ることにより、投影行列を乗算する必要があります。 HMDにレンダリングするには、左目と右目にそれぞれm_mat4ProjectionLeft * m_mat4eyePosLeft * modelviewm_mat4ProjectionRight * m_mat4eyePosRight * modelviewを使用します。モニター上でレンダリングするには、独自の錐台を生成し、それをモデルビューマトリックスで乗算することができます。次のWebサイトは、投影行列の作成方法に関する参考資料です。 http://www.songho.ca/opengl/gl_projectionmatrix.html

+0

こんにちは、お返事ありがとうございます。まずopenvrの統合の前に、私はすでに世界から見るためのカメラ行列を持っています。したがって、統合タスクは、ビューマトリックスでhmdローテーションをサポートすることです。第2のタスクはゲーム内の2つのコントローラのレンダリングをサポートすることである。 – user2240897

+0

@ user2240897この場合、通常、カメラマトリックスの位置成分をHMD空間の原点として使用します。コントローラーをレンダリングするには、単にサンプルコードを参照してください。 – yhc