首先,我使用世界转换渲染单位正方形,将其转换为屏幕中间。到目前为止一切正常。这是结果图片。
然而,当我应用视图转换时,我开始遇到一些问题。这是我创建视图矩阵的代码。
XMFLOAT4X4 viewMatrix;
XMVECTOR eye = XMLoadFloat3(&m_Eye);
XMVECTOR focus = XMLoadFloat3(&m_LookAt);
XMVECTOR up = XMLoadFloat3(&m_Up);
XMStoreFloat4x4(&viewMatrix, XMMatrixLookAtLH(eye, eye + focus, up));
因此,我将问题跟踪到以下代码中 lookAt 向量的创建。
float x = cos(XMConvertToRadians(m_Yaw)) * cos(XMConvertToRadians(m_Pitch));
float y = sin(XMConvertToRadians(m_Pitch));
float z = sin(XMConvertToRadians(m_Yaw)) * cos(XMConvertToRadians(m_Pitch));
XMVECTOR m_LookAt = -XMVector3Normalize(XMVectorSet(x, y, z, 0.0f));
应用以下参数......
m_Yaw = -90.0f
m_Pitch = 0.0f
m_Eye = (0.0f, 0.0f, -5.0f)
...在
中生成(-4.37113883e-008, 0.0, -1.0)
lookAt 向量
{ 1.0, 0.0, 4.37113883e-008, 0.0}
{ 0.0, 1.0, 0.0, 0.0}
{-4.37113883e-008, 0.0, 1.0, 0.0}
{-2.18556949e-007, 0.0, 5.0, 1.0}
查看矩阵和下图。
因此,我尝试使用相同的 m_Yaw 和 m_Pitch 参数创建硬编码的 lookAt 向量。
x = cos(-90) * cos(0) = 0 * 1 = 0
y = sin(0) = 0
z = sin(-90) * cos(0) = -1 * 1 = -1
唯一的区别是 x 值导致0
而不是-4.37113883e-008
,我认为这是由于转换为弧度。仅此而且#34;修复"问题和结果图像与第一个图像相同。
但是,因为我无法修复这些值。我创建了一个小常量const float kEpsilon = 0.0001f;
,并将 lookAt 向量中任何小于kEpsilon
且大于-kEpsilon
的组件限制为零。
XMVECTOR lookAt = XMVectorSet(
x < kEpsilon && x > -kEpsilon ? 0.0f : x,
y < kEpsilon && y > -kEpsilon ? 0.0f : y,
z < kEpsilon && z > -kEpsilon ? 0.0f : z,
0.0f
);
但这感觉就像一个廉价的解决方案,我仍然不明白为什么这个错误发生了。这是由于DirectX的任何特殊性,我可能不知道?或者错误出现在我的代码中?
其他信息: