我的一些舊代碼已經結束了一堆令人討厭的黑客,以使物體「正確地」工作,就移動物體和攝像機而言,比如不得不採取「std :: sin( -yaw)「,而不是」std :: sin(yaw)「,當執行在線其他地方發現的等式時,通常只是在許多情況下將所有事情都混淆爲蹤跡和錯誤。D3D11座標系
與D3D11和DirectXMath東西(所以左手座標和行大?)工作,究竟是預期例如座標系假設相機位於原點並沿着圖像中的黃色矢量觀看而沒有旋轉,標籤是否正確?
然後考慮到,並且通過所述的照相機(X,Y,Z)和間距(y軸鼠標/控制),偏航(x軸鼠標/控制),並且假設有是不是我應該這樣做的其他方式...
什麼是正確的函數來獲得視圖矩陣(目前im乘以翻譯和2旋轉矩陣,乘以投影,然後任何世界矩陣for所討論的對象,並將結果轉換爲單個着色器常量)。
什麼是獲取相機向前看的矢量的方程(將電流乘以(0,0,1)矢量乘以2)的矩陣。
- ...和「向上」和「向右」向量(因爲即使不使用lookat矩陣視圖函數,似乎截錐體剔除需要知道這些)。目前再乘以2的矩陣。
- 從方向矢量(例如,對於具有單獨的俯仰/偏航關節的轉塔)計算正確的俯仰和偏航標量/分量。
編輯:代碼示例:
//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和+瀝青?而其中一些功能,我最終做了跟蹤和錯誤,以獲得正確的,在線樣本沒有使用負面。
好吧,但是必須有少量的標準方法,不得不反轉角度(例如,將音高/偏航轉換爲方向矢量),這對我來說似乎是錯誤的? – 2014-08-27 15:09:51
而在D3D9中,我從來不需要這個轉置,但D3D11的例子似乎使用它,並且我不能在沒有它的情況下以預期的方式讓事情工作?另外,大量的樣本似乎花費了大量的精力來使用XMMatrixLookAtLH進行翻譯和2次旋轉(第一人稱凸輪),那真的是這樣嗎? – 2014-08-27 15:11:56
如果您的模型假設您的代碼使用的座標系不同,則您必須取消某些值才能將其轉換爲正確的座標系。但是由於你顯然不知道你的代碼使用了什麼座標系,也許你沒有使用一致的座標系。至於樣本似乎在做的大量工作,可能只是他們試圖單獨展示轉換。它不會影響性能,除非它們在着色器中單獨應用。 – 2014-08-27 15:29:53