2015-07-08 4 views
0

Я пытаюсь изменить мой Монокуляр DirectX Engine в Стереоскопии Renderengine для Oculus Rift. То, что отсутствует, - это трансформация стереоскопического проекции для достижения 3D-восприятия.DirectX стереоскопического Преобразование проекции для 3D восприятия

В настоящем время, я использую до сих пор моей стандартной проекции монокуляра Матрицы:

1.50888 0 0 0 
0 2.41421 0 0 
0 0 1.0001 -0.10001 
0 0 1 0 

// Setup the projection matrix. 
fieldOfView = (float)XM_PI/4.0f; 
screenAspect = (float)screenWidth/(float)screenHeight; 

// Create the [Monoscope]projection matrix for 3D rendering. 
XMMATRIX projectionMatrix_XmMat = XMMatrixPerspectiveFovLH(fieldOfView, screenAspect, screenNear, screenDepth); 
XMStoreFloat4x4(&projectionmatrix_, projectionMatrix_XmMat); 

Я уже перевода левой камеры -0.032 для создания View Matrix, и моего правого глаза x_translated по 0.032 для создания Матрицы просмотра. Проблема заключается в Стерео-внецентровая проекционная матрица (которая, мне кажется, мне нужна). Поэтому я думаю, что мне нужно сделать это как-то: http://paulbourke.net/exhibition/vpac/theory2.gif пытался много различных вычислений, но я только что получил странные результаты, к сожалению ..

Уже исследовал много, некоторые люди здесь succeding делают этот http://www.gamedev.net/topic/597564-view-and-projection-matrices-for-vr-window-using-head-tracking/:

// Window Size 1200x800, 3:2 
// XMFLOAT3 Position = camera_->GetPosition(); 
// [Method 1] ------------------------------------------------------------ 
//float left = screenNear_ * (-3.f - position.x)/position.z; 
//float right = screenNear_ * (3.f - position.x)/position.z; 
//float bottom = screenNear_ * (-2.f - position.y)/position.z; 
//float top = screenNear_ * (2.f - position.y)/position.z; 

//XMMATRIX stereomatrix = XMMatrixPerspectiveOffCenterLH(left, right, bottom, top, screenNear_, screenDepth_); 
//XMStoreFloat4x4(&stereoprojectionmatrix_, stereomatrix); 

Но Метод 1 вызывает странные случайные эффекты. Я перемещаю свою камеру обратно на Z-Axis, но визуально она может перейти в -z-axis для значений -3.f, все значения камеры < -3.f не имеют никакого визуального эффекта.

Кроме того, я также читал через эту бумагу: http://www.google.at/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CCkQFjAB&url=http%3A%2F%2Fwww.marries.nl%2Fwp-content%2Fuploads%2F2011%2F05%2FApplying-stereoscopic-3D-in-games.pdf&ei=nAydVY6bBcL5UobagJgL&usg=AFQjCNEFhKttlYJYNbWF2-LptmcCi8bTZg&sig2=VOKBq9VE0k8nhHtA3gxN8g

, а также читать через NVIDIA презентации: http://www.google.at/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCIQFjAA&url=http%3A%2F%2Fwww.nvidia.com%2Fcontent%2FGTC-2010%2Fpdfs%2F2010_GTC2010.pdf&ei=xA2dVZe3KYr8UMT6g5gL&usg=AFQjCNGeanxCoryAZvmxC1BDmf2itOgG0w&sig2=Ss2kN5gCYeoLsgJ66-442A&bvm=bv.96952980,d.d24

Но я просто не могу понять, как мне нужно, чтобы изменить свою монокулярную матрицу проекции или как правильно настроить две матрицы внеосевой проекции.

Возможно, кто-то может мне помочь, я был бы очень рад этому!

Большое спасибо!

ответ

0

Я только что вернулся, чтобы дать ответ на этот вопрос, даже если он уже давно разрешен.

мне пришлось настроить стерео преобразование проекции Матрица для достижения 3D-проекции, как это:

Stereo Projection Transformation

Чтобы получить это в коде, я создал экземпляр OculusHMD, который использует Oculus SDK. С Oculus SDK можно рассчитать такую ​​трансформацию стереофонической проекции, которая идеально подходит для hmd. Несмотря на то, что необходимо настроить устройство Oculus HMD ранее, что означает настройку eyRenderDesc, screenNear и screenDepth т.д.

void GraphicsAPI::StereoProjectionTransformation(int camID) 
    { 
    Matrix4f proj = ovrMatrix4f_Projection(OculusHMD::instance()->eyeRenderDesc_[camID-1].Fov, screenNear_, screenDepth_, false); 

    stereoprojectionmatrix_._11 = proj.M[0][0]; 
    stereoprojectionmatrix_._21 = proj.M[0][1]; 
    stereoprojectionmatrix_._31 = proj.M[0][2]; 
    stereoprojectionmatrix_._41 = proj.M[0][3]; 

    stereoprojectionmatrix_._12 = proj.M[1][0]; 
    stereoprojectionmatrix_._22 = proj.M[1][1]; 
    stereoprojectionmatrix_._32 = proj.M[1][2]; 
    stereoprojectionmatrix_._42 = proj.M[1][3]; 

    stereoprojectionmatrix_._13 = proj.M[2][0]; 
    stereoprojectionmatrix_._23 = proj.M[2][1]; 
    stereoprojectionmatrix_._33 = proj.M[2][2]; 
    stereoprojectionmatrix_._43 = proj.M[2][3]; 

    stereoprojectionmatrix_._14 = proj.M[3][0]; 
    stereoprojectionmatrix_._24 = proj.M[3][1]; 
    stereoprojectionmatrix_._34 = proj.M[3][2]; 
    stereoprojectionmatrix_._44 = proj.M[3][3]; 
} 

Все, что я должен был сделать после этого, чтобы скопировать значения Stereoprojectionmatrix - который вычисляется по Окулусу SDK в первой строке - моей собственной проекционной матрице. И то, что мы получаем, является очень приятным 3D-эффектом, как это должно выглядеть:

cheers,

 Смежные вопросы

  • Нет связанных вопросов^_^