2016-09-14 63 views
0

我正在嘗試Direct 3D的入門。但我無法讓fov相機工作。至少不是垂直運動。我想出了爲什麼,但我仍然無法解決它。Direct3D9無法獲得垂直fov相機的工作

我用C++(140)和D3DX9

代碼:

D3DXMATRIX viewMat; 

static D3DXMATRIX viewRotXMat; 
static D3DXMATRIX viewRotYMat; 
static D3DXMATRIX viewRotZMat; 

static float rotY = 0.0f; 
static float rotXZ = 0.0f; 

if (GetAsyncKeyState(VK_LEFT)) { rotY += 0.1f; } 
if (GetAsyncKeyState(VK_RIGHT)) { rotY -= 0.1f; } 

if (GetAsyncKeyState(VK_UP)) { rotXZ += 0.1f; } 
if (GetAsyncKeyState(VK_DOWN)) { rotXZ -= 0.1f; } 

//POINT pMO = getMouseOffset(); 
//rotY += pMO.x/10; 
//rotXZ += pMO.y/10; 

D3DXMatrixLookAtLH(&viewMat, 
    &D3DXVECTOR3(10.0f, 10.0f, 0.0f), //pos 
    &D3DXVECTOR3(0.0f, 10.0f, 0.0f), //look-at 
    &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); //weird values 


D3DXMatrixRotationY(&viewRotYMat, rotY); 
D3DXMatrixRotationX(&viewRotXMat, cos(rotY) * rotXZ); 
D3DXMatrixRotationZ(&viewRotZMat, (sin(rotY) * rotXZ) * -1); 

d3ddev->SetTransform(D3DTS_VIEW, &(viewMat * viewRotXMat * viewRotYMat * viewRotZMat)); 


D3DXMatrixPerspectiveFovLH(&projMat, 
          D3DXToRadian(90), 
          (FLOAT)SIZEX/(FLOAT)SIZEY, 
          1.0f, 
          1000.0f); 
d3ddev->SetTransform(D3DTS_PROJECTION, &projMat); 

這是我RenderFrame功能的重要組成部分。 它不會工作的原因是因爲 rotY和rotXZ。出於某種原因,當我將攝像機轉動45°左右時,rotY變量僅變爲3-4。那麼爲什麼D3DXMatrixRotationY函數將角度作爲參數,但有些浮點數?該參數甚至是命名角度...我現在在這個問題上約3天。我希望你能幫助我。

+1

你的角度是否爲弧度或弧度?它應該作爲弧度傳遞給'D3DXMatrixRotationY'(和'cos' /'sin')。 '&(viewMat * viewRotXMat * viewRotYMat * viewRotZMat)'中的臨時右值的地址也不符合標準,但您的編譯器可能會支持它。 – user4407569

+0

這是directx教程顯示的做法.http://www.directxtutorial.com/ –

+0

rotY顯然是弧度。但我定義了一個新的浮動,它以sin度爲單位旋轉。但它仍然會像以前一樣失敗。它翻轉周圍45 *,135 *等 –

回答

2

您的旋轉矩陣設置看起來有點怪異:

D3DXMatrixRotationY(&viewRotYMat, rotY); 
D3DXMatrixRotationX(&viewRotXMat, cos(rotY) * rotXZ); 
D3DXMatrixRotationZ(&viewRotZMat, (sin(rotY) * rotXZ) * -1); 

究竟是什麼你想在這裏實現什麼?通常你只需要做幾個軸旋轉,然後再合併它們,你的代碼看起來就是這樣,但是以矩陣組合的雜亂順序,然後用一些明確的三角函數進行補償。有一個很好的機會,你可以做同樣的只有

D3DXMatrixRotationY(&viewRotYMat, rotY); 
D3DXMatrixRotationX(&viewRotXMat, rotXZ); 

否則,你可以使用D3DXMatrixRotationYawPitchRoll在一行中至少結合3角。

至於rotY的值,請記住它預計以弧度測量,所以3-4對應180°。觀察45°可以解釋爲rotXZ貢獻。

+0

謝謝。但不知何故,相機仍然會這樣翻轉0 * 90 * usw。 變化: float deg = rotY *(180/PI); \t D3DXMatrixRotationYawPitchRoll(&viewRotXMat,rotY,sin(deg)* rotXZ,(cos(deg)* rotXZ)* -1); 我評論了rotationxyz的設置。 –

+0

正如我所說,你有這個奇怪的三角組合,這可能會導致萬向節鎖和所有類型的翻轉,對於POV相機請嘗試使用只有2個角度沒有三角調用 – Ap31

+0

這樣的功能將是完美的,但我找不到一個。你知道這個名字嗎? –