2014-08-27 123 views
2

我的一些舊代碼已經結束了一堆令人討厭的黑客,以使物體「正確地」工作,就移動物體和攝像機而言,比如不得不採取「std :: sin( -yaw)「,而不是」std :: sin(yaw)「,當執行在線其他地方發現的等式時,通常只是在許多情況下將所有事情都混淆爲蹤跡和錯誤。D3D11座標系

  1. 與D3D11和DirectXMath東西(所以左手座標和行大?)工作,究竟是預期例如座標系假設相機位於原點並沿着圖像中的黃色矢量觀看而沒有旋轉,標籤是否正確?

    enter image description here

    然後考慮到,並且通過所述的照相機(X,Y,Z)和間距(y軸鼠標/控制),偏航(x軸鼠標/控制),並且假設有是不是我應該這樣做的其他方式...

  2. 什麼是正確的函數來獲得視圖矩陣(目前im乘以翻譯和2旋轉矩陣,乘以投影,然後任何世界矩陣for所討論的對象,並將結果轉換爲單個着色器常量)。

  3. 什麼是獲取相機向前看的矢量的方程(將電流乘以(0,0,1)矢量乘以2)的矩陣。

  4. ...和「向上」和「向右」向量(因爲即使不使用lookat矩陣視圖函數,似乎截錐體剔除需要知道這些)。目前再乘以2的矩陣。
  5. 從方向矢量(例如,對於具有單獨的俯仰/偏航關節的轉塔)計算正確的俯仰和偏航標量/分量。

編輯:代碼示例:

//Moving a floating object with only yaw forwards (moveX,moveY,moveZ). 
//Negative yaw seems wrong? 
auto c = std::cosf(-yaw); 
auto s = std::sinf(-yaw); 
pos.x += moveX * c - moveZ * s; 
pos.y += moveY; 
pos.z += moveX * s + moveZ * c; 

//Gets the vector the camera is looking along 
//This time yaw is positive, but pitch is negative? 
float c = std::cos(-pitch); 
Vector3F facing(
    c * std::sinf(yaw), 
    std::sinf(-pitch), 
    c * std::cosf(yaw)); 

//Creating the view transform matrix, everything is negative 
XMMATRIX xmviewrot; 
xmviewrot = XMMatrixRotationY(-yaw); 
xmviewrot*= XMMatrixRotationX(-pitch); 
XMMATRIX xmview; 
xmview = XMMatrixTranslation(-x, -y, -z); 
xmview *= xmviewrot; 
XMStoreFloat4x4A(&view, xmview); 

//Other vectors needed for frustum culling 
XMVECTOR xmup = XMVector3Transform(XMLoadFloat4A(&UP), xmview); 
XMVECTOR xmright = XMVector3Transform(XMLoadFloat4A(&RIGHT), xmview); 

//Matrix for stuff that is already in world space (e.g. terrain) 
XMMATRIX xmviewProj = xmview * xmproj; 
//Apparently needs transposing before use on the GPU... 
XMStoreFloat4x4A(&constants.transform, XMMatrixTranspose(xmviewProj)); 

//In the shaders 
output.pos = mul(input.pos, transform); 

//vertex positions for an upwards facing square with triangle strip 
v0 = (x1, y, z1); 
v1 = (x1, y, z2); 
v2 = (x2, y, z2); 
v3 = (x2, y, z1); 

所以,在我看來,香港專業教育學院做了一些根本性的錯誤這裏需要在不同的地方-yaw和+偏航,-pitch和+瀝青?而其中一些功能,我最終做了跟蹤和錯誤,以獲得正確的,在線樣本沒有使用負面。

回答

2

Direct3D 11沒有預期的座標系,你可以使用任何你想要的。從Getting Started with Direct3D 11查Walbourn博客條目:

數學:由於Direct3D的11不具有「固定功能」圖形 管線D3D9中,圖形數學約定的選擇 (左撇子與右雙手,主要與列主要矩陣, 等)完全取決於開發者。 DirectXMath可用於創建Direct3D樣式的「左手座標」轉換,如 以及使用 行主矩陣約定的OpenGL樣式「右手座標」轉換,該矩陣約定可以直接與行主要使用 着色器或轉置爲使用列主着色器。

您的着色器確定他們期望的座標系。最終他們必須提供頂點到均質裁剪空間光柵化階段,這Direct3D 11 defines爲:

頂點(X,Y,Z,W),進入光柵化階段被假定爲是 均質裁剪空間。在這個座標空間中,X軸向右指向 ,Y指向上並且Z指向相機。

因此,對其他問題的回答取決於您爲項目選擇的座標系。 DirectXMath庫有許多函數可以爲你計算適當的矩陣。較早的D3DX庫文檔顯示了用於計算這些矩陣的數學運算。

您的其他問題不是很清楚,但他們似乎不瞭解如何使用矩陣來轉換頂點。您可能需要查看old Direct3D 9 documentation,其中描述了固定功能管道中如何使用頂點以及如何使用頂點,並對這些主題進行了很好的介紹。

+0

好吧,但是必須有少量的標準方法,不得不反轉角度(例如,將音高/偏航轉換爲方向矢量),這對我來說似乎是錯誤的? – 2014-08-27 15:09:51

+0

而在D3D9中,我從來不需要這個轉置,但D3D11的例子似乎使用它,並且我不能在沒有它的情況下以預期的方式讓事情工作?另外,大量的樣本似乎花費了大量的精力來使用XMMatrixLookAtLH進行翻譯和2次旋轉(第一人稱凸輪),那真的是這樣嗎? – 2014-08-27 15:11:56

+0

如果您的模型假設您的代碼使用的座標系不同,則您必須取消某些值才能將其轉換爲正確的座標系。但是由於你顯然不知道你的代碼使用了什麼座標系,也許你沒有使用一致的座標系。至於樣本似乎在做的大量工作,可能只是他們試圖單獨展示轉換。它不會影響性能,除非它們在着色器中單獨應用。 – 2014-08-27 15:29:53