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

ただし、1 つの落とし穴があります。サンプルから関数を含めた場合UpdateHMDMatrixPose()、この関数はm_rmat4DevicePose[vr::k_unTrackedDeviceIndex_Hmd]の値を更新しながら反転し、ワールド空間からモデル/HMD ビュー空間へのマッピングをm_mat4HMDPoseそのままm_rmat4DevicePose[0]にして、配列内の他の行列とはまったく逆になります。

2.

モデル ビュー マトリックスが既にある場合は、射影マトリックスにそれを掛けるだけで、MVP マトリックスを取得できます。HMD にレンダリングするには、左目と右目にそれぞれ と をm_mat4ProjectionLeft * m_mat4eyePosLeft * modelview使用します。m_mat4ProjectionRight * m_mat4eyePosRight * modelviewモニターでレンダリングする場合、独自の錐台を生成し、モデル ビュー マトリックスを掛けることができます。次の Web サイトは、射影行列の作成方法に関する参考資料として役立ち ます。 http://www.songho.ca/opengl/gl_projectionmatrix.html

于 2016-08-12T19:26:08.073 に答える