2012-04-28 241 views
0

在DirectX 11中創建3D第一人稱相機時出現問題。DirectX中的第一人稱相機看起來很奇怪

我在(0,0,-2)看相機(0 ,0,100)。在(0,0,0)處有一個盒子,並且盒子被正確渲染。看到低於該圖像:

enter image description here

當箱(未相機)的變化的位置,它被正確呈現。例如,下一圖像顯示框(1,0,0)和照相機仍然在(0,0,-2):

enter image description here

然而,只要相機移動向左或對,盒子應該走向相反的方向,但它看起來是扭曲的。下面是一個例子,當相機處於(1,0,-2)並看着(1,0,100)時。這個盒子是仍然在(0,0,0):

enter image description here

這是我如何設置我的相機:

// Set the world transformation matrix. 

D3DXMATRIX rotationMatrix;   // A matrix to store the rotation information 
D3DXMATRIX scalingMatrix;   // A matrix to store the scaling information 
D3DXMATRIX translationMatrix;  // A matrix to store the translation information 

D3DXMatrixIdentity(&translationMatrix); 

// Make the scene being centered on the camera position. 
D3DXMatrixTranslation(&translationMatrix, -camera.GetX(), -camera.GetY(), -camera.GetZ()); 

m_worldTransformationMatrix = translationMatrix; 

// Set the view transformation matrix. 

D3DXMatrixIdentity(&m_viewTransformationMatrix); 

D3DXVECTOR3 cameraPosition(camera.GetX(), camera.GetY(), camera.GetZ()); 

// ------------------------ 
// Compute the lookAt position 
// ------------------------ 

const FLOAT lookAtDistance = 100; 

FLOAT lookAtXPosition = camera.GetX() + lookAtDistance * cos((FLOAT)D3DXToRadian(camera.GetXZAngle())); 
FLOAT lookAtYPosition = camera.GetY() + lookAtDistance * sin((FLOAT)D3DXToRadian(camera.GetYZAngle())); 
FLOAT lookAtZPosition = camera.GetZ() + lookAtDistance * (sin((FLOAT)D3DXToRadian(camera.GetXZAngle())) * cos((FLOAT)D3DXToRadian(camera.GetYZAngle()))); 

D3DXVECTOR3 lookAtPosition(lookAtXPosition, lookAtYPosition, lookAtZPosition); 

D3DXVECTOR3 upDirection(0, 1, 0); 

D3DXMatrixLookAtLH(&m_viewTransformationMatrix, 
        &cameraPosition, 
        &lookAtPosition, 
        &upDirection); 

RECT windowDimensions = GetWindowDimensions(); 
FLOAT width = (FLOAT)(windowDimensions.right - windowDimensions.left); 
FLOAT height = (FLOAT)(windowDimensions.bottom - windowDimensions.top); 

// Set the projection matrix. 

D3DXMatrixIdentity(&m_projectionMatrix); 
D3DXMatrixPerspectiveFovLH(&m_projectionMatrix, 
          (FLOAT)(D3DXToRadian(45)), // Horizontal field of view 
          width/height, // Aspect ratio 
          1.0f,    // Near view-plane 
          100.0f);   // Far view-plane 

下面是最終矩陣是如何設置的:

D3DXMATRIX finalMatrix = m_worldTransformationMatrix * m_viewTransformationMatrix * m_projectionMatrix; 

// Set the new values for the constant buffer 
mp_deviceContext->UpdateSubresource(mp_constantBuffer, 0, 0, &finalMatrix, 0, 0); 

最後,這裏是使用恆定緩衝區的頂點着色器:

VOut VShader(float4 position : POSITION, float4 color : COLOR, float2 texcoord : TEXCOORD) 
{ 
    VOut output; 

    output.color = color; 
output.texcoord = texcoord; 
output.position = mul(position, finalMatrix); // Transform the vertex from 3D to 2D 

    return output; 
} 

你看到我在做什麼錯了嗎?如果您需要更多關於我的代碼的信息,請隨時提問:我真的希望這能起作用。

謝謝!

+0

您在哪裏設置方框位置? – CarlJohnson 2012-04-28 18:33:21

+0

在我的主要功能。它的位置總是在(0,0,0):它從不移動。 – GDICommander 2012-04-28 20:05:18

+0

您所顯示的代碼是用於繪製框的,我猜想。你說'當盒子的位置(不是相機)發生改變時,它會被正確渲染'。那麼,你在這段代碼中改變了什麼來確認這個陳述呢? – CarlJohnson 2012-04-29 21:19:06

回答

1

問題是你正在設置finalMatrix與行主矩陣,但HLSL期望列主矩陣。解決方法是在更新常量之前使用D3DXMatrixTranspose,或在HLSL文件中聲明row_major,如下所示:

cbuffer ConstantBuffer 
{ 
    row_major float4x4 finalMatrix; 
} 
+0

您的解決方案解決了我的問題:謝謝!我想知道爲什麼finalMatrix是一個主要的矩陣:它不是在大多數關於相機的教程中提到的... – GDICommander 2012-05-05 01:02:29