XMVector3Project意外行为

时间:2014-01-17 14:26:49

标签: directx-11

我正试图找出屏幕空间变换的世界空间。据我所知,在D3D11中,函数XMVector3Project应该处理这个问题。但是,当我像这样使用它时:

XMVECTOR eye = XMVectorSet(10000, 0.0f, 1.5f, 0.0f);
XMVECTOR at = XMVectorSet(10000, 0.0f, 0.0f, 0.0f);
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);



auto viewMatrix = XMMatrixTranspose(XMMatrixLookAtRH(eye2, at2, up2));
XMVECTOR vec = XMVector3Project(XMVectorSet(0.0, 0.0, 0.0, 1.0f), 0, 0, 480, 800, 0, 1, XMMatrixIdentity(), viewMatrix, XMMatrixIdentity());

它返回点(240,480)。我不明白这是怎么可能的,因为即使没有Projection矩阵,当我设置视图矩阵来显示点(1000,1000,x)时,Point(0,0,0)根本不应该在屏幕上显示。 这只是我的观点,可能是错的,所以我想知道这个预期的行为是什么?

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是你使用XMMatrixTranspose。假设你有左手或右手的行主矩阵,DirectXMath(又名XNAMath版本3又名xboxmath)函数都是写的。通过将XMMatrixTranspose应用于lookat矩阵,您将使其成为列专业。虽然这通常是在将其设置为常量缓冲区以供HLSL使用之前的最后一步(有关详细信息,请参阅MSDN DirectXMath Programmer's GuideMSDN HLSL docs),但使用此方式的结果没有意义与XMVector3Project

顺便说一下,我假设您在这里使用XMVectorSet仅用于测试,但编码常量XMVECTOR的有效方法是使用XMVECTORF32。

static const XMVECTORF32 eye = { 10000, 0.0f, 1.5f, 0.0f };
static const XMVECTORF32 at = { 10000, 0.0f, 0.0f, 0.0f };
static const XMVECTORF32 up = { 1.0f, 0.0f, 0.0f, 0.0f };