我正在学习DirectX(使用SharpDX,仅使用C# / hlsl编程),并尝试构建自己的相机类。它应该可以旋转,允许前后移动和“侧向”移动(通常映射为A和D的第一人称移动,加上我的情况下的上下移动)。为了更容易进行故障排除,在我的情况下模型空间和世界空间是相同的,透视投影尚未实现,相机应该朝着正Z轴(进入屏幕)看。我的故障修复模型是一个简单的四边形,宽度和高度均为1.f,z = 0,并位于屏幕中心。
为了更易于使用,我发现DirectX的
我的(顶点)着色器使用与此矩阵的简单乘法:
LookAt-Matrix计算如下:
导致以下图片:
![Camera at (0, 0, -1) looking at (0, 0, 0.5f](https://istack.dev59.com/ouz22.webp)
现在我想将相机向右移动,在这种情况下,通过为其X坐标添加1.f来实现。 我的预期结果是与之前相同的四边形,稍微向左移动了一点。
我构建了一个新的LookAt-matrix,通过相同的向量移动眼睛坐标和目标坐标:
导致以下结果:
为了更易于使用,我发现DirectX的
Matrix.LookAtLH()
,并使用它构建我的矩阵,以便从世界坐标系转换到视图坐标系,基于我的相机在世界坐标系中的位置,一个上向量(目前 - 没有旋转 - 总是正Y轴),以及世界坐标系中的目标点。我的(顶点)着色器使用与此矩阵的简单乘法:
output.position = mul(position, worldToView);
LookAt-Matrix计算如下:
Matrix.LookAtLH(vec3(0, 0, -1), vec3(0, 0, 0.5f), vec3(0, 1, 0))
导致以下图片:
![Camera at (0, 0, -1) looking at (0, 0, 0.5f](https://istack.dev59.com/ouz22.webp)
现在我想将相机向右移动,在这种情况下,通过为其X坐标添加1.f来实现。 我的预期结果是与之前相同的四边形,稍微向左移动了一点。
我构建了一个新的LookAt-matrix,通过相同的向量移动眼睛坐标和目标坐标:
Matrix.LookAtLH(vec3(1, 0, -1), vec3(1, 0, 0.5f), vec3(0, 1, 0))
导致以下结果:
![Camera at (1, 0, -1) lookint at (1, 0, 0.5f](https://istack.dev59.com/zDXt2.webp)
随着我移动相机,情况变得更加极端,但屏幕中心仍然保持四边形的中心。这是否与我对Matrix.LookAtLH
的潜在误解有关?